window.requestAnimationFrame是什么意思,怎么用


Posted in Javascript onJanuary 13, 2013

再看别人实现粒子效果的时候会有以下代码

window.requestAnimationFrame || (window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame 
|| window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
function(callback, element) { 
return window.setTimeout(function() { 
return callback(+new Date()); 
}, 1000 / 60) 
});

这个到底是什么意思,它又是怎么用的呢?
window.requestAnimationFrame 告诉浏览器您要执行的动画并且请求浏览器的在下一个动画帧重绘窗口。该方法在浏览器重绘之前作为一个回调函数被调用。
就是告诉浏览器在刷新屏幕的时候,调用这个方法。

window.requestAnimationFrame的前世今生
在90年代,那个互联网做广告的年代,window上面各种走马灯,各种状态文字都是用setTimeout来时实现的,如下:

(function(){ 
function update(){ 
setTimeout(update,1000) 
} 
setTimeout(update,1000) 
})(); 
(function(){ 
function update(){ 
// 
} 
setInterval(update,1000) 
})();

动画的问题最棘手的是延时问题,对于显示器来说,每一秒60帧频,如果我们按照浏览器的刷新速率来控制我们的动画时间的话会有很好的效果,即17ms,setTimeout(callback,1000/60),但是:
1.各个浏览器及时精度是不一样的。
2.对于setTimeout 和setInterval 实现机制并不是我们需要的那样,当经过特定的时间后,浏览器会将那部分代码加入到UI的绘制队列当中,如果这个时候UI线程很忙,有其它的任务阻塞,动画的下一帧就不会按时执行。经过长时间的累计堆加之后,可能我们偏离原来的时间点误差越来越大。

Mozilla 的 Robert O'Callahan 在思考这个问题,并想出了一个独特的方案。他指出CSS transitions 和 animations的优势在于浏览器知道哪些动画将会发生,所以得到正确的间隔来刷新UI。而javascript动画,浏览器不知道动画正在发生。他的解决方案是创建一个mozRequestAnimationFrame()方法来告诉浏览器哪些javascript代码正在执行,这使得浏览在执行一些代码后得到优化。

mozRequestAnimationFrame()方法接受一个参数,是一个屏幕重绘前被调用的函数。这个函数用来对生成下合适的dom样式的改变,这些改变用在下一次重绘中。你可以像调用setTimeout()一样的方式链式调用mozRequestAnimationFrame()。
这个就是window.requestAnimationFrame的由来。

在Mozilla官网看到如下
Because this technology's specification has not stabilized, check the compatibility table for the proper prefixes to use in various browsers. Also note that the syntax and behavior of an experimental technology is subject to change in future version of browsers as the spec changes.
由于这项技术的规范还没有稳定,正确的前缀使用在各种浏览器的兼容性表。还要注意的是语法和行为的实验技术是如有改变,在未来版本的浏览器的规格变化。

目前在Android系统下是不支持的,动画只能setTimeout咯。

Javascript 相关文章推荐
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
Apr 13 Javascript
JavaScript将相对地址转换为绝对地址示例代码
Jul 19 Javascript
JavaScript实现广告的关闭与显示效果实例
Jul 02 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
js实现新浪微博首页效果
Oct 16 Javascript
[js高手之路]寄生组合式继承的优势详解
Aug 28 Javascript
jQuery实现的简单动态添加、删除表格功能示例
Sep 21 jQuery
微信小程序分享海报生成的实现方法
Dec 10 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
Apr 25 Javascript
JS判断浏览器类型与操作系统的方法分析
Apr 30 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
Jul 31 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 Javascript
jquery获取div宽度的实现思路与代码
Jan 13 #Javascript
jQuery实现用方向键控制层的上下左右移动
Jan 13 #Javascript
js模仿html5 placeholder适应于不支持的浏览器
Jan 13 #Javascript
ie6下png图片背景不透明的解决办法使用js实现
Jan 11 #Javascript
关于全局变量和局部变量的那些事
Jan 11 #Javascript
jquery延迟加载外部js实现代码
Jan 11 #Javascript
jquery.bgiframe.js在IE9下提示INVALID_CHARACTER_ERR错误
Jan 11 #Javascript
You might like
PHP实现Socket服务器的代码
2008/04/03 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
php中Redis的应用--消息传递
2017/03/28 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
2018/10/14 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
jquery鼠标滑过提示title具体实现代码
2013/08/06 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
JQuery解析HTML、JSON和XML实例详解
2014/03/29 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
浅谈jquery回调函数callback的使用
2015/01/30 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
angular基于ng-alain定义自己的select组件示例
2018/02/23 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
vue基础之事件简写、事件对象、冒泡、默认行为、键盘事件实例分析
2019/03/11 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
Vue实现省市区三级联动
2020/12/27 Vue.js
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
用Python进行基础的函数式编程的教程
2015/03/31 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
详解PyCharm配置Anaconda的艰难心路历程
2018/08/13 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
提升Python效率之使用循环机制代替递归函数
2019/07/23 Python
Python字典推导式将cookie字符串转化为字典解析
2019/08/10 Python
Python之qq自动发消息的示例代码
2021/02/18 Python
体育专业个人的求职信范文
2013/09/21 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014年节能减排工作总结
2014/12/06 职场文书
青年文明号汇报材料
2014/12/23 职场文书
道德与公民自我评价
2015/03/09 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis
Spring中的@Transactional的工作原理
2022/06/05 Java/Android