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 相关文章推荐
js模拟滚动条(横向竖向)
Feb 22 Javascript
JS中图片缓冲loading技术的实例代码
Aug 29 Javascript
js 判断登录界面的账号密码是否为空
Feb 08 Javascript
js实现网页定位导航功能
Mar 07 Javascript
vue之浏览器存储方法封装实例
Mar 15 Javascript
angularJs使用ng-repeat遍历后选中某一个的方法
Sep 30 Javascript
微信小程序实现基于三元运算验证手机号/姓名功能示例
Jan 19 Javascript
详解vue引入子组件方法
Feb 12 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
Vue中props的详解
May 16 Javascript
原生js代码能实现call和bind吗
Jul 31 Javascript
Element Dropdown下拉菜单的使用方法
Jul 26 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 chmod 函数与批量修改文件目录权限
2010/05/10 PHP
php使用PDO操作MySQL数据库实例
2014/12/30 PHP
Codeigniter检测表单post数据的方法
2015/03/21 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
PHP中Cookie的使用详解(简单易懂)
2017/04/28 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
php查看一个变量的占用内存的实例代码
2020/03/29 PHP
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
JS不完全国际化&本地化手册 之 理论篇
2016/09/27 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
vue写一个组件
2018/04/09 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
node.js文件操作系统实例详解
2019/11/05 Javascript
[13:39]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第一场
2014/05/26 DOTA
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
[47:38]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
简单了解python 生成器 列表推导式 生成器表达式
2019/08/22 Python
使用Fabric自动化部署Django项目的实现
2019/09/27 Python
住房公积金接收函
2014/01/09 职场文书
收银员的岗位职责范本
2014/02/04 职场文书
小学生优秀评语
2014/12/29 职场文书
2015年库房管理工作总结
2015/10/14 职场文书
辞职信怎么写?
2019/05/21 职场文书
创业计划书之淘宝网店
2019/10/08 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python