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 相关文章推荐
jQuery 相关控件的事件操作分解
Aug 03 Javascript
几个比较经典常用的jQuery小技巧
Mar 01 Javascript
jQuery使用toggleClass方法动态添加删除Class样式的方法
Mar 26 Javascript
JS 动态加载js文件和css文件 同步/异步的两种简单方式
Sep 23 Javascript
解析微信JS-SDK配置授权,实现分享接口
Dec 09 Javascript
BootStrap Tooltip插件源码解析
Dec 27 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
Sep 19 Javascript
基于vue2.x的电商图片放大镜插件的使用
Jan 22 Javascript
基于ionic实现下拉刷新功能
May 10 Javascript
vue项目实现github在线预览功能
Jun 20 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
vue获取验证码倒计时组件
Aug 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采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
2019/10/11 PHP
jquery.validate使用攻略 第二部
2010/07/01 Javascript
jquery五角星评分插件示例分享
2014/02/21 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
2015/10/29 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
js方法数据验证的简单实例
2016/09/17 Javascript
使用Angular.js实现简单的购物车功能
2016/11/21 Javascript
js 数据存储和DOM编程
2017/02/09 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
详解JS预解析原理
2020/06/16 Javascript
Python实现从URL地址提取文件名的方法
2015/05/15 Python
python保存字符串到文件的方法
2015/07/01 Python
详解Python使用simplejson模块解析JSON的方法
2016/03/24 Python
Python中datetime模块参考手册
2017/01/13 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python标记语句块使用方法总结
2019/08/05 Python
基于Python 中函数的 收集参数 机制
2019/12/21 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
Python SSL证书验证问题解决方案
2020/01/13 Python
Python自动采集微信联系人的实现示例
2020/02/28 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
python如何将图片转换素描画
2020/09/08 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
Ajax的工作原理
2015/12/04 面试题
美容院店长岗位职责
2014/04/08 职场文书
2016大学军训通讯稿
2015/11/25 职场文书
2016优秀护士先进个人事迹材料
2016/02/25 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
一文搞懂php的垃圾回收机制
2021/06/18 PHP