たまに使う頃に忘れてるのでメモ
let scrollTimer;
let flag = 0;
window.onscroll = () => {
flag = 1;
~スクロール中に走らせたい処理~
clearTimeout(scrollTimer);
scrollTimer = setTimeout(() => {
if(flag === 1) {
flag = 0;
~スクロール完了後に走らせたい処理~
}
}, 250);
}
解説
このコードはスクロールをしてから250ミリ秒後に、setTimeout内の処理が走ります。
window.onscrollは、画面がほんの僅かでもスクロールされると発火するので、スクロール中は何度も発火している事になります。
従って、setTimeoutもその度に発火するので、スクロール完了後の処理を1回だけ走らせるための工夫を加えてあります。
- let scrollTimer;
- スクロールイベントが発生した後に遅延を管理するためのタイマーIDが格納される変数です
- let flag = 0;
- 現在スクロール中かどうかを示すフラグです
- window.onscroll
- スクロールをするとonscroll関数が走ります
- flag = 1;
- スクロール中は常にflagに1が代入され続けます
このコードの直後に、スクロール中の処理を書きます - clearTimeout(scrollTimer);
- 例えば250ミリ秒の間にwindow.onscrollが5回発火したとすると、setTimeoutも5回走る事になるため、都度、処理待機状態にあるsetTimeoutをクリアし、新たにsetTimeoutを走っても処理が重ならない様にするための関数です
- scrollTimer = setTimeout(()
- scrollTimer変数に遅延管理のタイマーIDを格納しています
- if(flag === 1)
- flagに1が代入されているかどうかの判定
- flag = 0;
- flagが1の時に0を代入し、このコードの直後に、スクロール完了後の処理を書きます
- }, 250);
- setTimeoutを250ミリ秒後に処理する