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 相关文章推荐
了不起的node.js读书笔记之mongodb数据库交互
Dec 22 Javascript
javascript基础语法学习笔记
Jan 04 Javascript
在AngularJS框架中处理数据建模的方式解析
Mar 05 Javascript
Jquery获取第一个子元素简单实例
Jun 02 Javascript
Bootstrap Img 图片样式(推荐)
Dec 13 Javascript
jQuery延迟执行的实现方法
Dec 21 Javascript
js实现符合国情的日期插件详解
Jan 19 Javascript
react.js CMS 删除功能的实现方法
Apr 17 Javascript
Agularjs妙用双向数据绑定实现手风琴效果
May 26 Javascript
javascript算法之二叉搜索树的示例代码
Sep 12 Javascript
JavaScript对象的浅拷贝与深拷贝实例分析
Jul 25 Javascript
vue操作下拉选择器获取选择的数据的id方法
Aug 24 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
header导出Excel应用示例
2014/01/24 PHP
PHP整合PayPal支付
2015/06/11 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
Javascript 对象的解释
2008/11/24 Javascript
javascript 显示当前系统时间代码
2009/12/28 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
客户端 使用XML DOM加载json数据的方法
2010/09/28 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
jquery通过visible来判断标签是否显示或隐藏
2014/05/08 Javascript
JavaScript通过元素的ID和name设置样式
2014/07/08 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
AngularJS转换响应内容
2016/01/27 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
AngularJS延迟加载html template
2016/07/27 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
微信小程序实现打开并下载服务器上面的pdf文件到手机
2019/09/20 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
Python的加密模块md5、sha、crypt使用实例
2014/09/28 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
2019/05/15 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
瑞典时尚服装购物网站:Miinto.se
2017/10/30 全球购物
Scotch Porter官方网站:男士美容产品
2020/08/31 全球购物
水果连锁超市创业计划书
2014/01/24 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
军训拉歌口号
2014/06/13 职场文书
大学自主招生自荐信(2016精选篇)
2016/01/28 职场文书
使用 Apache Superset 可视化 ClickHouse 数据的两种方法
2021/07/07 Servers
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
如何让你的Nginx支持分布式追踪详解
2022/07/07 Servers