js动画怎么可能已经比css实现的变换效果还快了?并且,adobe和谷歌怎么可能开发出可以和原生应用性能比肩的富媒体移动网站?
这篇文章点对点的对比分析了为什么基于javascript的dom动画库,如Velocity.js和GSAP,拥有比基于jQuery和css的动画更好的表现?
jQuery
实例(Implementation Examples)
var currentTop,
currentLeft;
/* With layout thrashing. */
currentTop = element.style.top; /* QUERY */
element.style.top = currentTop + 1; /* UPDATE */
currentLeft = element.style.left; /* QUERY */
element.style.left = currentLeft + 1; /* UPDATE */
/* Without layout thrashing. */
currentTop = element.style.top; /* QUERY */
currentLeft = element.style.left; /* QUERY */
element.style.top = currentTop + 1; /* UPDATE */
element.style.left = currentLeft + 1; /* UPDATE */
更新后的请求会强制浏览器重新计算页面的样式数据(为了把更新的影响考虑进去)。这给本来就只有16毫秒极小间隔的动画增加了显著的瓶颈。
var startingTop = 0;
/* setInterval: Runs every 16ms to achieve 60fps (1000ms/60 ~= 16ms). */
setInterval(function() {
/* Since this ticks 60 times a second, we divide the top property's increment of 1 unit per 1 second by 60. */
element.style.top = (startingTop += 1/60);
}, 16);
/* requestAnimationFrame: Attempts to run at 60fps based on whether the browser is in an optimal state. */
function tick () {
element.style.top = (startingTop += 1/60);
}
window.requestAnimationFrame(tick);
通过RAF你只需要简单的改变一下你的代码就能最大限度的提升动画性能。
CSS Transitions
JavaScript 动画
是的,所以在性能方面JavaScript更优秀。但确切的JavaScript能够快多少?好吧——开始——快到可以建立一个通常仅可以用WebGL实现的极致的3D animation demo,快到可以建立一个通常仅能用Flash来做的multimedia teaser。快到可以做一个通常只能用canvas实现的虚拟世界。
想直接比较高性能动画库,包括Transit(用CSS Transitions构建),前往Velocity的文档VelocityJS.org.
问题依然存在:JavaScript具体如何实现高性能的?下面是一个短的基于JavaScript动画能够做的优化清单:
1.同步DOM——tween stack整个动画链以最大化的减少布局废弃。
2.通过请求链获取属性值以最少化DOM请求(这是最损害动画性能的一点)。
3.通过兄妹元素获取同一个请求中的独立转换比例 (e.g. px to %, em, etc.)。
4.当样式更新不可见时跳过样式更新。