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 中 data 方法的误解分析
Jun 18 Javascript
基于jquery实现瀑布流布局
Jun 28 Javascript
原生JS实现网络彩票投注效果
Sep 25 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
Dec 02 Javascript
Vue.js 60分钟快速入门教程
Mar 28 Javascript
JavaScript实现HTML5游戏断线自动重连的方法
Sep 18 Javascript
ionic2中使用自动生成器的方法
Mar 04 Javascript
element-ui使用导航栏跳转路由的用法详解
Aug 22 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
layui输入框中只允许输入整数的实现方法
Sep 18 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
为什么JavaScript中0.1 + 0.2 != 0.3
Dec 03 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操作符与控制结构代码
2011/12/30 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
Linux+Nginx+MySQL下配置论坛程序Discuz的基本教程
2015/12/23 PHP
PHP编写daemon process详解及实例代码
2016/09/30 PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
2017/10/11 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
ASP SQL防注入的方法
2008/12/25 Javascript
入门基础学习 ExtJS笔记(一)
2010/11/11 Javascript
javascript自动改变文字大小和颜色的效果的小例子
2013/08/02 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
Javascript中Array用法实例分析
2015/06/13 Javascript
JS绘制生成花瓣效果的方法
2015/08/05 Javascript
JS+CSS实现的日本门户网站经典选项卡导航效果
2015/09/27 Javascript
基于JavaScript实现移除(删除)数组中指定元素
2016/01/04 Javascript
jQuery中DOM节点删除之empty与remove
2017/01/20 Javascript
JS查找英文文章中出现频率最高的单词
2017/03/20 Javascript
vue货币过滤器的实现方法
2017/04/01 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
javascript+html5+css3自定义弹出窗口效果
2017/10/26 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
JavaScript实现的DOM绘制柱状图效果示例
2018/08/08 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
[59:36]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第二场
2018/04/04 DOTA
Python实现抢购IPhone手机
2018/02/07 Python
python扫描线填充算法详解
2020/02/19 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
NFL墨西哥官方商店:Tienda NFL
2017/11/28 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
会计岗位职责模板
2014/03/12 职场文书
安全月活动总结
2014/05/05 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
高考满分作文赏析(2篇)
2019/08/12 职场文书
Python实现的扫码工具居然这么好用!
2021/06/07 Python
详解Java实践之建造者模式
2021/06/18 Java/Android