window.requestAnimationFrame是什么意思,怎么用
更新時(shí)間:2013年01月13日 13:54:08 作者:
window.requestAnimationFrame 告訴瀏覽器您要執(zhí)行的動畫并且請求瀏覽器的在下一個(gè)動畫幀重繪窗口,方法在瀏覽器重繪之前作為一個(gè)回調(diào)函數(shù)被調(diào)用,就是告訴瀏覽器在刷新屏幕的時(shí)候,調(diào)用這個(gè)方法
再看別人實(shí)現(xiàn)粒子效果的時(shí)候會有以下代碼:
window.requestAnimationFrame || (window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame
|| window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback, element) {
return window.setTimeout(function() {
return callback(+new Date());
}, 1000 / 60)
});
這個(gè)到底是什么意思,它又是怎么用的呢?
window.requestAnimationFrame 告訴瀏覽器您要執(zhí)行的動畫并且請求瀏覽器的在下一個(gè)動畫幀重繪窗口。該方法在瀏覽器重繪之前作為一個(gè)回調(diào)函數(shù)被調(diào)用。
就是告訴瀏覽器在刷新屏幕的時(shí)候,調(diào)用這個(gè)方法。
window.requestAnimationFrame的前世今生:
在90年代,那個(gè)互聯(lián)網(wǎng)做廣告的年代,window上面各種走馬燈,各種狀態(tài)文字都是用setTimeout來時(shí)實(shí)現(xiàn)的,如下:
(function(){
function update(){
setTimeout(update,1000)
}
setTimeout(update,1000)
})();
(function(){
function update(){
//
}
setInterval(update,1000)
})();
動畫的問題最棘手的是延時(shí)問題,對于顯示器來說,每一秒60幀頻,如果我們按照瀏覽器的刷新速率來控制我們的動畫時(shí)間的話會有很好的效果,即17ms,setTimeout(callback,1000/60),但是:
1.各個(gè)瀏覽器及時(shí)精度是不一樣的。
2.對于setTimeout 和setInterval 實(shí)現(xiàn)機(jī)制并不是我們需要的那樣,當(dāng)經(jīng)過特定的時(shí)間后,瀏覽器會將那部分代碼加入到UI的繪制隊(duì)列當(dāng)中,如果這個(gè)時(shí)候UI線程很忙,有其它的任務(wù)阻塞,動畫的下一幀就不會按時(shí)執(zhí)行。經(jīng)過長時(shí)間的累計(jì)堆加之后,可能我們偏離原來的時(shí)間點(diǎn)誤差越來越大。
Mozilla 的 Robert O'Callahan 在思考這個(gè)問題,并想出了一個(gè)獨(dú)特的方案。他指出CSS transitions 和 animations的優(yōu)勢在于瀏覽器知道哪些動畫將會發(fā)生,所以得到正確的間隔來刷新UI。而javascript動畫,瀏覽器不知道動畫正在發(fā)生。他的解決方案是創(chuàng)建一個(gè)mozRequestAnimationFrame()方法來告訴瀏覽器哪些javascript代碼正在執(zhí)行,這使得瀏覽在執(zhí)行一些代碼后得到優(yōu)化。
mozRequestAnimationFrame()方法接受一個(gè)參數(shù),是一個(gè)屏幕重繪前被調(diào)用的函數(shù)。這個(gè)函數(shù)用來對生成下合適的dom樣式的改變,這些改變用在下一次重繪中。你可以像調(diào)用setTimeout()一樣的方式鏈?zhǔn)秸{(diào)用mozRequestAnimationFrame()。
這個(gè)就是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.
由于這項(xiàng)技術(shù)的規(guī)范還沒有穩(wěn)定,正確的前綴使用在各種瀏覽器的兼容性表。還要注意的是語法和行為的實(shí)驗(yàn)技術(shù)是如有改變,在未來版本的瀏覽器的規(guī)格變化。
目前在Android系統(tǒng)下是不支持的,動畫只能setTimeout咯。
復(fù)制代碼 代碼如下:
window.requestAnimationFrame || (window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame
|| window.oRequestAnimationFrame || window.msRequestAnimationFrame ||
function(callback, element) {
return window.setTimeout(function() {
return callback(+new Date());
}, 1000 / 60)
});
這個(gè)到底是什么意思,它又是怎么用的呢?
window.requestAnimationFrame 告訴瀏覽器您要執(zhí)行的動畫并且請求瀏覽器的在下一個(gè)動畫幀重繪窗口。該方法在瀏覽器重繪之前作為一個(gè)回調(diào)函數(shù)被調(diào)用。
就是告訴瀏覽器在刷新屏幕的時(shí)候,調(diào)用這個(gè)方法。
window.requestAnimationFrame的前世今生:
在90年代,那個(gè)互聯(lián)網(wǎng)做廣告的年代,window上面各種走馬燈,各種狀態(tài)文字都是用setTimeout來時(shí)實(shí)現(xiàn)的,如下:
復(fù)制代碼 代碼如下:
(function(){
function update(){
setTimeout(update,1000)
}
setTimeout(update,1000)
})();
(function(){
function update(){
//
}
setInterval(update,1000)
})();
動畫的問題最棘手的是延時(shí)問題,對于顯示器來說,每一秒60幀頻,如果我們按照瀏覽器的刷新速率來控制我們的動畫時(shí)間的話會有很好的效果,即17ms,setTimeout(callback,1000/60),但是:
1.各個(gè)瀏覽器及時(shí)精度是不一樣的。
2.對于setTimeout 和setInterval 實(shí)現(xiàn)機(jī)制并不是我們需要的那樣,當(dāng)經(jīng)過特定的時(shí)間后,瀏覽器會將那部分代碼加入到UI的繪制隊(duì)列當(dāng)中,如果這個(gè)時(shí)候UI線程很忙,有其它的任務(wù)阻塞,動畫的下一幀就不會按時(shí)執(zhí)行。經(jīng)過長時(shí)間的累計(jì)堆加之后,可能我們偏離原來的時(shí)間點(diǎn)誤差越來越大。
Mozilla 的 Robert O'Callahan 在思考這個(gè)問題,并想出了一個(gè)獨(dú)特的方案。他指出CSS transitions 和 animations的優(yōu)勢在于瀏覽器知道哪些動畫將會發(fā)生,所以得到正確的間隔來刷新UI。而javascript動畫,瀏覽器不知道動畫正在發(fā)生。他的解決方案是創(chuàng)建一個(gè)mozRequestAnimationFrame()方法來告訴瀏覽器哪些javascript代碼正在執(zhí)行,這使得瀏覽在執(zhí)行一些代碼后得到優(yōu)化。
mozRequestAnimationFrame()方法接受一個(gè)參數(shù),是一個(gè)屏幕重繪前被調(diào)用的函數(shù)。這個(gè)函數(shù)用來對生成下合適的dom樣式的改變,這些改變用在下一次重繪中。你可以像調(diào)用setTimeout()一樣的方式鏈?zhǔn)秸{(diào)用mozRequestAnimationFrame()。
這個(gè)就是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.
由于這項(xiàng)技術(shù)的規(guī)范還沒有穩(wěn)定,正確的前綴使用在各種瀏覽器的兼容性表。還要注意的是語法和行為的實(shí)驗(yàn)技術(shù)是如有改變,在未來版本的瀏覽器的規(guī)格變化。
目前在Android系統(tǒng)下是不支持的,動畫只能setTimeout咯。
相關(guān)文章
javascript學(xué)習(xí)筆記(五)正則表達(dá)式
正則表達(dá)式在web開發(fā)中會經(jīng)常用到,主要用于驗(yàn)證用戶輸入的數(shù)據(jù)的格式。2011-04-04Js從頭學(xué)起(基本數(shù)據(jù)類型和引用類型的參數(shù)傳遞詳細(xì)分析)
Js中所有函數(shù)的參數(shù)傳遞都是按值傳遞的,也就是把函數(shù)外面的值復(fù)制給函數(shù)內(nèi)部的參數(shù),就和把值從一個(gè)變量復(fù)制到另一個(gè)變量一樣。下面舉幾個(gè)特別的例子2012-02-02javascript數(shù)組操作(創(chuàng)建、元素刪除、數(shù)組的拷貝)
這篇文章主要介紹了javascript數(shù)組操作,包括創(chuàng)建、元素的訪問、元素刪除、數(shù)組的拷貝等操作,還有其它示例,需要的朋友可以參考下2014-04-04JavaScript中prototype為對象添加屬性的誤區(qū)介紹
prototype為對象添加屬性的的過程中有些誤區(qū),在本文將為大家詳細(xì)介紹下,感興趣的朋友可不要錯(cuò)過2013-10-10