requestAnimationFrame

在 requestAnimationFrame 之前也颤,主要借助 setTimeout/ setInterval 來編寫 JS 動畫埋虹,而動畫的關鍵在于動畫幀之間的時間間隔設置马靠,這個時間間隔的設置有講究卷拘,一方面要足夠小笆制,這樣動畫幀之間才有連貫性除秀,動畫效果才顯得平滑流暢糯累;另一方面要足夠大,確保瀏覽器有足夠的時間及時完成渲染册踩。
大部分顯示器的刷新頻率是60Hz泳姐,即每秒鐘重繪 60 次。大多數瀏覽器都會對重繪操作的頻率加以限制暂吉,使其不超過顯示器的刷新頻率胖秒。一般最平滑流暢的動畫的時間間隔是 1000ms/60,約為 16.7 ms.
時間間隔對于動畫非常重要慕的,但是 setTimeout/ setInterval 的顯著缺陷就是設定的時間并不精確阎肝,它們只是在設定的時間后將相應任務添加到任務隊列中,而任務隊列中如果還有前面的任務尚未執(zhí)行完畢肮街,那么后添加的任務就必須等待风题,這個等待的時間造成了原本設定的動畫時間間隔不準。
requestAnimationFrame 應運而生嫉父,它采用的是系統(tǒng)時間間隔(約16.7ms)沛硅,保持最佳繪制效果與效率,使各種網頁動畫有一個統(tǒng)一的刷新機制绕辖,從而節(jié)省系統(tǒng)資源摇肌,提高系統(tǒng)性能。
MDN關于requestAnimationFrame:告訴瀏覽器仪际,希望執(zhí)行一個動畫围小,并要求瀏覽器在下次重繪之前使用指定的回調函數更新動畫昵骤。(如果想在瀏覽器下次重繪之前繼續(xù)更新下一幀動畫,那么回調函數自身必須再次調用 window.requestAnimationFrame(回調函數)吩抓,這樣動畫才有很多幀涉茧,否則只有兩幀(初始狀態(tài)算一幀,回調函數執(zhí)行一次的結果算一幀)且在16.7ms內完成就失去了動畫效果 )疹娶。
回調函數會被自動傳入 'DOMHighResTimeStamp'參數(時間戳伴栓,十進制數,單位是毫秒雨饺,最小精度為1ms)钳垮,該參數指示當前被 requestAnimationFrame() 排序的回調函數被觸發(fā)的時間。在同一個幀中的多個回調函數额港,每個都會被傳入一個相同的時間戳饺窿。
示例

<svg width="800" height="600">
    <circle cx="50" cy="50" r="10" fill="red" id="myCircle1"></circle>
    <circle cx="50" cy="100" r="10" fill="red" id="myCircle2"></circle>
</svg>
<script>
  const log=console.log;
  const circle1=document.getElementById('myCircle1');
  const circle2=document.getElementById('myCircle2');

  let start=null;
  let count=0;//統(tǒng)計動畫共有多少幀
  function step(timestamp,circle) {
      if(!start){
          start=timestamp;
      }
      let progress=timestamp-start;
      let dx=Math.min(progress/10,600);
      circle.setAttribute('cx',dx);
      if(progress<6000){
          count++;
          // 在瀏覽器下次重繪之前繼續(xù)更新下一幀動畫
          window.requestAnimationFrame((timestamp)=>{step(timestamp,circle)});
      }
      else{
          log(progress);
          log(count);
      }
  }

  window.requestAnimationFrame((timestamp)=>step(timestamp,circle1));//不會阻塞后面語句執(zhí)行

以上代碼執(zhí)行效果就是一個svg繪制的圓形在 6000ms 內水平從左向右勻速移動,最終狀態(tài)如圖1所示移斩,可見動畫整體耗時 progress 為 6006.583 ms肚医,動畫幀數 count 為 359,每幀之間的時間間隔為 progress/count 約為 16.7 ms向瓷。


圖1-動畫結果1

還有一個要注意的地方肠套,就是 window.requestAnimationFrame(回調函數) 不會阻塞后面語句執(zhí)行,所以下段代碼中通過兩個 window.requestAnimationFrame(回調函數) 語句可以創(chuàng)造兩個同時進行的動畫猖任,如圖2所示你稚。(由于共有了變量 count,所以最終其值為兩個動畫的總幀數朱躺。)

 window.requestAnimationFrame((timestamp)=>step(timestamp,circle1));//不會阻塞后面語句執(zhí)行
  window.requestAnimationFrame((timestamp)=>step(timestamp,circle2));
圖2-兩個動畫
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末刁赖,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子长搀,更是在濱河造成了極大的恐慌宇弛,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件源请,死亡現場離奇詭異涯肩,居然都是意外死亡,警方通過查閱死者的電腦和手機巢钓,發(fā)現死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疗垛,“玉大人症汹,你說我怎么就攤上這事〈螅” “怎么了背镇?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵咬展,是天一觀的道長。 經常有香客問我瞒斩,道長破婆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任胸囱,我火速辦了婚禮祷舀,結果婚禮上,老公的妹妹穿的比我還像新娘烹笔。我一直安慰自己裳扯,他們只是感情好,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布谤职。 她就那樣靜靜地躺著饰豺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪允蜈。 梳的紋絲不亂的頭發(fā)上冤吨,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音饶套,去河邊找鬼漩蟆。 笑死,一個胖子當著我的面吹牛凤跑,可吹牛的內容都是我干的爆安。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼仔引,長吁一口氣:“原來是場噩夢啊……” “哼扔仓!你這毒婦竟也來了?” 一聲冷哼從身側響起咖耘,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤翘簇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后儿倒,有當地人在樹林里發(fā)現了一具尸體版保,經...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年夫否,在試婚紗的時候發(fā)現自己被綠了彻犁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡凰慈,死狀恐怖汞幢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情微谓,我是刑警寧澤森篷,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布输钩,位于F島的核電站,受9級特大地震影響仲智,放射性物質發(fā)生泄漏买乃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一钓辆、第九天 我趴在偏房一處隱蔽的房頂上張望剪验。 院中可真熱鬧,春花似錦岩馍、人聲如沸碉咆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疫铜。三九已至,卻和暖如春双谆,著一層夾襖步出監(jiān)牢的瞬間壳咕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工顽馋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谓厘,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓寸谜,卻偏偏與公主長得像竟稳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子熊痴,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350