Mozilla 滚动建议

Mozilla scroll advice

我需要一个粘性条在特定滚动后可见并固定。我打算使用滚动事件,然后我遇到了建议使用 window.requestAnimationFrame 的 Mozilla 页面,如下所示:

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;
});

我有几个问题:

1 - 滴答背后的逻辑是什么?

2 - 在我看来滴答总是正确的,因为 if 语句没有 return 任何东西。这会导致 doSomething 函数只会被调用一次。我想我错了,我错过了什么?

mozilla link of scroll

默认浏览器行为

在每次滚动事件(1 像素或更多)时,浏览器将重新绘制布局。 (出于明显的布局目的)

性能问题

您的函数 doSomething() 可能 在两次触发的滚动事件之前未完成。您可以将其视为 doSomething 个函数的堆栈,因为调用的次数将超出您的执行时间所能处理的范围。

requestAnimationFrame()'解决方案

这个函数默认定义在window对象中。它告诉浏览器在重新绘制布局之前等待传递的函数的执行。

打勾的想法

如您所见,tickingdoSomething()之后只会是false。它避免了前面提到的stack of events。它避免了在函数完成和浏览器重新绘制布局之前执行另一个滚动事件的代码。

结论

它可以提高滚动性能。我几天前问过 这说明了这种情况。