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 相关文章推荐
使Ext的Template可以解析二层的json数据的方法
Dec 22 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
Mar 18 Javascript
node.js下when.js 的异步编程实践
Dec 03 Javascript
jQuery中大家不太了解的几个方法
Mar 04 Javascript
JS图片等比例缩放方法完整示例
Aug 03 Javascript
使用Angular.js实现简单的购物车功能
Nov 21 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
浅谈ajax请求不同页面的微信JSSDK问题
Feb 26 Javascript
9102了,你还不会移动端真机调试吗
Mar 25 Javascript
Vue实现兄弟组件间的联动效果
Jan 21 Javascript
15分钟上手vue3.0(小结)
May 20 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 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 配置文件中open_basedir选项作用
2009/07/19 PHP
基于php使用memcache存储session的详解
2013/06/25 PHP
php+ajax实时刷新简单实例
2015/02/25 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
如何实现修改密码时密码框显示保存到cookie的密码
2013/12/10 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
js操作输入框提示信息且响应鼠标事件
2014/03/25 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
2016/10/31 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
谈谈JS中常遇到的浏览器兼容问题和解决方法
2016/12/17 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
vue element table 表格请求后台排序的方法
2018/09/28 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
[03:59]DOTA2英雄梦之声_第07期_水晶室女
2014/06/23 DOTA
[08:42]DOTA2每周TOP10 精彩击杀集锦vol.2
2014/06/25 DOTA
[15:35]教你分分钟做大人:天怒法师
2014/10/30 DOTA
Python实现冒泡,插入,选择排序简单实例
2014/08/18 Python
python numpy和list查询其中某个数的个数及定位方法
2018/06/27 Python
python中使用print输出中文的方法
2018/07/16 Python
使用python获取邮箱邮件的设置方法
2019/09/20 Python
python实现的按要求生成手机号功能示例
2019/10/08 Python
Python 捕获代码中所有异常的方法
2020/08/03 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
教师岗位职责范本
2013/12/29 职场文书
旅游管理毕业生自荐书
2014/02/02 职场文书
一名老师的自我评价
2014/02/07 职场文书
2014年教学工作总结
2014/11/13 职场文书
2014年招商引资工作总结
2014/11/22 职场文书
自荐信格式范文
2015/03/04 职场文书
行政助理岗位职责范本
2015/04/11 职场文书
2015年司法局工作总结
2015/05/22 职场文书
阿凡达观后感
2015/06/10 职场文书
javascript数组includes、reduce的基本使用
2021/07/02 Javascript