前言:动画从用途上能够分为两种,一种是展现型的动画,相似于一张GIF图,或者一段视频,另外一种就是交互性的动画。这两种都有具体的应用场景,好比在咱们信息流业务中,从下拉页面到进入活动页这个过程当中,咱们彻底能够用一个展现型的入场动画代替本来可能只有一个小圆圈的的loading页。javascript
展现型动画: css
交互性动画(能够看到屏幕那个小手势): html
展现型动画在实际使用的场景中,实现的方法不少,好比用gif图
,canvas
,css3
动画等,可是最终输出的结果是不带有交互的,也就是从动画起始状态到结束状态一鼓作气,这个过程用户能够感知,可是没法参与。对于交互性动画而言,咱们能够在动画播放的某个时间节点触发相应的操做,进而让用户参与到其中,最多见的例子好比红包雨,或者是咱们世界杯踢足球的动画,不只仅能提高用户的体验,还能提高咱们的产品的多元性。然而交互性动画常常面临的一个问题就是,经过原生代码实现交互动画是很复杂的,同时性能和兼容性是不得不认真考虑的问题,比较好的解决方案仍是寻求相关的框架。前端
伴随着CSS3的发展,利用CSS3的transform
和动画的@keyframes
就能够完成不少酷炫的动画,可是CSS3的动画应用场景仅仅是展现型动画,只要动画开始,咱们就没法控制动画的状态,并且对于复杂的动画,CSS3就显得很无力了。对于JavaScript驱动的动画,在必定程度上就能够弥补这些缺点,好比anime.js
增长的timeline
的概念,经过将各部分动画链式执行,从而完成更为复杂的动画,同时动画执行的各个阶段提供的回调函数也能让咱们更方便的控制动画执行的状态,为交互提供了可能。对于canvas
,在 canvas
上绘制的图形自身不支持 DOM 事件
,只有canvas
标签自身支持 DOM 事件监听。所以须要对 canvas 容器
的事件进行处理,实现相对应事件的监听及处理。WebGL
能够为canvas
提供硬件GPU
加速渲染,借助使用系统GPU能够在移动端中更流畅的展现动画.java
CSS3的animation
,兼容性以下:
canvas
兼容性以下:
WebGL
兼容性以下:
能够看到,CSS3的animation和canvas支持性比较好,只有WebGL在Android 4.4 Browser 彻底不支持,后续咱们会提到PixiJs库,能够采用WebGL渲染,也能够优雅降级采用canvas渲染css3
适用场景:主要仍是展现型动画git
简介:经过
AE 上的 Bodymovin 插件
将 AE 中制做好的动画导出成一个 json 文件,经过Lottie
对JSON
进行解析,最后以SVG/canvas/html
的方式渲染动画。github
官方文档:airbnb.io/lottie/ codepen仓库:codepen.io/collection/…web
优势:json
JSON
,最后经过lottie
渲染为canvas/svg/html格式
After Effects
中建立的,使用Bodymovin
导出,而且本机渲染无需额外的工程工做。缺点:
Bodymovin
插件待完善,仍然有部分 AE 效果没法成功导出Lottie
对 json
文件的支持待完善,目前有部分能成功导出成 json
文件的效果在移动端上没法很好的展示适用场景: 强展现+弱交互性动画
简介:Anime.js是一个轻量级的js驱动的动画库,主要的功能有 - 支持keyframes,链接多个动画 - 支持Timeline,为实现更为复杂的动画提供了可能 - 支持动画状态的控制playback control,播放,暂停,从新启动,搜索动画或时间线。 - 支持动画状态的callback,在动画开始,执行中,结束时提供回调函数 - 支持svg动画 - 能够自定义贝塞尔曲线 - 任何包含数值的DOM属性均可以设置动画
GitHub:github.com/juliangarni… codepen仓库:codepen.io/collection/… 文档演示:animejs.com/documentati…
功能介绍:
必定程度上,anime.js
也是一个CSS3动画库
,适用全部的CSS属性
,而且实现的@keyframes
能更方便的实现帧动画,替代CSS3复杂的定义方式。使用对象数组的形式定义每一帧
戳我:keyframes实例
anime({
targets: 'div',
translateX: [
{ value: 250, duration: 1000, delay: 500, elasticity: 0 }, //第一帧
{ value: 0, duration: 1000, delay: 500, elasticity: 0 } //第二帧
]
}) //这个例子实现了目标元素在两帧中实现水平位移
复制代码
提供的Timeline
能实现更为复杂的动画效果,经过这个Timeline
,咱们能够维护不一样的动画之间的关系,进而经过多个不一样的动画组成一个更为复杂的动画。 戳我:Timeline实例
var myTimeline = anime.timeline();
//经过.add()方法添加动画
myTimeline
.add({
targets: '.square',
translateX: 250
})
.add({
targets: '.circle',
translateX: 250
})
.add({
targets: '.triangle',
translateX: 250
});
复制代码
动画播放的控制,常见的有暂停,重播,继续,动画状态的跟踪,自动播放,循环次数,抖动效果 戳我:playback controls实例
为动画提供了回调函数,在动画或时间线完成的开始,期间或之时执行回调函数。 戳我:callback实例
var myAnimation = anime({
targets: '#begin .el',
translateX: 250,
delay: 1000,
begin: function(anim) { // callback
console.log(anim.began); // true after 1000ms
}
});
复制代码
支持promise
,动画结束后,调用anime.finishe
d会返回一个promise对象
。 戳我:promise实例
支持svg
绘制路径,目前不支持canvas绘制
戳我:SVG实例
对于input
这样带有数值的元素标签,也能够经过anime实例
来设置动画 戳我:DOM ATTRIBUTES实例
anime({
targets: input,
value: 1000, // Animate the input value to 1000
round: 1 // Remove decimals by rounding the value
});
复制代码
优势:
anime.js
不只实现了CSS3动画
的深度封装,更多的是经过js驱动来实现操做动画的状态,timeline
实现了对于多个分支动画的管理,对于实现更为复杂的动画提供了可能anime.js
提供的playback controls
和callback
,同时对于promise
的支持,让咱们对于动画的简单交互有了操做的空间canvas
,可是支持svg绘制路径
,我对svg还不是很了解,待以后深刻学习后,在作一个补充。Android 4
以上所有支持
缺点与不足:
anime.js
作展现型动画是能够胜任的,在作交互性动画方面仍是须要看场景,它更多适合作一些小型的交互动画,相似于经过触摸屏幕踢足球这种强交互的,anime.js
就不是颇有优点了。适用场景:交互性动画,动画小游戏
简介:PixiJS是一个2D 渲染引擎, Pixi 主要负责渲染画面。能够建立丰富的交互式图形,动画和游戏,而无需深刻了解WebGL API或处理浏览器和设备兼容性的问题。与此同时,PixiJS具备完整的WebGL支持,若是须要,能够无缝地回退到HTML5的canvas。PixiJs默认使用WebGL渲染,也能够经过声明指定canvas渲染,WebGL在移动端Android 4.4 browser并不支持,不过可使用canvas优雅降级。
Github: github.com/pixijs/pixi… 官方文档: pixijs.download/release/doc… 官方网站:www.pixijs.com/ Examples:pixijs.io/examples/#/…
特性(摘自官方DOCS):
WebGL渲染
canvas 渲染
(官方称PixiJS在canvas渲染方面如今是最快的)API
Pixi
使用和 Canvas Drawing
几乎一致的 api,但不一样于Canvas
的绘画 api,使用 Pixi 绘制的图形是经过WebGL
在 GPU
上渲染优点:
WebGL
来调用GPU渲染动画,这样极大的提高了性能WebGL API
或者是浏览器兼容性
(由于下面这条缘由)canvas
回退,当前设备不支持WebGL
时,PixiJs
会使用canvas渲染
动画DOCS
,比较活跃的社区,有利于深刻的学习。不过我感受PixiJs学习成本相对来讲仍是很高的缺点:
Android 4.4
是不支持的,只能使用canvas进行降级性能:
Android4.4
以上的手机,除了代码层面形成的性能不足,经过WebGL调用GPU渲染,性能仍是有保障的。然而对于Android4.4只能使用canvas渲染,性能仍是要看动画的复杂度,以及代码的优化针对不一样的动画需求,我总结了三种不一样场景下的动画库。对于展现性的动画,咱们彻底可使用第一种方案,让设计同窗提供动画,咱们利用动画导出的JSON
,将动画还原为svg/canvas/html
。若是场景是交互型或者须要作一个小游戏,能够采用第三种方案PixiJs
,经过WebGL
来渲染,利用硬件资源,极大的提高性能,在兼容性方面,对于不支持WebGL
的浏览器,可使用canvas渲染
来平稳回退
。最后一种场景就是弱交互强展现,这种场景每每就是用户点击一下暂停执行相应操做,待操做完成继续播放动画,交互方面比较偏弱
,这种场景下能够采用第二种方案 Anime.js
,Anime.js不只仅支持全部的css 属性,并且能够经过Timeline,callback, playback controls来控制动画执行的各个状态。并且兼容性知足咱们的需求,在性能方面,只要不过多的形成页面回流
,多使用transform操做复合层,性能仍是能够的(待多多尝试,就我看的几个例子性能仍是不错的)。最后,从需求角度分析以后,从学习成本作个简单的小排名:PixiJs > Anime.js > lottie