Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mozilla滚动建议_Javascript_Javascript Events_Mozilla_Requestanimationframe - Fatal编程技术网

Javascript Mozilla滚动建议

Javascript Mozilla滚动建议,javascript,javascript-events,mozilla,requestanimationframe,Javascript,Javascript Events,Mozilla,Requestanimationframe,我需要一个粘滞的酒吧是可见的和固定后,一定的滚动。我打算使用scroll事件,然后我遇到了mozilla页面,该页面建议使用window.requestAnimationFrame,如下所示: var last_known_scroll_position = 0; var ticking = false; function doSomething(scroll_pos) { // do something with the scroll position } window.addEven

我需要一个粘滞的酒吧是可见的和固定后,一定的滚动。我打算使用scroll事件,然后我遇到了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函数只被调用一次。我想我错了,我错过了什么

默认浏览器行为 在每个滚动事件(1像素或更多)上,浏览器将重新绘制布局。(用于明显的布局目的)

性能问题 您的函数
doSomething()
可能无法在两个触发的滚动事件之前完成。您可以将其视为一堆
doSomething
函数,因为调用将超过您的执行时间

requestAnimationFrame()解决方案 默认情况下,此函数在
窗口中定义。它告诉浏览器在重新绘制布局之前等待已传递函数的执行

滴答声的想法 如您所见,
滴答声
只会在
doSomething()之后变为
false
。它避免了前面提到的
事件堆栈
。它避免了在函数完成和浏览器重新绘制布局之前执行另一个滚动事件的代码

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

默认浏览器行为 在每个滚动事件(1像素或更多)上,浏览器将重新绘制布局。(用于明显的布局目的)

性能问题 您的函数
doSomething()
可能无法在两个触发的滚动事件之前完成。您可以将其视为一堆
doSomething
函数,因为调用将超过您的执行时间

requestAnimationFrame()解决方案 默认情况下,此函数在
窗口中定义。它告诉浏览器在重新绘制布局之前等待已传递函数的执行

滴答声的想法 如您所见,
滴答声
只会在
doSomething()之后变为
false
。它避免了前面提到的
事件堆栈
。它避免了在函数完成和浏览器重新绘制布局之前执行另一个滚动事件的代码

结论
它为您的卷轴增加了性能。几天前我问过,哪一个说明了这种情况。

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