You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// requestAnimationFrame Demoleti=0letrender=(){if(i>=frame.length) i =0letcurrentFrame=frame[i]drawFrame(currentFrame)i++requestAnimationFrame(render)}requestAnimationFrame(render)
动画相关概念
前端动画分类
从控制角度分,前端动画分为两种:
从实现方式上分:
JS动画
JS动画的原理是通过
setTimeout
setInterval
或requestAnimationFrame
方法绘制动画帧(render),从而动态地改变网页中图形的显示属性(如DOM样式,canvas位图数据,SVG对象属性等),进而达到动画的目的。多数情况下,应 首先选用
requestAnimationFrame
方法(RAF),因为RAF的原理是会在浏览器下一次重绘之前更新动画,即它的刷新频率和浏览器自身的刷新频率保持一致(一般为60Hz),从而确保了性能。另外RAF在浏览器切入后台时会暂停执行,也可以提升性能和电池寿命。(来自MDN)下面代码是一个用js + canvas 实现帧动画的一个例子,可以帮你更好的理解js动画原理:
CSS3 动画
css动画的原理是通过
transition
属性或@keyframes/animation
定义元素在动画中的关键帧,以实现渐变式的过渡。css动画有以下特点:
优点
缺点
前端动画卡顿的原因
丢帧:浏览器绘制某一帧的时长超过了平均时长(帧超时),为了完成整个动画不得不丢弃后面的动画帧,造成丢帧现象。画面就出现了所谓的闪烁,卡顿。
导致帧超时的原因有很多,最主要的原因是layout、paint带来的性能开销:
无论是JS动画,还是CSS动画,在操作元素的某些样式(如height,width,margin,padding),会触发layout和paint,这样每一帧就会产生巨大的性能开销,相反,使用transform属性则不会,具体哪些属性能触发可以参考CSS Trigers,总之,我们应尽可能使用影响小的属性(transform,opacity)来做动画。
如果采用的是基于图片切换的帧动画技术,请确保所有图片预加载完毕,且用cacheImgs数组缓存所有图片资源到内存中,否则也会出现卡顿现象。
如何选择最适合的动画技术
随着现代web技术的发展,无论是CSS动画还是JS动画,性能瓶颈越来越小,我们只要选择适合业务需要的技术,一样能创作出丝滑般顺畅的web动画。如果实在无法选择,看下图(仅供参考):
一般来说,动画性能优劣如下所示:
JS+Canvas > CSS + DOM > JS + DOM
这里是一个动画技术比较的Codepen Demo
动画缓动函数
缓动函数的实现可参考Tween.js
前端绘图技术 VS 前端动画技术
前端绘图技术通常指以HTML5为代表的(canvas,svg,webgl等)2D、3D图形绘制技术。它和前端动画之间没有包含与被包含的关系,更不能将它们 混为一谈,只有两者的有机结合才能创建出炫酷的UI界面。
参考链接
深入浏览器理解CSS animations 和 transitions的性能问题
前端性能优化之更平滑的动画
CSS vs JS动画:谁更快?
一篇文章说清浏览器解析和CSS(GPU)动画优化
The text was updated successfully, but these errors were encountered: