更新:类似的问题已有非常好的答案,展示了如何以有用的方式使用requestAnimationFrame处理滚动:scroll events: requestAnimationFrame VS requestIdleCallback VS passive event listeners
假设我想通过滚动来触发网站上的一些昂贵的操作。例如,我在我的jsfiddle中使用视差效果。
现在我不停地看到不能直接绑定事件,有时会跟随着更好的代码片段。以下是一些例子:
他们的意思基本上是不要这样做:
// Bad guy 1
$(window).scroll( function() {
animate(ex1);
});
或者这个
// Bad guy 2
window.addEventListener('scroll', onScroll, false);
function onScroll() {
animate(ex2);
}
但是使用超时,间隔,requestAnimationFrame等方法,例如:
// Good guy
$(window).scroll( function() {
scrolling1 = true;
});
setInterval( function() {
if (scrolling1) {
scrolling1 = false;
animate(ex3);
}
}, 50 );
所以,我去了解了上面链接中找到的选项,并将它们添加到一个jsfiddle中,试图通过向每种方法添加计数器来比较它们,如下所示:
// Test
$(window).scroll( function() {
counter = counter + 1;
// output result of counter
animate(ex1);
});
建议检查完整的jsfiddle
结果:一切顺利的操作大致需要相同数量的计算资源。如果我可以接受不太流畅的效果,也许我可以节省一些资源。尽管我读到的所有信息都与此相反,但这对我来说似乎很合理!
第一个问题:我有漏掉的地方吗?或者这是个有效的测试吗?如果无效,应该如何正确测试? 编辑:澄清一下,我想测试是否有任何上述方法可以提高性能。
第二个问题:如果它是有效的,为什么每个人都会对onscroll感到紧张?如果流体动画需要在整个站点上进行5000次计算,那么无论如何都无法改变吗?
(嗯,有时候我使用检查来确定对象是否在视口中,但老实说,我甚至不知道这些检查是否和本身的代码一样昂贵,尤其是如果它们涉及五个不同的变量,如offset、windowHeight、scrollTop、getBoundingClientRect和outerHeight...)
touchstart
和touchend
的滚动性能问题... - Cody G