requestAnimationFrame()用法
在此之前,我們要在頁面實現動畫有以下幾種方式:
(1).使用css3的相關屬性。
(2).使用canvas。
(3).使用setTimout()或者setInterval()。
使用setTimout()或者setInterval()這兩個定時器函式實現動畫是最為原始簡單的方式,但是缺點也很大。
最重要的一個缺點就是有可能出現丟幀現象;現在大部分瀏覽器的重新整理頻率是16.7ms,當你當定時器函式的時間間隔小於這個值,比如是10ms就會發生丟幀;下面粗略描繪一下這個過程:
(1).當第一個繪製請求到來,並繪製完成,瀏覽器重新整理一次,完全沒有問題,頁面上顯示此次繪製的效果。
(2).10ms以後第二個繪製請求到來,並繪製完成,那麼需要等待6.7ms才能顯示此次繪製效果。
(3).第二次繪製完成之後3.3ms,第三次請求繪製到來,這時候距離第三次瀏覽器重新整理還需要13.4ms,當第四次繪製請求到來,第三次重新整理還沒有到來;那麼當三次重新整理到來的時候,第三次繪製請求的效果就會被第四次的效果所覆蓋,這也就是所謂的丟幀。
requestAnimationFrame()方法從名稱看 ,就是專門設計用來完成動畫的,並且它是跟隨瀏覽器的重新整理頻率,如果瀏覽器的重新整理頻率是16.7ms,那麼它就間隔16.7ms繪製,如果重新整理頻率是10ms,那麼就間隔10ms繪製。
主要優點如下:
(1).requestAnimationFrame會把每一幀中的所有DOM操作集中起來,在一次重繪或迴流中就完成,並且重繪或迴流的時間間隔緊緊跟隨瀏覽器的重新整理頻率,一般來說,這個頻率為每秒60幀
(2).隱藏或不可見的元素或者非當前啟用選項卡頁面,requestAnimationFrame將不會進行重繪或迴流,這當然就意味著更少的的cpu,gpu和記憶體使用量。在老版本的瀏覽器中,setTimeout()或者setInterval()在非啟用的選項卡頁面中也會照常執行,據說在當前的谷歌和火狐瀏覽器中,這兩個方法得到了優化,具有和
requestAnimationFrame()類似的行為,當頁面處於閒置狀態的時候,如果定時間隔小於1000ms,則停止了定時器的執行,不過時間間隔大於或等於1000ms,定時器依然執行,即使頁面最小化或非啟用狀態。
程式碼例項如下:
[HTML] 純文字檢視 複製程式碼<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title>螞蟻部落</title> <style> #antzone { width:1px; height:17px; background:#0f0; } </style> <script> window.onload=function(){ window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; var start = null; var ele = document.getElementById("antzone"); var progress = 0; function step() { progress += 1; ele.style.width = progress + "%"; ele.innerHTML = progress + "%"; if (progress < 100) { requestAnimationFrame(step); } } requestAnimationFrame(step); document.getElementById("run").addEventListener("click", function () { ele.style.width = "1px"; progress = 0; requestAnimationFrame(step); }, false); } </script> </head> <body> <div id="antzone">0%</div> <input type="button" value="檢視演示" id="run" /> </body> </html>
和setInterval()類似,返回值也是一個標識,使用cancelAnimationFrame()可以停止動畫的執行。
相關文章
- requestAnimationFrame用法requestAnimationFrame
- requestAnimationFrame 知多少?requestAnimationFrame
- 有關requestAnimationFramerequestAnimationFrame
- 【譯】前端requestAnimationFrame概述前端requestAnimationFrame
- requestAnimationFrame中完成想要的渲染requestAnimationFrame
- requestAnimationFrame 執行機制探索requestAnimationFrame
- HTML5動畫API—— requestAnimationFrameHTML動畫APIrequestAnimationFrame
- 定時器(setInterval、setTimeout 和requestAnimationFrame)定時器requestAnimationFrame
- 你知道的requestAnimationFrame【從0到0.1】requestAnimationFrame
- JS動畫三劍客——setTimeout、setInterval、requestAnimationFrameJS動畫requestAnimationFrame
- 深入理解HTML5定時器requestAnimationFrameHTML定時器requestAnimationFrame
- requestAnimationFrame實現一幀的函式節流requestAnimationFrame函式
- requestAnimationFrame在EventLoop的什麼階段執行?requestAnimationFrameOOP
- js利用H5的requestAnimationFrame()API實現動畫效果JSH5requestAnimationFrameAPI動畫
- 效能最佳化之通俗易懂學習requestAnimationFrame和使用場景舉例requestAnimationFrame
- Qdrant用法;Qdrant在langchain裡的用法LangChain
- Yii2-application用法 (Yii::$app用法)APP
- __kindof用法
- JavaScript this用法JavaScript
- SVN用法
- static用法
- getComputedStyle() 用法
- JSONP 用法JSON
- phpstrtr()用法PHP
- crm用法
- sed用法
- typedef用法
- union用法
- GPG 用法
- seqkit用法
- sessionStorage 用法Session
- localStorage 用法
- SQLserver With As 用法SQLServer
- WebSocket 用法Web
- Screen 用法
- replace()用法
- VotingClassifier用法GC
- Hydra用法
- unique 用法