【发布时间】:2018-07-13 17:07:48
【问题描述】:
更新:类似的问题有一个很好的答案,展示了如何以一种有用的方式使用 requestAnimationFrame 和滚动: scroll events: requestAnimationFrame VS requestIdleCallback VS passive event listeners
假设我想在我的网站上添加一些由滚动触发的昂贵操作。例如,我在 jsfiddle 中使用了视差效果。
现在我一直在读,它一定不能直接绑定到事件,有时后面跟着 sn-ps 是为了更好。只是一些例子:
- Attaching JavaScript Handlers to Scroll Events = BAD!
- How to develop high performance onScroll event?
- How to make faster scroll effects?
- 60FPS onscroll event listener
他们所说的基本上是不要这样做:
// 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 中,该 jsfiddle 尝试通过为每种方法添加计数器来比较它们,如下所示:
// Test
$(window).scroll( function() {
counter = counter + 1;
// output result of counter
animate(ex1);
});
最好检查完整的jsfiddle
结果:一切顺利进行的计算次数大致相同。如果我能忍受波涛汹涌的影响,也许我可以保护一些资源。与我阅读的所有内容相比,这对我来说似乎是合乎逻辑的!
第一个问题: 我错过了什么还是这是一个有效的测试?如果它无效,我该如何正确测试? 编辑:澄清一下,我想测试一下上述方法是否能节省性能。
第二个问题: 如果它是有效的,为什么每个人都对 onscroll 感到紧张?如果流畅的动画需要对整个站点进行 5000 次计算,那么无论如何都无法更改它?
(嗯,有时我会使用检查来确定对象是否在视口中,但老实说,我什至不知道这些检查是否没有被阻止的代码本身那么昂贵,特别是如果它们涉及五个不同的offset、windowHeight、scrolltTop、getBoundingClientRect 和 outerHeight 等变量...)
【问题讨论】:
-
你在测试什么?表现?独立于浏览器(javascript引擎)、设备、操作系统?你需要测试所有这些东西......但无论如何我认为你应该使用被动事件侦听器或滚动事件的东西
-
developer.mozilla.org/en-US/docs/Web/API/EventTarget/… 看起来这些天对于 chrome 和 firefox 来说是自动的...在
touchstart和touchend -
谢谢科迪。我正在尝试验证上述任何方法是否真的在优化性能,或者是否没有必要。我将其添加到我的问题中。我很快会更仔细地阅读这些链接。 (看起来我应该在旧浏览器中对其进行测试,以了解这些方法之间的更多区别?)
-
大声笑,我打算在 IE11 中为你测试,但我什至无法在其中加载 jsfiddle。但是,是的,我想知道 iOS/Safari 如何处理滚动事件。我认为这是一个非常具体的话题,我希望在过去一年左右研究过它的人可以加入
标签: javascript jquery scroll onscroll