摘要:主要原因是因?yàn)榈膯尉€程機(jī)制使得其可能在有阻塞的情況下無法精確到毫秒觸發(fā)。另外在隱藏或不可見的元素中將不會(huì)進(jìn)行重繪或回流,大大降低了開銷。
以往JS控制的動(dòng)畫大多使用setInterval 或者setTimeout 每隔一段時(shí)間刷新元素的位置,來達(dá)到動(dòng)畫的效果,但是這種方式并不能準(zhǔn)確地控制動(dòng)畫幀率,盡管主流的瀏覽器對(duì)于這兩個(gè)函數(shù)實(shí)現(xiàn)的動(dòng)畫都有一定的優(yōu)化,但是這依然無法彌補(bǔ)它們性能問題。主要原因是因?yàn)镴avaScript的單線程機(jī)制使得其可能在有阻塞的情況下無法精確到毫秒觸發(fā)。
requestAnimationFrame()方法正是為了滿足高性能動(dòng)畫的需求而提供的API,通過setInterval方法控制的動(dòng)畫其調(diào)用的間隔由程序員設(shè)置,而requestAnimationFrame()無須設(shè)置調(diào)用間隔, 它自動(dòng)緊跟瀏覽器的繪制的幀率(一般瀏覽器的顯示幀率是60fps,差不多每幀間隔16.7ms)
關(guān)于過去的setInterval控制的動(dòng)畫與requestAnimationFrame()的效果的對(duì)比,這里引用‘艾倫’的帖子中的栗子。原帖地址?動(dòng)畫requestAnimationFrame
setInterval動(dòng)畫DEMO
requestAnimationFrame動(dòng)畫DEMO
點(diǎn)擊預(yù)覽以上兩個(gè)demo可以明顯感受到前者有點(diǎn)卡頓,后者更為流暢。
另外requestAnimationFrame()在隱藏或不可見的元素中將不會(huì)進(jìn)行重繪或回流,大大降低了開銷。關(guān)于該方法的其他細(xì)節(jié)見MDN文檔? window.requestAnimationFrame
以上都是廢話,多寫才能體會(huì)。這里我嘗試用該方法寫了個(gè)晃動(dòng)動(dòng)畫(點(diǎn)擊黑盒晃動(dòng),個(gè)人練習(xí)并沒有考慮兼容性):
動(dòng)畫練習(xí)DEMO
JS代碼:
//從網(wǎng)頁中獲取一個(gè)元素 var box = document.getElementById("box") shake(box, 500, 15) //接受三個(gè)參數(shù):動(dòng)畫元素,持續(xù)時(shí)間,晃動(dòng)距離 function shake(elm, dur, distance) { if (elm) { var dur = dur || 500 var distance = distance || 10 //保存原樣式 var original_css = elm.style.cssText elm.addEventListener("click", ani, false) } else { return "no param" } function ani() { var start = null requestAnimationFrame(act) //requestAnimationFrame每次調(diào)用向callback中傳入一個(gè)時(shí)間戳,時(shí)間戳為每次調(diào)用的時(shí)間點(diǎn) function act(time_stamp) { if(start === null) start = time_stamp var elapsed = time_stamp - start if ((elapsed / dur) < 1) { //乘以4PI,來回往復(fù)兩次, 使用正弦函數(shù)得到比例 elm.style.transform = "translateX(" + distance * Math.sin((elapsed / dur) * 4 * Math.PI) + "px" + ")" //調(diào)用該方法將返回一個(gè)ID值用于結(jié)束調(diào)用 var time_id = requestAnimationFrame(act) } else { //恢復(fù)原樣式,停止動(dòng)畫 elm.style.cssText = original_css cancelAnimationFrame(time_id) } } } }
在實(shí)際開發(fā)中, 當(dāng)然盡量使用css動(dòng)畫, 畢竟css動(dòng)畫性能更優(yōu)。但是對(duì)于一些復(fù)雜的動(dòng)畫,比如有暫停,繼續(xù)等復(fù)雜交互等動(dòng)畫還是需要requestAnimationFrame,在張?chǎng)涡翊笊竦倪@篇文章中CSS3動(dòng)畫那么強(qiáng),requestAnimationFrame還有毛線用? 深入淺出的闡釋了該方法, 另外他的demo中也有一個(gè)很直觀的栗子?
該方法其他參考資料mark下:
性能更好的js動(dòng)畫實(shí)現(xiàn)方式——requestAnimationFrame
HTML5探秘:用requestAnimationFrame優(yōu)化Web動(dòng)畫
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/106991.html
摘要:主要原因是因?yàn)榈膯尉€程機(jī)制使得其可能在有阻塞的情況下無法精確到毫秒觸發(fā)。另外在隱藏或不可見的元素中將不會(huì)進(jìn)行重繪或回流,大大降低了開銷。 以往JS控制的動(dòng)畫大多使用setInterval 或者setTimeout 每隔一段時(shí)間刷新元素的位置,來達(dá)到動(dòng)畫的效果,但是這種方式并不能準(zhǔn)確地控制動(dòng)畫幀率,盡管主流的瀏覽器對(duì)于這兩個(gè)函數(shù)實(shí)現(xiàn)的動(dòng)畫都有一定的優(yōu)化,但是這依然無法彌補(bǔ)它們性能問題。主...
摘要:主要原因是因?yàn)榈膯尉€程機(jī)制使得其可能在有阻塞的情況下無法精確到毫秒觸發(fā)。另外在隱藏或不可見的元素中將不會(huì)進(jìn)行重繪或回流,大大降低了開銷。 以往JS控制的動(dòng)畫大多使用setInterval 或者setTimeout 每隔一段時(shí)間刷新元素的位置,來達(dá)到動(dòng)畫的效果,但是這種方式并不能準(zhǔn)確地控制動(dòng)畫幀率,盡管主流的瀏覽器對(duì)于這兩個(gè)函數(shù)實(shí)現(xiàn)的動(dòng)畫都有一定的優(yōu)化,但是這依然無法彌補(bǔ)它們性能問題。主...
摘要:注本文章是在工作過程中所接觸的知識(shí)點(diǎn)的整理,涉及的東西比價(jià)雜亂,如有錯(cuò)誤之處,歡迎糾錯(cuò)與指導(dǎo)一,頁面的錨鏈接定義錨點(diǎn)錨點(diǎn)鏈接。類似于我們閱讀書籍時(shí)的目錄頁碼或章回提示。 *注:本文章是在工作過程中所接觸的知識(shí)點(diǎn)的整理,涉及的東西比價(jià)雜亂,如有錯(cuò)誤之處,歡迎糾錯(cuò)與指導(dǎo) 一, 頁面的錨鏈接 1,定義:錨點(diǎn),錨點(diǎn)鏈接。常常用于那些內(nèi)容龐大繁瑣的網(wǎng)頁,通過點(diǎn)擊命名錨點(diǎn),不僅讓我們能指向文檔,還...
摘要:注本文章是在工作過程中所接觸的知識(shí)點(diǎn)的整理,涉及的東西比價(jià)雜亂,如有錯(cuò)誤之處,歡迎糾錯(cuò)與指導(dǎo)一,頁面的錨鏈接定義錨點(diǎn)錨點(diǎn)鏈接。類似于我們閱讀書籍時(shí)的目錄頁碼或章回提示。 *注:本文章是在工作過程中所接觸的知識(shí)點(diǎn)的整理,涉及的東西比價(jià)雜亂,如有錯(cuò)誤之處,歡迎糾錯(cuò)與指導(dǎo) 一, 頁面的錨鏈接 1,定義:錨點(diǎn),錨點(diǎn)鏈接。常常用于那些內(nèi)容龐大繁瑣的網(wǎng)頁,通過點(diǎn)擊命名錨點(diǎn),不僅讓我們能指向文檔,還...
摘要:是新加的標(biāo)簽,主要有和,的應(yīng)用是動(dòng)畫和圖像,的應(yīng)用是游戲渲染。 HTML5 Canvas canvas是html5新加的標(biāo)簽,主要有2D和3D,2D的應(yīng)用是動(dòng)畫和圖像,3D的應(yīng)用是游戲渲染。 1. 2D基礎(chǔ) 1.1繪制線 canvas window.onload = function(){ ...
閱讀 1305·2021-11-23 09:51
閱讀 3421·2021-09-06 15:00
閱讀 995·2021-08-16 10:57
閱讀 1381·2019-08-30 12:46
閱讀 946·2019-08-29 12:22
閱讀 1614·2019-08-29 11:07
閱讀 3159·2019-08-26 11:23
閱讀 2992·2019-08-23 15:14