【发布时间】:2017-03-09 17:52:07
【问题描述】:
我在 MDN 上遇到过这个使用 requestAnimationFrame 而不是 setTimeout 的示例:
// Reference: http://www.html5rocks.com/en/tutorials/speed/animations/
var last_known_scroll_position = 0;
var ticking = false;
function doSomething(scroll_pos) {
// do something with the scroll position
}
window.addEventListener('scroll', function(e) {
last_known_scroll_position = window.scrollY;
if (!ticking) {
window.requestAnimationFrame(function() {
doSomething(last_known_scroll_position);
ticking = false;
});
}
ticking = true;
});
这让我想到我们是否可以使用requestAnimationFrame 而不是setTimeout(fn, 0),这是否有任何优势?我用谷歌搜索过,似乎所有的比较都是在动画的上下文中完成的,但是不相关的功能呢——比如去抖动/节流,或者只是如果你需要在重绘后运行代码?
【问题讨论】:
-
SetTimeout 将事件注册到必要的滴答声。因此,如果您之前有一个需要 5 个滴答的大型任务,您的函数将稍后执行。如果您在每个刻度上运行相同的功能,这可能会产生一些问题。 requestAnimationFrame 将根据当前时间跳过所有延迟的任务和进程。所以在这种情况下,只有最后一个任务会运行,您可以查看以下帖子:stackoverflow.com/questions/13935262/…
-
RequestAnimationFrame 的优势在于它被设计为在您的监视器下一次绘制同步期间触发。 IOW 它旨在防止闪烁/撕裂。因为这个 setTimeout 在 HTML5 中的优势是它可以每 4 毫秒触发一次,所以速度更快。但我相信最快的是 Postmessage。
标签: javascript requestanimationframe