容易被忽視的RequestAnimationFrame

傳統(tǒng)的JS動畫都是用 setTimeout 和 setInterval 實現(xiàn)的邑蒋,后來無意中在網(wǎng)上看到一個新的JS函數(shù) requestAnimationFrame 用它來替代傳統(tǒng)的JS動畫方法,說是效果更好,當(dāng)時也沒有仔細深究。直到昨天去魅族面試的時候庆锦,面試官問我有什么新的辦法可以替代傳統(tǒng)的JS動畫,我說“我知道一個叫 requestAnimationFrame 的函數(shù),它的執(zhí)行效果更好”携御。但是讓我仔細描述的時候,我就說不下去了既绕,這也是我寫這篇博客的初衷啄刹,我們學(xué)習(xí)的過程中一定要知其然比知其所以然,不要什么都略懂凄贩,最后落得跟半吊子一樣誓军。

定時器一直都是JS動畫的核心技術(shù)。而編寫動畫循環(huán)的關(guān)鍵是要知道延遲時間多長合適疲扎。一方面昵时,循環(huán)間隔必須足夠短,這樣才能讓不同的動畫效果顯得平滑流暢椒丧;另一方面壹甥,循環(huán)間隔還要足夠長,才能確保瀏覽器有能力渲染產(chǎn)生的變化壶熏。

大多數(shù)電腦顯示器的刷新頻率是60HZ句柠,也就是每秒鐘重繪60次。大多數(shù)瀏覽器都會對重繪操作加以限制,不超過顯示器的重繪頻率溯职,因為即使超過那個頻率用戶體驗也不會提升管怠。因此,最平滑動畫的最佳循環(huán)間隔是 1000ms / 60 缸榄,約為16.7ms渤弛。

傳統(tǒng)的 setTimeout 和 setInterval 它們都不是很精確,因為它們實際上只是把動畫代碼添加到瀏覽器UI線程隊尾以等待執(zhí)行時間甚带,如果它們前面有其它任務(wù)她肯,則必須等前面的任務(wù)執(zhí)行完在執(zhí)行動畫代碼。

而 requestAnimationFrame 采用系統(tǒng)時間間隔鹰贵,讓各種動畫效果能夠有一個統(tǒng)一的刷新機制晴氨,從而節(jié)省系統(tǒng)資源,提高系統(tǒng)性能碉输,改善視覺效果籽前。它有如下三個特點:

  • 會把每一幀中所有的DOM操作集中起來,在一次動畫操作就完成敷钾,并且動畫的時間間隔緊緊跟隨瀏覽器的刷新頻率(不需要設(shè)置時間間隔)枝哄。
  • 在隱藏或者不可見的元素中,不會進行動畫操作阻荒。
  • 當(dāng)瀏覽器不是激活狀態(tài)挠锥,不會進行動畫操作。

下面是一個兼容所有瀏覽器的使用 requestAnimationFrame 的代碼(IE9-無該方法)

(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.7 - (currTime - lastTime));
            var id = setTimeout(function() {
                callback(currTime + timeToCall);
            }, timeToCall);
            lastTime = currTime + timeToCall;
            return id;
        }
    }
    if (!window.cancelAnimationFrame) {
        window.cancelAnimationFrame = function(id) {
            clearTimeout(id);
        }
    }
}());

最后附上我利用 requestAnimationFrame 制作的一個 跳動的小球 的DEMO侨赡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓖租,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子羊壹,更是在濱河造成了極大的恐慌蓖宦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件油猫,死亡現(xiàn)場離奇詭異稠茂,居然都是意外死亡,警方通過查閱死者的電腦和手機眨攘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門主慰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嚣州,“玉大人鲫售,你說我怎么就攤上這事「秒龋” “怎么了情竹?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長匀哄。 經(jīng)常有香客問我秦效,道長雏蛮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任阱州,我火速辦了婚禮挑秉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苔货。我一直安慰自己犀概,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布夜惭。 她就那樣靜靜地躺著姻灶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诈茧。 梳的紋絲不亂的頭發(fā)上产喉,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音敢会,去河邊找鬼曾沈。 笑死,一個胖子當(dāng)著我的面吹牛鸥昏,可吹牛的內(nèi)容都是我干的晦譬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼互广,長吁一口氣:“原來是場噩夢啊……” “哼敛腌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起惫皱,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤像樊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后旅敷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體生棍,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年媳谁,在試婚紗的時候發(fā)現(xiàn)自己被綠了涂滴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡晴音,死狀恐怖柔纵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锤躁,我是刑警寧澤搁料,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響郭计,放射性物質(zhì)發(fā)生泄漏霸琴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一昭伸、第九天 我趴在偏房一處隱蔽的房頂上張望梧乘。 院中可真熱鬧,春花似錦庐杨、人聲如沸宋下。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽学歧。三九已至,卻和暖如春各吨,著一層夾襖步出監(jiān)牢的瞬間枝笨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工揭蜒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横浑,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓屉更,卻偏偏與公主長得像徙融,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瑰谜,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

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

  • 一:在制作一個Web應(yīng)用或Web站點的過程中欺冀,你是如何考慮他的UI、安全性萨脑、高性能隐轩、SEO、可維護性以及技術(shù)因素的...
    Arno_z閱讀 1,160評論 0 1
  • requestAnimationFrame這個API渤早,可能很多人都聽過职车,但并沒有真正用過。MDN上的解釋是: wi...
    Perkin_閱讀 3,547評論 0 4
  • 看了很多視頻鹊杖、文章悴灵,最后卻通通忘記了,別人的知識依舊是別人的骂蓖,自己卻什么都沒獲得积瞒。此系列文章旨在加深自己的印象,因...
    DCbryant閱讀 725評論 0 2
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫涯竟、插件赡鲜、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 晚上空厌,許林一陪著翩翩打點滴庐船。翩翩的高燒退了银酬,精神略微恢復(fù)的她不再老老實實地坐在座位上,她在自己的活動范圍內(nèi)釋放著還...
    梅花貓閱讀 503評論 1 2