抖動(dòng)與節(jié)流實(shí)現(xiàn)的方式都是借助了定時(shí)器setTimeout,但是如果頁(yè)面只需要兼容高版本瀏覽器或應(yīng)用在移動(dòng)端,又或者頁(yè)面需要追求高精度的效果,那么可以使用瀏覽器的原生方法rAF(requestAnimationFrame)。
requestAnimationFrame
window.requestAnimationFrame() 這個(gè)方法是用來在頁(yè)面重繪之前,通知瀏覽器調(diào)用一個(gè)指定的函數(shù)。這個(gè)方法接受一個(gè)函數(shù)為參,該函數(shù)會(huì)在重繪前調(diào)用。
rAF常用于web動(dòng)畫的制作,用于準(zhǔn)確控制頁(yè)面的幀刷新渲染,讓動(dòng)畫效果更加流暢,當(dāng)然它的作用不僅僅局限于動(dòng)畫制作,因?yàn)橥瑫r(shí)它也是一個(gè)定時(shí)器。
通常來說,rAF被調(diào)用的頻率是每秒60次,也就是1000/60,觸發(fā)頻率大概是16.7ms。
簡(jiǎn)單而言,使用 requestAnimationFrame 來觸發(fā)滾動(dòng)事件,相當(dāng)于上面的:
throttle(func, xx, 16.7) //xx 代表 xx ms內(nèi)不會(huì)重復(fù)觸發(fā)事件 handler
簡(jiǎn)單的示例如下:
var ticking = false; // rAF 觸發(fā)鎖
function onScroll(){
if(!ticking) {
requestAnimationFrame(realFunc);
ticking = true;
}
}
function realFunc(){
// do something...
console.log("Success");
ticking = false;
}
// 滾動(dòng)事件監(jiān)聽
window.addEventListener('scroll', onScroll, false);
上面簡(jiǎn)單的使用rAF的例子可以拿到瀏覽器下試一下,大概功能就是在滾動(dòng)的過程中,保持以16.7ms的頻率觸發(fā)事件handler。
使用requestAnimationFrame優(yōu)缺點(diǎn)并存,首先我們不得不考慮它的兼容問題,其次因?yàn)樗荒軐?shí)現(xiàn)以16.7ms的頻率來觸發(fā),代表它的可調(diào)節(jié)性十分差。但是相比throttle(func, xx, 16.7),用于更復(fù)雜的場(chǎng)景時(shí),rAF可能效果更佳,性能更好。
總結(jié)一下
防抖動(dòng):防抖技術(shù)即是可以把多個(gè)順序地調(diào)用合并成一次,也就是在一定時(shí)間內(nèi),規(guī)定事件被觸發(fā)的次數(shù)。
節(jié)流函數(shù):只允許一個(gè)函數(shù)在 X 毫秒內(nèi)執(zhí)行一次,只有當(dāng)上一次函數(shù)執(zhí)行后過了你規(guī)定的時(shí)間間隔,才能進(jìn)行下一次該函數(shù)的調(diào)用。
rAF:16.7ms觸發(fā)一次handler,降低了可控性,但是提升了性能和精確度。
簡(jiǎn)化scroll內(nèi)的操作
上面介紹的方法都是如何去優(yōu)化scroll事件的觸發(fā),避免scroll事件過度消耗資源的。
但是從本質(zhì)上而言,我們應(yīng)該盡量去精簡(jiǎn)scroll事件的handler,將一些變量的初始化、不依賴于滾動(dòng)位置變化的計(jì)算等都應(yīng)當(dāng)在scroll事件外提前就緒。
建議如下:
避免在scroll事件中修改樣式屬性 / 將樣式操作從scroll事件中剝離
輸入事件處理函數(shù),比如scroll/touch事件的處理,都會(huì)在requestAnimationFrame之前被調(diào)用執(zhí)行。
因此,如果你在scroll事件的處理函數(shù)中做了修改樣式屬性的操作,那么這些操作會(huì)被瀏覽器暫存起來。然后在調(diào)用requestAnimationFrame的時(shí)候,如果你在一開始做了讀取樣式屬性的操作,那么這將會(huì)導(dǎo)致觸發(fā)瀏覽器的強(qiáng)制同步布局。
免費(fèi)學(xué)習(xí)課堂
- 免費(fèi)推廣知識(shí)
- 競(jìng)價(jià)推廣知識(shí)
- 新媒體營(yíng)銷知識(shí)
- 網(wǎng)站運(yùn)營(yíng)知識(shí)
- 網(wǎng)站設(shè)計(jì)知識(shí)
- 網(wǎng)站建設(shè)知識(shí)
- Web前端知識(shí)
- 軟文營(yíng)銷知識(shí)
- 網(wǎng)站策劃知識(shí)
- 整合營(yíng)銷
推薦文章
- 織夢(mèng)dedecms漏洞修復(fù)大全含任意文件
- 整頓微信公眾號(hào)過度營(yíng)銷 對(duì)嚴(yán)重違
- SEO優(yōu)化過程要避免什么?
- 網(wǎng)站空間被掛馬的原因原因及解決
- 2016企業(yè)該如何運(yùn)用互聯(lián)網(wǎng)進(jìn)行營(yíng)銷
- WEB前端項(xiàng)目開發(fā)中需注意的細(xì)節(jié)
- 低價(jià)網(wǎng)站建設(shè)的危害有哪些?
- 如何詳細(xì)的分析你網(wǎng)站的競(jìng)爭(zhēng)對(duì)手
- 網(wǎng)站設(shè)計(jì)中四個(gè)常犯的錯(cuò)誤
- 如何搭配網(wǎng)站設(shè)計(jì)中的色彩?
使用rAF(requestAnimationFrame)觸發(fā)滾動(dòng)事件
來源:北京匯仁智杰科技有限公司 時(shí)間:2016-05-18 點(diǎn)擊: 次
推薦文章
- 織夢(mèng)dedecms漏洞修復(fù)大全含任意文件2016-09-05
- 整頓微信公眾號(hào)過度營(yíng)銷 對(duì)嚴(yán)重違2016-01-26
- SEO優(yōu)化過程要避免什么?2016-01-26
- 網(wǎng)站空間被掛馬的原因原因及解決2016-01-26
- 2016企業(yè)該如何運(yùn)用互聯(lián)網(wǎng)進(jìn)行營(yíng)銷2016-01-26
- WEB前端項(xiàng)目開發(fā)中需注意的細(xì)節(jié)2016-01-26
- 低價(jià)網(wǎng)站建設(shè)的危害有哪些?2016-01-15
- 如何詳細(xì)的分析你網(wǎng)站的競(jìng)爭(zhēng)對(duì)手2015-06-10
- 網(wǎng)站設(shè)計(jì)中四個(gè)常犯的錯(cuò)誤2015-01-22
- 如何搭配網(wǎng)站設(shè)計(jì)中的色彩?2015-01-22