日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

性能更好的js动画实现方式——requestAnimationFrame

發(fā)布時間:2025/4/16 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 性能更好的js动画实现方式——requestAnimationFrame 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

用js來實現(xiàn)動畫,我們一般是借助setTimeout或setInterval這兩個函數(shù),css3動畫出來后,我們又可以使用css3來實現(xiàn)動畫了,而且性能和流暢度也得到了很大的提升。但是css3動畫還是有不少局限性,比如不是所有屬性都能參與動畫、動畫緩動效果太少、無法完全控制動畫過程等等。所以有的時候我們還是不得不使用setTimeout或setInterval的方式來實現(xiàn)動畫,可是setTimeout和setInterval有著嚴(yán)重的性能問題,雖然某些現(xiàn)代瀏覽器對這兩函個數(shù)進行了一些優(yōu)化,但還是無法跟css3的動畫性能相提并論。這個時候,就該requestAnimationFrame出馬了。

requestAnimationFrame 是專門為實現(xiàn)高性能的幀動畫而設(shè)計的一個API,目前已在多個瀏覽器得到了支持,包括IE10+,Firefox,Chrome,Safari,Opera等,在移動設(shè)備上,ios6以上版本以及IE mobile 10以上也支持requestAnimationFrame,唯一比較遺憾的是目前安卓上的原生瀏覽器并不支持requestAnimationFrame,不過對requestAnimationFrame的支持應(yīng)該是大勢所趨了,安卓版本的chrome 16+也是支持requestAnimationFrame的。

requestAnimationFrame 比起 setTimeout、setInterval的優(yōu)勢主要有兩點:

1、requestAnimationFrame 會把每一幀中的所有DOM操作集中起來,在一次重繪或回流中就完成,并且重繪或回流的時間間隔緊緊跟隨瀏覽器的刷新頻率,一般來說,這個頻率為每秒60幀。

2、在隱藏或不可見的元素中,requestAnimationFrame將不會進行重繪或回流,這當(dāng)然就意味著更少的的cpu,gpu和內(nèi)存使用量。

像setTimeout、setInterval一樣,requestAnimationFrame是一個全局函數(shù)。調(diào)用requestAnimationFrame后,它會要求瀏覽器根據(jù)自己的頻率進行一次重繪,它接收一個回調(diào)函數(shù)作為參數(shù),在即將開始的瀏覽器重繪時,會調(diào)用這個函數(shù),并會給這個函數(shù)傳入調(diào)用回調(diào)函數(shù)時的時間作為參數(shù)。由于requestAnimationFrame的功效只是一次性的,所以若想達到動畫效果,則必須連續(xù)不斷的調(diào)用requestAnimationFrame,就像我們使用setTimeout來實現(xiàn)動畫所做的那樣。requestAnimationFrame函數(shù)會返回一個資源標(biāo)識符,可以把它作為參數(shù)傳入cancelAnimationFrame函數(shù)來取消requestAnimationFrame的回調(diào)。怎么樣,是不是也跟setTimeout的clearTimeout很相似啊。

所以,可以這么說,requestAnimationFrame就是一個性能優(yōu)化版、專為動畫量身打造的setTimeout,不同的是requestAnimationFrame不是自己指定回調(diào)函數(shù)運行的時間,而是跟著瀏覽器內(nèi)建的刷新頻率來執(zhí)行回調(diào),這當(dāng)然就能達到瀏覽器所能實現(xiàn)動畫的最佳效果了。

目前,各個支持requestAnimationFrame的瀏覽器有些還是自己的私有實現(xiàn),所以必須加前綴,對于不支持requestAnimationFrame的瀏覽器,我們只能使用setTimeout,因為兩者的使用方式幾近相同,所以這兩者的兼容并不難。對于支持requestAnimationFrame的瀏覽器,我們使用requestAnimationFrame,而不支持的我們優(yōu)雅降級使用傳統(tǒng)的setTimeout。把它們封裝一下,就能得到一個統(tǒng)一兼容各大瀏覽器的API了。

代碼可以到這里來查看:https://gist.github.com/chaping/88813f56e75b0fd43f8c

var lastTime = 0; var prefixes = 'webkit moz ms o'.split(' '); //各瀏覽器前綴var requestAnimationFrame = window.requestAnimationFrame; var cancelAnimationFrame = window.cancelAnimationFrame;var prefix; //通過遍歷各瀏覽器前綴,來得到requestAnimationFrame和cancelAnimationFrame在當(dāng)前瀏覽器的實現(xiàn)形式 for( var i = 0; i < prefixes.length; i++ ) {if ( requestAnimationFrame && cancelAnimationFrame ) {break;}prefix = prefixes[i];requestAnimationFrame = requestAnimationFrame || window[ prefix + 'RequestAnimationFrame' ];cancelAnimationFrame = cancelAnimationFrame || window[ prefix + 'CancelAnimationFrame' ] || window[ prefix + 'CancelRequestAnimationFrame' ]; }//如果當(dāng)前瀏覽器不支持requestAnimationFrame和cancelAnimationFrame,則會退到setTimeout if ( !requestAnimationFrame || !cancelAnimationFrame ) {requestAnimationFrame = function( callback, element ) {var currTime = new Date().getTime();//為了使setTimteout的盡可能的接近每秒60幀的效果var timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ); var id = window.setTimeout( function() {callback( currTime + timeToCall );}, timeToCall );lastTime = currTime + timeToCall;return id;};cancelAnimationFrame = function( id ) {window.clearTimeout( id );}; }//得到兼容各瀏覽器的API window.requestAnimationFrame = requestAnimationFrame; window.cancelAnimationFrame = cancelAnimationFrame;

