scroll最適化の手ぶれと節流
2236 ワード
この最適化案は【先端性能】高性能スクロールscroll及びページレンダリング最適化を参照してください.
ここでは簡単に二つの方法を書いて、分かりやすくします.
第一種類:手ぶれ防止(つまり転がりが終わってから実行する)
プレゼンテーション:
パッケージを閉じます:
プレゼンテーション:
パッケージを閉じます:
ここでは簡単に二つの方法を書いて、分かりやすくします.
第一種類:手ぶれ防止(つまり転がりが終わってから実行する)
プレゼンテーション:
パッケージを閉じます:
/*
@param fn function
@param wait number
@return function
*/
function debounce(fn, wait) {
var timeout = null;
return function() {
if(timeout !== null) clearTimeout(timeout);
timeout = setTimeout(fn, wait);
}
}
//
function handle() {
console.log(Math.random());
}
//
window.addEventListener('scroll', debounce(handle, 500));
直接書き:var timeout = null;
window.addEventListener('scroll', function() {
if(timeout !== null) clearTimeout(timeout);
timeout = setTimeout(function() {
var scrollTop = this.scrollY;
console.log(scrollTop);
}.bind(this), 500);
});
二つ目は節流スクロール中の間隔で行われます.例えば、スクロールローディング画像の効果は、スクロールが終了するまでローディング関数を実行することはできないでしょう.ここでは間隔を作って実行できます.プレゼンテーション:
パッケージを閉じます:
/*
@param fn function
@param wait number
@param maxTimeLong number
@return function
*/
function throttling(fn, wait, maxTimelong) {
var timeout = null,
startTime = Date.parse(new Date);
return function() {
if(timeout !== null) clearTimeout(timeout);
var curTime = Date.parse(new Date);
if(curTime-startTime>=maxTimelong) {
fn();
startTime = curTime;
} else {
timeout = setTimeout(fn, wait);
}
}
}
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', throttling(handle, 300, 1000));
直接書き:var timeout = null,
startTime = Date.parse(new Date); //
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', function() {
if(timeout !== null) clearTimeout(timeout);
var curTime = Date.parse(new Date); //
if(curTime-startTime>=1000) { // >=1
handle();
startTime = curTime;
} else { // , , <1
timeout = setTimeout(handle, 300);
}
});
このような事件はレスゼ事件もこの2つの方法を使っています.もちろんどちらを使うかはプロジェクトのニーズを見なければなりません.ありがとうございます