scroll優化之防抖與節流

這個優化方案是參照 【前端性能】高性能滾動 scroll 及頁面渲染優化html

在這裏簡單的把兩個方式寫出來,以便快速瞭解。。前端

第一種:防抖(也就是滾動結束才執行)閉包

演示:
圖片描述dom

閉包:前端性能

/*
    延時執行
    @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);
});

第二個是節流(Throttling)滾動的過程當中間隔執行,例如滾動加載圖片效果,不可能等到滾動結束才執行加載函數數吧,因此這裏能夠作一個間隔執行。。性能

演示:
圖片描述優化

閉包:this

/*
    節流函數
    @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));

直接寫:spa

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);
    }
});

諸如此類事件的還有resize事件均可以使用這兩種方式,固然使用哪種,還要看項目需求了。。謝謝關注~

相關文章
相關標籤/搜索