這樣子我們就能在所有瀏覽器上使用requestAnimationFrame和cancelAnimationFrame了。

下面舉個簡單的例子來說明怎么運用requestAnimationFrame進行動畫,下面的代碼會將id為demo的div以動畫的形式向右移動到300px

<div id="demo" style="position:absolute; width:100px; height:100px; background:#ccc; left:0; top:0;"></div><script> var demo = document.getElementById('demo'); function rander(){demo.style.left = parseInt(demo.style.left) + 1 + 'px'; //每一幀向右移動1px } requestAnimationFrame(function(){rander();//當(dāng)超過300px后才停止if(parseInt(demo.style.left)<=300) requestAnimationFrame(arguments.callee); }); </script>

?

參考資料:

http://www.paulirish.com/2011/requestanimationframe-for-smart-animating/

http://msdn.microsoft.com/zh-cn/library/ie/hh920765(v=vs.85).aspx

https://developer.mozilla.org/zh-CN/docs/Web/API/window.requestAnimationFrame


總結(jié)

以上是生活随笔為你收集整理的性能更好的js动画实现方式——requestAnimationFrame的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国内精品偷拍 | 先锋影视av | 婷婷另类小说 | 精品日韩在线 | 欧美日韩在线观看成人 | 天天干狠狠干 | 免费毛片一区二区三区 | www网站在线免费观看 | 亚洲欧美日韩动漫 | 看免费一级片 | 亚洲国产一区在线观看 | 一本久久精品一区二区 | 欧美一级做性受免费大片免费 | 亚洲v国产v欧美v久久久久久 | 啪啪自拍视频 | 97成人超碰| 日产精品久久久久久久蜜臀 | 蜜臀人妻四季av一区二区不卡 | 国产天堂 | 国模在线 | 草草影院国产 | 在线观看免费人成视频 | 日本妈妈3| 国产美女主播 | 动漫av在线免费观看 | 法国少妇愉情理伦片 | 国产高清不卡 | 中文字幕久久久久久久 | youjizz.com日本| 日韩黄色一级 | 国产成人精品视频ⅴa片软件竹菊 | 久久成人福利 | 丰满熟妇乱又伦 | 狠狠躁天天躁夜夜躁婷婷 | 欧美中文字幕 | 精品麻豆一区二区 | 人人干夜夜操 | 精品二区在线观看 | 日本夜夜操 | 欧美不卡在线 | 超碰caoporen | 天天爽影院| 日韩人妻无码一区二区三区 | 亚洲图片小说视频 | 九月丁香婷婷 | 男人操女人的软件 | 天天摸天天做天天爽 | 中文字幕一区二区三区乱码 | 调教在线观看 | 亚洲不卡在线观看 | 免费黄色网址在线 | 一个色在线视频 | 国产一av | 欧美特黄一级 | 四虎成人影视 | 四虎在线看片 | 91精品国产闺蜜国产在线闺蜜 | www日日日| 成人手机在线观看 | 欧美孕交视频 | 日韩精品一级 | 免费网站在线观看黄色 | www.嫩草.com| 男同互操gay射视频在线看 | 亚洲国产精品网站 | 日本在线黄色 | 欧美色视频一区二区三区 | 久久综合成人网 | 少妇毛片一区二区三区 | 中文字幕免费中文 | 日日夜夜91 | 国产福利小视频 | 女优色图| 国产原创剧情av | 国产精品一区二区毛片 | 非洲黑寡妇性猛交视频 | 欧美日韩国产在线 | 成人欧美一区二区三区黑人孕妇 | 一区二区高清 | 幸福,触手可及 | 成人动作片| hd丰满圆润的女人hd | 清纯唯美亚洲综合 | 在线 色| 国产亚洲一区二区在线 | 亚洲av成人一区二区 | 美女打屁股网站 | 最新中文字幕免费 | 日韩伦理在线视频 | 欧美三区在线观看 | 欧美粗暴se喷水 | 无码日韩人妻精品久久蜜桃 | 熟女视频一区二区三区 | 综合激情在线 | 中国国产bdsm紧缚捆绑 | 日b在线观看 | 一级片在线播放 | 人人澡超碰碰97碰碰碰 | 美女福利一区 |