這個優化方案是參照 【前端性能】高性能滾動 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事件均可以使用這兩種方式,固然使用哪種,還要看項目需求了。。謝謝關注~