2017-12-26

requestAnimationFrame

一、流暢的web動畫

Web 動畫幀率(FPS): 每秒鐘畫面更新的次數。

我們平時看到的連續(xù)動畫都是由一幅幅靜止畫面組成的,每幅畫面稱為一幀。理論上,FPS越高,動畫越流暢压鉴。幀率在 30 FPS 以下的動畫宦赠,讓人感覺到明顯的卡頓。
目前大多數設備的屏幕刷新率為 60 次/秒队萤,所以通常來講 FPS 為 60 frame/s 時動畫效果最好轮锥,也就是每幀的消耗時間為 16.67ms。

二要尔、setTimeoutcss3 實現動畫的局限

setTimeout
假如 setTimeout 設置的時間間隔小于 16.7ms 時舍杜,就會導致丟幀現象,為了避免這種情況(動畫頻率和瀏覽器刷新頻率不一致)盈电,就出現了 requestAnimationFrame 蝴簇。它的做法就是跟著瀏覽器的繪制頻率走,

優(yōu)點:
易用匆帚,低效熬词,兼容好;
缺點:

  1. setInterval多個間隔可能會被跳過
  2. setInterval多個間隔可能比預期小
  3. 不同瀏覽器的精度量級不同:
  4. jQuery 無法解決頻繁觸發(fā) Layout 導致的抽動吸重。


    image.png




2) css3動畫

css3的動畫互拾,都是三次方的曲線: linear,ease,ease-in,ease-out,ease-in-out,cubic-bezier(n,n,n,n)
css3動畫能力有限。

css3
優(yōu)點:簡單高效嚎幸;不依賴主線程颜矿;采用硬件加速。
缺點:
CSS3不能動態(tài)修改或定義動畫內容嫉晶;
不同的動畫無法實現同步骑疆;
CSS3 transition 強制硬件加速加大GPU消耗,高負荷情形下導致移動設備上運行不暢替废;
由于transition并不是由JS原生控制箍铭,瀏覽器無法

1. requestAnimationFrame定義

requestAnimationFrame 是瀏覽器用于定時循環(huán)操作的一個接口,按幀對網頁進行重繪椎镣。讓各種網頁動畫效果有一個統(tǒng)一的刷新機制诈火。使用這個API,告訴瀏覽器你希望執(zhí)行動畫状答,讓瀏覽器在下一個動畫幀安排一次網頁重繪冷守。

requestAnimationFrame 充分利用瀏覽器的刷新機制,并與瀏覽器的刷新頻率保持同步惊科。如果瀏覽設備繪制間隔是16.7ms拍摇,那就按16.7ms這個間隔繪制;如果瀏覽設備繪制間隔是10ms馆截,就按10ms 繪制授翻。這樣就不會存在過度繪制的問題,動畫不會丟幀。

瀏覽器刷新頻率通常是每秒60次(大多數瀏覽器通常匹配W3C所建議的刷新率)堪唐,即每秒最多只能重繪60次巡语。
此外,一旦頁面處于閑置狀態(tài)淮菠,requestAnimationFrame 會自動暫停刷新男公。

優(yōu)勢:節(jié)省系統(tǒng)資源,提高系統(tǒng)性能合陵,改善視覺效果枢赔。
相比 CSS 動畫有更好的掌控,能合理降低CPU的使用拥知。
最小化的消耗資源踏拜,RAF在頁面被切換或瀏覽器最小化時,會暫停執(zhí)行低剔,等頁面再次關注時速梗,繼續(xù)執(zhí)行動畫。

2.語法:

重繪:   requestID = window.requestAnimationFrame(callback); 
取消重繪:window.cancleAnimationFrame(requestID);
  1. requestAnimationFrame 該方法接收一個回調函數作為參數襟齿,這個回調函數在瀏覽器重繪之前調用姻锁。返回一個代表此次任務ID的整數值。
  2. 回調函數callback可傳入一個參數猜欺,時間戳位隶。

用法類似于setTimeout,也是執(zhí)行一次回調开皿。

3. 兼容性 & polyfill

簡單兼容:

window.requestAnimationFrame = (function(){
    return window.requestAnimationFrame       ||
           window.webkitRequestAnimationFrame ||
           window.mozRequestAnimationFrame    ||
           function(callback) {
              window.setTimeout(callback, 1000/60)
           }
})().

完整版:

4. 動畫

緩動(Tween):

Linear:無緩動效果
Quadratic:二次方的緩動(t^2)
Cubic:三次方的緩動(t^3)
Quartic:四次方的緩動(t^4)
Quintic:五次方的緩動(t^5)
Sinusoidal:正弦曲線的緩動(sin(t))
Exponential:指數曲線的緩動(2^t)
Circular:圓形曲線的緩動(sqrt(1-t^2))
Elastic:指數衰減的正弦曲線緩動
超過范圍的三次方緩動((s+1)t^3 – st^2)
指數衰減的反彈緩動

借助 requestAnimationFrame 和上面的動畫算法涧黄,可以完成各種動畫效果。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末赋荆,一起剝皮案震驚了整個濱河市笋妥,隨后出現的幾起案子,更是在濱河造成了極大的恐慌糠睡,老刑警劉巖挽鞠,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疚颊,死亡現場離奇詭異狈孔,居然都是意外死亡,警方通過查閱死者的電腦和手機材义,發(fā)現死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門均抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其掂,你說我怎么就攤上這事油挥。” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵深寥,是天一觀的道長攘乒。 經常有香客問我,道長惋鹅,這世上最難降的妖魔是什么则酝? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮闰集,結果婚禮上沽讹,老公的妹妹穿的比我還像新娘。我一直安慰自己武鲁,他們只是感情好爽雄,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沐鼠,像睡著了一般挚瘟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迟杂,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天刽沾,我揣著相機與錄音,去河邊找鬼排拷。 笑死侧漓,一個胖子當著我的面吹牛,可吹牛的內容都是我干的监氢。 我是一名探鬼主播布蔗,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼浪腐!你這毒婦竟也來了纵揍?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤议街,失蹤者是張志新(化名)和其女友劉穎泽谨,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體特漩,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡吧雹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了涂身。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雄卷。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蛤售,靈堂內的尸體忽然破棺而出丁鹉,到底是詐尸還是另有隱情妒潭,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布揣钦,位于F島的核電站雳灾,受9級特大地震影響,放射性物質發(fā)生泄漏冯凹。R本人自食惡果不足惜佑女,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谈竿。 院中可真熱鬧团驱,春花似錦、人聲如沸空凸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呀洲。三九已至紊选,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間道逗,已是汗流浹背兵罢。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留滓窍,地道東北人卖词。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像吏夯,于是被迫代替她去往敵國和親此蜈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容