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 相关文章推荐
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
Jan 09 Javascript
javascript for-in有序遍历json数据并探讨各个浏览器差异
Nov 30 Javascript
JavaScript探测CSS动画是否已经完成的方法
Aug 30 Javascript
JS填写银行卡号每隔4位数字加一个空格
Dec 19 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
jQuery实现扑克正反面翻牌效果
Mar 10 Javascript
Angularjs 双向绑定时字符串的转换成数字类型的问题
Jun 12 Javascript
vue之数据交互实例代码
Jun 16 Javascript
vue-cli中的babel配置文件.babelrc实例详解
Feb 22 Javascript
微信小程序实现传递多个参数与事件处理
Aug 12 Javascript
layui给下拉框、按钮状态、时间赋初始值的方法
Sep 10 Javascript
vue中使用elementUI组件手动上传图片功能
Dec 13 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
海贼王:最美的悬赏令!
2020/03/02 日漫
php通用防注入程序 推荐
2011/02/26 PHP
php编写的简单页面跳转功能实现代码
2013/11/27 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
javascript实现轮显新闻标题链接
2007/08/13 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
实例代码详解jquery.slides.js
2015/11/16 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
AngularJS基础 ng-csp 指令详解
2016/08/01 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
python实现的简单抽奖系统实例
2015/05/22 Python
用python找出那些被“标记”的照片
2017/04/20 Python
Python字符串拼接的几种方法整理
2017/08/02 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
实用自动化运维Python脚本分享
2018/06/04 Python
解决Pycharm运行时找不到文件的问题
2018/10/29 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
总结Python图形用户界面和游戏开发知识点
2019/05/22 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
pygame实现俄罗斯方块游戏(对战篇1)
2019/10/29 Python
python创建学生成绩管理系统
2019/11/22 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
英国最大的独立摄影零售商:Park Cameras
2019/11/27 全球购物
PHP笔试题
2012/02/22 面试题
车间班组长的职责
2013/12/13 职场文书
教育科研先进个人材料
2014/01/26 职场文书
公司担保书范文
2014/05/21 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS