web動畫的幾種實現(xiàn)方法

web動畫的幾種實現(xiàn)方法

  1. css3動畫
  2. setTimeout/setInterval實現(xiàn)
  3. requestAnimationFrame實現(xiàn)

requestAnimationFrame是什么宾肺?

在瀏覽器動畫程序中溯饵,我們通常使用一個定時器來循環(huán)每隔幾毫秒移動目標(biāo)物體一次,來讓它動起來锨用。如今有一個好消息丰刊,瀏覽器開發(fā)商們決定:“嗨,為什么我們不在瀏覽器里提供這樣一個API呢增拥,這樣一來我們可以為用戶優(yōu)化他們的動畫啄巧⊙捌纾”所以,這個requestAnimationFrame()函數(shù)就是針對動畫效果的API秩仆,你可以把它用在DOM上的風(fēng)格變化或畫布動畫或WebGL中码泛。

使用requestAnimationFrame有什么好處?

瀏覽器可以優(yōu)化并行的動畫動作澄耍,更合理的重新排列動作序列噪珊,并把能夠合并的動作放在一個渲染周期內(nèi)完成,從而呈現(xiàn)出更流暢的動畫效果齐莲。比如痢站,通過requestAnimationFrame(),JS動畫能夠和CSS動畫/變換或SVG SMIL動畫同步發(fā)生铅搓。另外瑟押,如果在一個瀏覽器標(biāo)簽頁里運行一個動畫,當(dāng)這個標(biāo)簽頁不可見時星掰,瀏覽器會暫停它多望,這會減少CPU,內(nèi)存的壓力氢烘,節(jié)省電池電量怀偷。

requestAnimationFrame的用法

// shim layer with setTimeout fallback
window.requestAnimFrame = (function(){
  return  window.requestAnimationFrame       ||
          window.webkitRequestAnimationFrame ||
          window.mozRequestAnimationFrame    ||
          function( callback ){
            window.setTimeout(callback, 1000 / 60);
          };
})();


// usage:
// instead of setInterval(render, 16) ....

(function animloop(){
  requestAnimFrame(animloop);
  render();
})();
// place the rAF *before* the render() to assure as close to
// 60fps with the setTimeout fallback.

requestAnimationFrame的API完善

下面是由Paul Irish及其他貢獻(xiàn)者放在GitHub Gist上的代碼片段,用于在瀏覽器不支持requestAnimationFrame情況下的回退播玖,回退到使用setTmeout的情況椎工。當(dāng)然,如果你確定代碼是工作在現(xiàn)代瀏覽器中蜀踏,下面的代碼是不必的维蒙。

// 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 and Tino Zijdel
// MIT license
(function() {
var lastTime = 0;
var vendors = ['ms', 'moz', 'webkit', 'o'];
for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] || window[vendors[x] + 'CancelRequestAnimationFrame'];
}
if (!window.requestAnimationFrame) window.requestAnimationFrame = function(callback, element) {
    var currTime = new Date().getTime();
    var timeToCall = Math.max(0, 16 - (currTime - lastTime));
    var id = window.setTimeout(function() {
        callback(currTime + timeToCall);
    }, timeToCall);
    lastTime = currTime + timeToCall;
    return id;
};
if (!window.cancelAnimationFrame) window.cancelAnimationFrame = function(id) {
    clearTimeout(id);
};
}());

各種瀏覽器對requestAnimationFrame的支持情況

谷歌瀏覽器,火狐瀏覽器果覆,IE10+都實現(xiàn)了這個函數(shù)颅痊,即使你的瀏覽器很古老,上面的對requestAnimationFrame封裝也能讓這個方法在IE8/9上不出錯局待。

<iframe>
<div id="test" style="width:1px;height:17px;background:#0f0;">0%</div>
<input type="button" value="Run" id="run"/>

<script type='text/javascript'>console.log(1);window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;var start = null;var ele = document.getElementById('test');var progress = 0;function step(timestamp){progress += 1;ele.style.width = progress + "%"; ele.innerHTML=progress + "%"; if (progress < 100) { requestAnimationFrame(step); } }requestAnimationFrame(step);document.getElementById("run").addEventListener("click", function() { ele.style.width = "1px"; progress = 0; requestAnimationFrame(step); }, false); </script>
</iframe>

一個應(yīng)用例子

http://jsfiddle.net/XQpzU/4358/?utm_source=website&utm_medium=embed&utm_campaign=XQpzU

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末斑响,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钳榨,更是在濱河造成了極大的恐慌舰罚,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薛耻,死亡現(xiàn)場離奇詭異营罢,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)饼齿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門饲漾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘟滨,“玉大人,你說我怎么就攤上這事能颁≡尤常” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵伙菊,是天一觀的道長败玉。 經(jīng)常有香客問我,道長镜硕,這世上最難降的妖魔是什么运翼? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮兴枯,結(jié)果婚禮上血淌,老公的妹妹穿的比我還像新娘。我一直安慰自己财剖,他們只是感情好悠夯,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著躺坟,像睡著了一般沦补。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪橙,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天夕膀,我揣著相機(jī)與錄音,去河邊找鬼美侦。 笑死产舞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菠剩。 我是一名探鬼主播易猫,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赠叼!你這毒婦竟也來了擦囊?” 一聲冷哼從身側(cè)響起违霞,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤嘴办,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后买鸽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涧郊,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年眼五,在試婚紗的時候發(fā)現(xiàn)自己被綠了妆艘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彤灶。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖批旺,靈堂內(nèi)的尸體忽然破棺而出幌陕,到底是詐尸還是另有隱情,我是刑警寧澤汽煮,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布搏熄,位于F島的核電站,受9級特大地震影響暇赤,放射性物質(zhì)發(fā)生泄漏心例。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一鞋囊、第九天 我趴在偏房一處隱蔽的房頂上張望止后。 院中可真熱鬧,春花似錦溜腐、人聲如沸译株。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽古戴。三九已至,卻和暖如春矩肩,著一層夾襖步出監(jiān)牢的瞬間现恼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工黍檩, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留叉袍,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓刽酱,卻偏偏與公主長得像喳逛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子棵里,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容