【发布时间】:2017-06-26 00:20:14
【问题描述】:
您可以通过以下方式检测任意元素上的浏览器滚动事件:
element.addEventListener('scroll', function (event) {
// do something
});
我希望能够区分垂直滚动和水平滚动并独立执行它们的操作。
我目前正在通过存储 element.scrollTop 和 element.scrollLeft 的值来执行此操作,然后在事件侦听器中比较它们。例如。
var scrollLeft, scrollTop;
element.addEventListener('scroll', function (event) {
if (scrollLeft !== element.scrollLeft) {
// horizontally scrolled
scrollLeft = element.scrollLeft;
}
if (scrollTop !== element.scrollTop) {
// vertically scrolled
scrollTop = element.scrollTop;
}
});
这很好用,但是从https://gist.github.com/paulirish/5d52fb081b3570c81e3a 我读到读取 scrollLeft 或 scrollTop 值会导致回流。
有没有更好的方法来做到这一点而不会导致浏览器在滚动时重排?
【问题讨论】:
-
跟踪您元素的
scrollLeft和scrollTop值,并查看它们在您处理滚动事件时是否发生变化,并在处理结束时更新它们,以便为下一次事件处理做好准备? -
如果你没有改变你的事件之间的DOM结构,它不会触发回流,或者更确切地说,回流将无关紧要。尼尔森是对的,无论如何你都应该限制滚动事件,但这不是因为回流,而仅仅是因为对这个“graphical”事件做出比屏幕刷新率更快的反应是没有意义的。
标签: javascript html reflow