动画笔记

2016-08-31  本文已影响44人  debt

基础

一般显示器1秒刷新60次,1000/60=16ms,所以小于16毫秒的动画显示器也无法刷新。代码执行也需要时间,在一个时间间隔内未完成动画,如果代码复杂,执行效率不高,则会卡顿。如果时间间隔过长会出现不流畅。

JQUERY

  • jQuery 不能避免 layout thrashing (有人喜欢将其翻译为“布局颠簸”,会导致多余relayout/reflow),因为它的代码不仅仅用于动画,它还用于很多其他场景。

transition

CSS transition 的动画逻辑是由浏览器来执行,所以它的性能能够比 jQuery 动画好。它的优势体现在:

div { transform: translate3d(0, 0, 0);}

在移动端,我们经常用到如上的CSS代码实现所谓的“硬件加速”,来提高动画的流畅度。在部分情况下,我们的CSS动画的确变的更加流畅。但这个方法并不是万能药。当页面中加速的元素越来越多时,网页的性能便会下降。

面绘制的过程分为三个部分:layout、paint和合成。layout负责计算DOM元素的布局关系,paint负责将DOM元素绘制成位图,合成则负责将位图发送给GPU绘制到屏幕上(如果有transform、opacity等属性则通知GPU做处理)。

那么所谓的translate3d硬件加速到底做了什么事情呢?在Chrome中当某个DOM元素开启硬件加速之后,浏览器会为此元素单独创建一个“层”。当有单独的层之后,此元素的repaint操作将只需要更新自己,不用影响到别人。你可以将其理解为局部更新。所以开启了硬件加速的动画会变得流畅很多。

CSS属性会触发layout和paint,详见CSS triggers。我们需要尽量使用transform、opacity这类不触发layout和paint操作的CSS属性。或许你已经在不知不觉中使用了这种优化,比如使用transform:translate(10px, 10px);替代position:absolute; top:10px; left:10px;。

两个的比较 transition VS jquery

比较硬件加速

W3C硬件加速

携程 硬件加速

img VS background

上一篇下一篇

猜你喜欢

热点阅读