【问题标题】:Mozilla scroll adviceMozilla 滚动建议
【发布时间】:2016-07-29 11:09:18
【问题描述】:

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

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 语句没有返回任何内容。这将导致 doSomething 函数只会被调用一次。我想我错了,我错过了什么?

mozilla link of scroll

【问题讨论】:

  • 我刚刚检查过,它有效,但为什么?

标签: javascript dom-events mozilla requestanimationframe


【解决方案1】:

默认浏览器行为

在每个滚动事件(无论是 1 像素或更多)上,浏览器都会重新绘制布局。 (出于明显的布局目的)

性能问题

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

requestAnimationFrame()' 解决方案

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

滴答作响的想法

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

结论

它为您的卷轴增加了性能。几天前我问过a question,这说明了这种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多