JavaScript requestAnimationFrame動(dòng)畫詳解
進(jìn)入web2.0時(shí)代,在網(wǎng)頁(yè)中實(shí)現(xiàn)動(dòng)畫已經(jīng)不再局限于一種方法
- 你可以用CSS3的animattion+keyframes;
- 你也可以用css3的transition;
- 你還可以用通過在canvas上作圖來實(shí)現(xiàn)動(dòng)畫,也可以借助jQuery動(dòng)畫相關(guān)的API方便地實(shí)現(xiàn);
- 當(dāng)然最原始的你還可以使用window.setTimout()或者window.setInterval()通過不斷更新元素的狀態(tài)位置等來實(shí)現(xiàn)動(dòng)畫,前提是畫面的更新頻率要達(dá)到每秒60次才能讓肉眼看到流暢的動(dòng)畫效果。
認(rèn)識(shí)JavaScript requestAnimationFrame
首先我們來看一下它的源碼
requestAnimationFrame on github
// Adapted from https://gist.github.com/paulirish/1579671 which derived from
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating
// requestAnimationFrame polyfill by Erik Möller.
// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon
// MIT license
if (!Date.now)
Date.now = function() { return new Date().getTime(); };
(function() {
'use strict';
var vendors = ['ms', 'moz', 'webkit', 'o'];
//瀏覽器兼容
for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
//對(duì)于支持的瀏覽器直接統(tǒng)一接口
var vp = vendors[i];
window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
|| window[vp+'CancelRequestAnimationFrame']);
}
if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
|| !window.requestAnimationFrame || !window.cancelAnimationFrame) {
//對(duì)于不支持的瀏覽器退而使用setTimeout和clearTimeout
var lastTime = 0;
window.requestAnimationFrame = function(callback) {
var now = Date.now();
var nextTime = Math.max(lastTime + 16, now);
return setTimeout(function() { callback(lastTime = nextTime); },
nextTime - now);
};
window.cancelAnimationFrame = clearTimeout;
}
}());
相信那一點(diǎn)點(diǎn)源碼的閱讀對(duì)大家都沒有問題,就算讀不懂也沒關(guān)系,會(huì)調(diào)用api就可以了
requestAnimationFrame的優(yōu)點(diǎn)
瀏覽器可以優(yōu)化并行的動(dòng)畫動(dòng)作,更合理的重新排列動(dòng)作序列,并把能夠合并的動(dòng)作放在一個(gè)渲染周期內(nèi)完成,從而呈現(xiàn)出更流暢的動(dòng)畫效果。比如,通過requestAnimationFrame(),JS動(dòng)畫能夠和CSS動(dòng)畫/變換或SVG SMIL動(dòng)畫同步發(fā)生。另外,如果在一個(gè)瀏覽器標(biāo)簽頁(yè)里運(yùn)行一個(gè)動(dòng)畫,當(dāng)這個(gè)標(biāo)簽頁(yè)不可見時(shí),瀏覽器會(huì)暫停它,這會(huì)減少CPU,內(nèi)存的壓力,節(jié)省電池電量。
用法示例:
function animate() {
console.log("animation");
window.requestAnimationFrame(animate);
}
animate();

requestAnimationFrame(animate)是關(guān)鍵,它為要執(zhí)行的函數(shù)設(shè)置了動(dòng)畫,所以瀏覽器控制臺(tái)會(huì)一直執(zhí)行animate()函數(shù)。
瀏覽器兼容性

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript表單驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了JavaScript表單驗(yàn)證的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
url特殊字符編碼encodeURI?VS?encodeURIComponent分析
這篇文章主要介紹了url特殊字符編碼encodeURI?VS?encodeURIComponent分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
JS實(shí)現(xiàn)改變HTML上文字顏色和內(nèi)容的方法
這篇文章主要介紹了JS實(shí)現(xiàn)改變HTML上文字顏色和內(nèi)容的方法,涉及JS數(shù)學(xué)運(yùn)算與頁(yè)面元素動(dòng)態(tài)操作相關(guān)技巧,需要的朋友可以參考下2016-12-12
簡(jiǎn)單了解JavaScript操作XPath的一些基本方法
XPath構(gòu)建于XML之上,以表示路徑的方式來確定XML中元素位置,事實(shí)上并不是太常用,這里我們來簡(jiǎn)單了解JavaScript操作XPath的一些基本方法2016-06-06
Bootstrap選項(xiàng)卡與Masonry插件的完美結(jié)合
這篇文章主要介紹了Bootstrap選項(xiàng)卡與Masonry插件的完美結(jié)合的相關(guān)資料,需要的朋友可以參考下2016-07-07

