記事でよく説明されていると思います。
他に何ができますか?一つには、私たちは常にrequestAnimationFrameを実行していますが、何も変更されないため、スクロールしただけでは必要ありません。onScrollにrequestAnimationFrameを開始させることを修正するには
これで、スクロールするたびにrequestAnimationFrameを呼び出そうとしますが、1つがすでに要求されている場合は、もう1つを開始しません。これは重要な最適化です。ブラウザーは繰り返されるすべてのrAF要求をスタックし、必要以上に更新の呼び出しがある状況に戻るためです。
この設定のおかげで、更新の先頭でrequestAnimationFrameを呼び出す必要がなくなりました。これは、1つ以上のスクロールイベントが発生したときにのみ要求されることがわかっているためです。また、下部のキックオフコールも不要になったので、それに応じて更新しましょう。
var latestKnownScrollY = 0,
ticking = false;
function onScroll() {
latestKnownScrollY = window.scrollY;
if (!ticking) {
requestAnimationFrame(update);
}
ticking = true;
}
function update() {
ticking = false; // reset the tick so we can capture the next onScroll
var currentScrollY = latestKnownScrollY;
// Do visibilty logic and animation here
}
したがって、「ユーザーが移動を続けているかどうかに関係なく」は実際には真実ではありません。update
は、スクロール中(またはスクロール後少し後)にのみ呼び出され、1秒あたり数百のイベントのレートではなく、ブラウザが選択したフレームレートで呼び出されます。