以前分享了一些本身平时整理的能够通用的SVG动画的教程基本都是最基础的变化,旋转也好,缩放也好,沿路径运动也好,只须要定义CSS3的一些动画属性值或者SVG的动画属性标签,固然,运用得当的话,依靠这些也能作出不少超炫的效果,只要想象力足够,idear赛过方法。
本质上来说,各类动画原理都是相通的,包括AE,包括Macromedia Flash、包括ps自带的时间轴动画,包括SVG的动画属性和CSS3的动画属性,都须要定义关键帧,不过补间动画一个是软件生成,一个是浏览器来执行而已。以前作过flash动画的UI设计师们必定知道,动画最难的部分其中之一是变形动画,形状A→形状B无规律的变形才是最难掌握的部分。今天来分享一份全网独一无二(啊哈哈,有种要上天的感受)的SVG变形动画教程,让UI设计师华丽丽变身动画设计师,关键是,看完这篇文章后,你能够实现任意形状之间的变形动画,是的,你没有看错,任意!独家心得,高能预警。个人全部SVG动画重点部分,一直都是从UI设计师最擅长的AI工具入手,和SVG的参数如何相结合,不说了,快上车。
由于实在太长了,后面有进阶教程,因此分上下两个篇章吧。若是没有任何SVG基础的话,建议只看上篇。
先看下面一个动画效果,这是我初学AE时,跟着教程作的,作了多久呢?我记得是一上午/(ㄒoㄒ)/~~,自我辩解一下,不是学习能力差,而是当时那一丢丢的动画基础知识所有忘光光。如今这个动画若是用SVG来作,须要多久,二十分钟吧我猜,固然了,是在代码模板的基础上。javascript
看到这里,熟练使用AE的设计师小伙伴或许不服气了,AE也能够,要SVG这劳什子做甚?来来来,你来告诉我AE生成的动画你来增长些交互,好比鼠标单击控制开始暂停结束?就算改改颜色和尺寸你都要去动源文件,而后从新生成的好吧?
另外补充一下,既然chrome声称要“抛弃”SMIL(不用担忧,一边喊着抛弃,一边继续支持),那咱们之后全部的SVG动画尽可能都用CSS3动画属性来完成,SVG只用来绘图。css
若是用SMIL来实现变形动画,基础代码以下:前端
<svg width="" height="" >
<path> <animate attributeName="d" dur="" values=" ; "/> </path> </svg>复制代码
就是利用<path>
的属性d的变化,value值用分号;隔开,先后分别对应两个形状的路径值。但咱们上面说过,要用CSS3来实现,那代码就变成了下面这种(之后就用这个模板啦):java
<svg height=" " width=" ">
<style> @keyframes deform{ 0% {d:path('');} 100% {d:path(''); } } #animated { animation: deform 2s; } </style>
<path id="animated" />
</svg>复制代码
哇,好简单,好清爽。经过定义一个名为deform的动画,而后设置开始和结束,进行绘制路径命令d:path(' '),单引号里面就是对应的路径的d值;<path>
标签直接调用这个动画就能够了。chrome
有了上面的代码模板了,而后能够进行动画的真正制做了。从最简单的开始,根据最少三点组成一个形状,好比我在AI里面随手画了一个,叫它啥好呢,单峰山吧。数组
<path>
标签的d值复制下来,放到模板里初始值0%对应的d:path(' ')里。
<path>
标签的d值一并贴上,以下:
<path>
的d值写法很不标准,它的原则是负数和负数之间不加逗号
,隔开(狠狠吐槽),因此你看到数值中的那些短线好比0-77,不是区间,而是数字0和数字-77。
仍是从最简单的三角形开始浏览器
<path>
里均可以。但对于这种多边形来讲,SVG对应的标签不是
<path>
,而是
<polygon>
,一样,没有d值而是point。那怎么套用呢?
很简单,point对应值为点的坐标,咱们只须要给第一组值前面加上M,剩下的每组前面加L,最后z结束,就成功实现了point到d的转化。举例说明:
个人三角形1对应的代码以下:ide
<polygon points="148,288 350,134 390,299 "/>复制代码
那我要作的就是改为svg
d:path('M148,188L350,134L390,299z')复制代码
而后调用<path>
标签。
那试一下套用效果如何:工具
这个方法是我推荐的方法,我叫它视觉欺骗,哈哈。由于在AI里,我只要用锚点工具那么轻轻的拖一下,多边形就变身普通形状了。但从视觉上来看,它仍是一个三角形哦。
<path>
而不是
<polygon>
。因此,设计师小伙伴们感到本身的优越感了没?用工具,咱们能够赛过前端呐(某些方面~)。并且利用这个方法,你能够打破多边形与普通形状之间的障碍,想怎么变身就怎么变身。
有了前面的基础,就能够玩点高级的玩意了。
下面这种:
<circle>
,不要紧,用咱们的“做弊手段”。
有了上面这个四个锚点变形的动画,那下面这个理解起来就方便多了。
此次我不想在原有形状上变化,而是想完成这样一次变形,最大的问题出如今锚点数量不一样上,怎么办?聪明的设计师小伙伴必定能够想到,给锚点数量少的形状用钢笔工具添加锚点呗。(什么?颜色太难看?这但是我特地找的日本传统色的藤鼠和水浅葱啊,身为一名不合适的UI我会告诉你我根本不会配色嘛。)
除了改造左侧的图形,咱们还有一个工做,就是右边这盆小花花,花茎(3-4和8-9)是标准垂直直线,导出的d值对应的是L开头的一组数(至关于曲线绘制时没有严格按照开始手柄控制点,结束手柄控制点,结束点来完成)。
看到这里,可能会有设计师提出问题,我怎么知道哪些须要改哪些不须要?并且哪些改过哪些没改过?尤为是有些微调,根本看不出来。好了,你能够按照我下面这种方法来进行校验。
别急,来看动画效果:
(此处还有一个坑,若是设计师发现没有动画效果,不不不,是画面一片空白的时候,只须要把d值里的空格去掉就能够,这是语法问题,没法解释。)
哟哟,位置,颜色过渡什么的都没问题,可是,变形效果太过猛烈……中间那么翻转一会儿是闹哪样?
别急,全部的问题都是出如今d值上,咱们见招拆招。
上图的形状为顺时针路径,下图轻松变身逆时针路径。再看下应用翻转路径后的d值的动画效果。
关于路径反转,你仔细看下代码会说,咦?怎么起点也发生了变化?咱们下篇揭晓如何任意控制起点位置。
提早预告,在下篇里,还将进阶一个图形如何变身两个图形,图形多合一,以及镂空图形的变形动画等。
向前端开发人员求JavaScript代码,由于两个任意图形之间的动画效果若是不去修改图形中的锚点的手柄,只要保证锚点数量一致,是能够经过js来把绘制贝塞尔曲线的S、L直线、V垂直直线、H水平直线、绝对位置大C等等通通转换成相对位置小c,达到一统江湖的目的。由于我js只是渣渣入门,勉强能看懂基础的,写不来。但可提供转换公式,有兴趣的可留言。这样借助js的话,工做就简化到只要“哒哒哒”给锚点数量少的图形任意补充上锚点就能够了。