js利用H5的requestAnimationFrame()API實現動畫效果
爲何要使用requestAnimationFrame:
- 咱們知道,瀏覽器實現動畫繪製無非就是CSS3的動畫屬性
transition
,aniamtion
和JavaScript的setTImeOut
和setInterval
方法(進行DOM的樣式循環改變達到動畫效果)。說到這可能不少同窗都有疑問了,既然有CSS的動畫屬性這麼方便的東西了,爲什麼還要用setTimeOut
等js方法這麼麻煩呢?咱們首先來解決這個疑問。
- CSS3的動畫屬性與JavaScript的動畫方法:
- 一個事物的存在必有其存在的道理,api也不例外,否則早被淘汰了。首先CSS3的動畫屬性是存在兼容問題的,最明顯的就是IE10以後才兼容。而目前主流的向下兼容的標準仍是要達到IE9的,因此
setTImeOut
等js方法仍是主流的動畫解決方案。
- 有些動畫效果CSS3沒法實現,如改變元素
scrollTop
的值進行滾動,這樣就只能使用js的相關方法了。
- CSS3的動畫沒法實現過於複雜的動畫效果,如CSS3支持控制動畫速度賽貝爾曲線的數值有限,更復雜的動畫效果得使用js結合相關算法才能完成
- 接着回到正題哈, 那
requestAnimationFrame
有setTimeOut
和setInterval
又有和區別呢,嗯,接下來就是正題了。
setTimeOut
和setInterval
出現的問題:
- 首先,咱們得知道動畫的渲染是一幀一幀的進行的,每一幀就是動畫的一個靜止狀態,每一幀連起來就成爲了一個動畫。所以每一幀的時間間隔要足夠短動畫才顯得平滑流暢,但每一幀又不能間隔得過短,由於瀏覽器每一秒的渲染能是有限的,並且屏幕的刷新能力也是有限的,大多數的顯示器刷新頻率是60H也就是每秒60幀,所以瀏覽器的重繪頻率不會超過顯示器的刷新頻率。
- 因此每一幀大約17秒就是最佳的重繪間隔。那使用就直接使用
setTimeOut
或者setInterval
,間隔設置爲17不就得了?但這樣仍是不行的。
- 因瀏覽器的毫秒不精確:瀏覽器的計時器精度並不是精確到毫秒級的,IE8的精確度是15ms多一點,而IE9等大多數的瀏覽器精確度都在4ms差很少。因此難以保證動畫最佳的時間間隔。
- 不一樣的瀏覽器渲染能力不一樣,所以並不是每一幀17ms就是最佳渲染間隔。
- 在不須要動畫的地方,如後臺標籤頁,動畫任然在運行,消耗CPU的性能。
- 所以,h5的
requestAnimationFrame
就是解決以上問題的。
- requestAnimationFrame的特色:
requestAnimationFrame
會把每一幀中全部的DOM操做集中起來,在一次重繪或者重排中就完成。
requestAnimationFrame
重繪或者重排的時間間隔是系統的時間間隔,由於不一樣的瀏覽器的系統時間間隔不一樣,requestAnimationFrame
將會保持最佳的繪製間隔,即不會由於繪製間隔時間太短而形成瀏覽器渲染能力跟不上,也不會由於繪製間隔時間過長,而形成動畫卡頓。這樣就能在不一樣的瀏覽器中實現最佳的繪製效果。
- 在隱藏或者不可見的元素中,
requestAnimationFrame
將不會進行重排或者重繪,而運行在頁面沒有激活的狀況下,如requestAnimationFrame
運行在後臺標籤頁中,動畫將會暫停,有效的節省了CPU的開銷。
- 那麼,該如何使用
requestAnimationFrame
呢?
requestAnimationFrame的具體使用:
requestAnimationFrame
使用很是簡單,只需傳入改變DOM的函數,而後反覆調用requestAnimationFrame
便可達到動畫效果了。requestAnimationFrame返回一個整數型請求id的,能夠用cancelAnimationFrame
函數去取消傳入requestAnimationFrame
的回調函數。具體使用能夠看MDN的教程。
後話:
歡迎關注本站公眾號,獲取更多信息