window.requestAnimationFrame的前世今生:
在90年代,那個互聯(lián)網(wǎng)做廣告的年代,window上面各種走馬燈,各種狀態(tài)文字都是用setTimeout來時實現(xiàn)的,如下:
代碼如下:
(function(){
function update(){
setTimeout(update,1000)
}
setTimeout(update,1000)
})();
(function(){
function update(){
//
}
setInterval(update,1000)
})();
動畫的問題最棘手的是延時問題,對于顯示器來說,每一秒60幀頻,如果我們按照瀏覽器的刷新速率來控制我們的動畫時間的話會有很好的效果,即17ms,setTimeout(callback,1000/60),但是:
1.各個瀏覽器及時精度是不一樣的。
2.對于setTimeout 和setInterval 實現(xiàn)機制并不是我們需要的那樣,當經(jīng)過特定的時間后,瀏覽器會將那部分代碼加入到UI的繪制隊列當中,如果這個時候UI線程很忙,有其它的任務阻塞,動畫的下一幀就不會按時執(zhí)行。經(jīng)過長時間的累計堆加之后,可能我們偏離原來的時間點誤差越來越大。
Mozilla 的 Robert O'Callahan 在思考這個問題,并想出了一個獨特的方案。他指出CSS transitions 和 animations的優(yōu)勢在于瀏覽器知道哪些動畫將會發(fā)生,所以得到正確的間隔來刷新UI。而javascript動畫,瀏覽器不知道動畫正在發(fā)生。他的解決方案是創(chuàng)建一個mozRequestAnimationFrame()方法來告訴瀏覽器哪些javascript代碼正在執(zhí)行,這使得瀏覽在執(zhí)行一些代碼后得到優(yōu)化。
mozRequestAnimationFrame()方法接受一個參數(shù),是一個屏幕重繪前被調用的函數(shù)。這個函數(shù)用來對生成下合適的dom樣式的改變,這些改變用在下一次重繪中。你可以像調用setTimeout()一樣的方式鏈式調用mozRequestAnimationFrame()。
這個就是window.requestAnimationFrame的由來。
在Mozilla官網(wǎng)看到如下
Because this technology's specification has not stabilized, check the compatibility table for the proper prefixes to use in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.
由于這項技術的規(guī)范還沒有穩(wěn)定,正確的前綴使用在各種瀏覽器的兼容性表。還要注意的是語法和行為的實驗技術是如有改變,在未來版本的瀏覽器的規(guī)格變化。
目前在Android系統(tǒng)下是不支持的,動畫只能setTimeout咯。
聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com