haohaio
努力学习,艰苦奋斗
写写代码,记记笔记
使用 requestAnimationFrame() 方法让做动画
不要用 setInterval() 或 setTimeout() 来做动画 setInterval() 与 setTimeout() 并不能提供和制作动画所需的精准计时机制。它们只是让应用程序能在某个大致时间点上运行代码的通用方法而已。
不应主动命令浏览器何时去绘制下一帧动画,这应有浏览器通知你 在调用 setInterval() 与 setTimeout() 时,开发者会主动告知浏览器绘制下一帧动画的时间。然而,调用者并不知道绘制下一帧动画的最佳时机,浏览器肯定比开发者更了解这个时机。所以应该让浏览器在它觉得可以绘制下一帧动画时通知我们。
function animate (time ) { requsetAnimationFrame(animate); } requestAnimationFrame(animate);
requestAnimationFrame() 不需要调用者指定帧速率,浏览器会自行决定最佳的帧速率
我们还可以调用 cancelRequestAnimationFrame(long handle) 方法来将原来 requestAnimationFrame() 方法所注册的函数回调给取消执行。requestAnimationFrame() 方法会返回一个 long 型的对象,用作标识回调函数的句柄 (handle),可传入 cancelRequestAnimationFrame() 方法来取消回调函数的执行。
但是 requestAnimationFrame() 的兼容性并不是很好,只兼容到了 IE10 以及以后的版本。我们可以定义一个 “Polyill式方法” 来向下兼容,具体代码如下:
window .requestNextAnimationFrame = (function ( ) { var originalWebkitRequestAnimationFrame = undefined , wrapper = undefined , callback = undefined , geckoVersion = 0 , userAgent = navigator.userAgent, index = 0 , self = this ; if (window .webkitRequestAnimationFrame) { wrapper = function (time ) { if (time === undefined ) { time = +new Date (); } self.callback(time); }; originalWebkitRequestAnimationFrame = window .webkitRequestAnimationFrame; window .webkitRequestAnimationFrame = function (callback, element ) { self.callback = callback; originalWebkitRequestAnimationFrame(wrapper, element); } } if (window .mozRequestAnimationFrame) { index = userAgent.indexOf('rv:' ); if (userAgent.indexOf('Gecko' ) != -1 ) { geckoVersion = userAgent.substr(index + 3 , 3 ); if (geckoVersion === '2.0' ) { window .mozRequestAnimationFrame = undefined ; } } } return window .requestAnimationFrame || window .webkitRequestAnimationFrame || window .mozRequestAnimationFrame || window .oRequestAnimationFrame || window .msRequestAnimationFrame || function (callback, element ) { var start, finish; window .setTimeout(function ( ) { start = +new Date (); callback(start); finish = +new Date (); self.timeout = 1000 / 60 - (finish - start); }, self.timeout); }; })();
本文代表个人观点,内容仅供参考。若有不恰当之处,望不吝赐教!
Please enable JavaScript to view the comments powered by
Disqus.