1、JS动画(setInterval setTimeOut requestAnimationFrame)css
优势:css3
1)过程控制能力强。能够对动画工程进行精准的控制,暂停、取消、开始、终止均可以。浏览器
2)动画效果多、炫酷。有一些效果是CSS动画所不能实现的css3动画
3)兼容性比较高异步
缺点:函数
1)因为JS是经过不断的操做DOM和CSS的属性来实现动画效果的,这须要不断的重排(reflow)和重绘(repaint),很是消耗浏览器的内存。(在PC端有浏览器能够分配的内存比较大,动画的重排(reflow)和重绘(repaint)能够忽略不计,可是在移动端效果很是明显)性能
2)JS动画在主线程中执行,因为主线程中还有其余的JavaScript脚本等须要执行,对主线程进行干扰有可能形成丢帧的问题。优化
3)较CSS动画复杂动画
4)因为JS动画的异步处理致使动画开始执行的时间不能准确控制spa
2、CSS动画(transition transform animation)
优势:
1)浏览器能够进行优化
如何优化:
① 浏览器使用与requestAnimationFrame 相似的机制,比起比起setTimeout,setInterval设置动画的优势是
*requestAnimationFrame 会把一帧中的全部DOM操做集中起来,在一次重绘或者回流中就完成。而且刷新频率与浏览器相同
*在隐藏或不可见的元素中requestAnimationFrame不会进行重绘或者回流,因此会使用更少的CPU GPU和内存使用量
② 部分属性可以启动3D加速和GPU硬件加速(经过GPU来提升动画性能),例如使用transform的translateZ进行3D变换时
2)代码简单,性能调优方向固定。
3)对于帧速表现很差的低版本浏览器,CSS3能够作到天然降级,而JS则须要撰写额外代码
缺点:
1)对动画工程没法控制,只能在特定场合暂停取消,不能添加回调函数
2)兼容性很差
3、性能问题
一、CSS 2D矩阵动画效率高于js利用margin和left,top模拟的矩阵动画(CSS3的2D动画是指是2D矩阵Transform变化,好比缩放\变形\x轴\y轴(js固然是不能作变形动画的))
例如,使用CSS3的transform作translateXY动画比js中的position left,position right快了近700mm!并且也更流畅
二、CSS3其它常规动画属性的效率均低于js模拟的动画(常规动画属性在这里是指:height,width,opacity,border-width,color…..)
4、
渲染线程分为main thread(主线程)和compositor thread(合成器线程)。
若是CSS动画只是改变transform
和opacity
,这时整个CSS动画得以在compositor thread完成(而JS动画则会在main thread执行,而后触发compositor进行下一步操做)
在JS执行一些昂贵的任务时,main thread繁忙,CSS动画因为使用了compositor thread能够保持流畅,
在主线程中,维护了一棵Layer树(LayerTreeHost),管理了TiledLayer,在compositor thread,维护了一样一颗LayerTreeHostImpl,管理了LayerImpl,这两棵树的内容是拷贝关系。所以能够彼此不干扰,当Javascript在main thread操做LayerTreeHost的同时,compositor thread能够用LayerTreeHostImpl作渲染。当Javascript繁忙致使主线程卡住时,合成到屏幕的过程也是流畅的。
为了实现防假死,鼠标键盘消息会被首先分发到compositor thread,而后再到main thread。这样,当main thread繁忙时,compositor thread仍是可以响应一部分消息,例如,鼠标滚动时,加入main thread繁忙,compositor thread也会处理滚动消息,滚动已经被提交的页面部分(未被提交的部分将被刷白)。
只有以下属性的修改才符合“仅触发Composite,不触发layout或paint”:
因此只有用上了3D加速或修改opacity时,css3动画的优点才会体现出来。
(2)代码相对简单,性能调优方向固定
(3)对于帧速表现很差的低版本浏览器,CSS3能够作到天然降级,而JS则须要撰写额外代码
总结:因此简单的不须要对中间过程进行过多控制的使用CSS动画;效果交互复杂的使用JS动画