requestAnimationFrame-制作逐幀動(dòng)畫

window.requestAnimationFrame() 方法告訴瀏覽器您希望執(zhí)行動(dòng)畫,并請(qǐng)求瀏覽器調(diào)用指定的函數(shù)在下一次重繪之前更新動(dòng)畫蝶柿。該方法將在重繪之前調(diào)用的回調(diào)作為參數(shù)。如果你想做逐幀動(dòng)畫的時(shí)候资溃,你應(yīng)該用這個(gè)方法大莫。這就要求你的動(dòng)畫函數(shù)執(zhí)行會(huì)先于瀏覽器重繪動(dòng)作。通常來說拓瞪,被調(diào)用的頻率是每秒60次缴罗,但是一般會(huì)遵循W3C標(biāo)準(zhǔn)規(guī)定的頻率。如果是后臺(tái)標(biāo)簽頁(yè)面祭埂,重繪頻率則會(huì)大大降低愧薛。

瀏覽器的顯示頻率一般是16.7ms,我們將setTimeout的間隔時(shí)間設(shè)為16.7ms鼠哥,節(jié)奏會(huì)如下圖第一行展示 。但如果我們將間隔時(shí)間設(shè)為10ms矢空,那么節(jié)奏會(huì)如下圖第二行展示。


frame-lost.png

舉個(gè)例子:

國(guó)慶北京高速禀横,最多每16.7s通過一輛車屁药,結(jié)果,突然插入一批setTimeout的軍車柏锄,強(qiáng)行要10s通過酿箭。顯然,這是超負(fù)荷的趾娃,要想順利進(jìn)行缭嫡,只能讓第三輛車直接消失(正如顯示繪制第三幀的丟失)。然而抬闷,這是不現(xiàn)實(shí)的妇蛀,于是就有了會(huì)堵車!

同樣的笤成,顯示器16.7ms刷新間隔之前發(fā)生了其他繪制請(qǐng)求(setTimeout)评架,導(dǎo)致所有第三幀丟失,繼而導(dǎo)致動(dòng)畫斷續(xù)顯示(堵車的感覺)炕泳,這就是過度繪制帶來的問題纵诞。不僅如此,這種計(jì)時(shí)器頻率的降低也會(huì)對(duì)電池使用壽命造成負(fù)面影響培遵,并會(huì)降低其他應(yīng)用的性能浙芙。

這也是為何setTimeout的定時(shí)器值推薦最小使用16.7ms的原因(16.7 = 1000 / 60, 即每秒60幀)。

而requestAnimationFrame就是為了解決這個(gè)問題而出現(xiàn)的籽腕。它所做的事情很簡(jiǎn)單嗡呼,就是跟著瀏覽器的繪制走,如果瀏覽設(shè)備繪制間隔是16.7ms节仿,那它就在這個(gè)間隔繪制晤锥。如果瀏覽設(shè)備繪制間隔是10ms,它就10ms繪制廊宪。這樣就不會(huì)存在過度繪制的問題矾瘾,動(dòng)畫不會(huì)掉幀,播放自然流暢箭启。

兼容性

2017-04-02_112747.jpg

統(tǒng)一的向下兼容方法:

(function() {
  var lastTime = 0;
  var vendors = ['webkit', 'moz'];
  for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
    window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];
    window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||    // Webkit中此取消方法的名字變了
    window[vendors[x] + 'CancelRequestAnimationFrame'];
  }

  if (!window.requestAnimationFrame) {
    window.requestAnimationFrame = function(callback, element) {
      var currTime = new Date().getTime();
      var timeToCall = Math.max(0, 16.7 - (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);
    };
  }
}());

原文來自:http://www.zhangxinxu.com/wordpress/?p=3695

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末壕翩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子傅寡,更是在濱河造成了極大的恐慌放妈,老刑警劉巖北救,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芜抒,居然都是意外死亡珍策,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門宅倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攘宙,“玉大人,你說我怎么就攤上這事拐迁〔渑” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵线召,是天一觀的道長(zhǎng)铺韧。 經(jīng)常有香客問我,道長(zhǎng)缓淹,這世上最難降的妖魔是什么哈打? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮割卖,結(jié)果婚禮上前酿,老公的妹妹穿的比我還像新娘。我一直安慰自己鹏溯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布淹仑。 她就那樣靜靜地躺著丙挽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪匀借。 梳的紋絲不亂的頭發(fā)上颜阐,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音吓肋,去河邊找鬼凳怨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛是鬼,可吹牛的內(nèi)容都是我干的肤舞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼均蜜,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼李剖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起囤耳,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤篙顺,失蹤者是張志新(化名)和其女友劉穎偶芍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體德玫,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡匪蟀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宰僧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片材彪。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖撒桨,靈堂內(nèi)的尸體忽然破棺而出查刻,到底是詐尸還是另有隱情,我是刑警寧澤凤类,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布穗泵,位于F島的核電站,受9級(jí)特大地震影響谜疤,放射性物質(zhì)發(fā)生泄漏佃延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一夷磕、第九天 我趴在偏房一處隱蔽的房頂上張望履肃。 院中可真熱鬧,春花似錦坐桩、人聲如沸尺棋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)膘螟。三九已至,卻和暖如春碾局,著一層夾襖步出監(jiān)牢的瞬間荆残,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工净当, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留内斯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓像啼,卻偏偏與公主長(zhǎng)得像俘闯,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子埋合,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果备徐,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌甚颂。在這里你可以看...
    每天刷兩次牙閱讀 8,469評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果蜜猾,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜秀菱,今天將帶大家一窺iOS動(dòng)畫全貌。在這里你可以看...
    F麥子閱讀 5,101評(píng)論 5 13
  • 原文: http://www.cnblogs.com/yezhennan/p/5442031.html UI性能測(cè)...
    vb12閱讀 4,261評(píng)論 0 9
  • 作為一只前端狗蹭睡,我們的使命就是在滿足產(chǎn)品需求衍菱、實(shí)現(xiàn)交互設(shè)計(jì)的基礎(chǔ)上,將最好的體驗(yàn)呈現(xiàn)給用戶爸爸們肩豁。在保證性能的同時(shí)...
    桂圓_noble閱讀 4,137評(píng)論 5 14
  • 當(dāng)我們要在頁(yè)面上實(shí)現(xiàn)一些動(dòng)畫效果的時(shí)候清钥,通常會(huì)考慮兩種方式: 1琼锋、通過css3的animation+keyfram...
    點(diǎn)融黑幫閱讀 1,277評(píng)論 0 28