今天小猪在看一个html5的demo时一直在找他的动画是怎么实现的,按照我的理解就应该是调用setInterval来循环调用动画函数来实现。但是在Demo中就是找不到这个函数。干着急的小猪只好一步一步的来看是怎么实现的,之后发现了这么一句代码:

window.RAF = (function () {return window.requestAnimationFrame || 
           window.webkitRequestAnimationFrame || 
           window.mozRequestAnimationFrame || 
           window.oRequestAnimationFrame || 
           window.msRequestAnimationFrame || 
           function (callback) { window.setTimeout(callback, 1000 / 60); };
})();

原来是这样。

window.requestAnimationFrame 告诉浏览器您要执行的动画并且请求浏览器的在下一个动画帧重绘窗口,方法在浏览器重绘之前作为一个回调函数被调用,就是告诉浏览器在刷新屏幕的时候,调用这个方法。

在90年代,那个互联网做广告的年代,window上面各种走马灯,各种状态文字都是用setTimeout来时实现的。

动画的问题最棘手的是延时问题,对于显示器来说,每一秒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咯。

转载于:https://www.cnblogs.com/smallerpig/p/3645263.html

window.requestAnimationFrame相关推荐

  1. 网页性能管理详解:浅谈chrome-Timeline及window.requestAnimationFrame()方法

    你遇到过性能很差的网页吗? 这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅. 你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站.作为一个开发 ...

  2. window.requestAnimationFrame Web3D渲染帧率控制

    目录 window.requestAnimationFrame简介 定义 语法 参数 返回值 使用注意 两种方式控制帧率 默认帧数中取适当次数更新 用延时控制帧率更新的频率 总结 注意: window ...

  3. window.requestAnimationFrame强大的前端动画神器

    今天介绍一个功能强大的api-window.requestAnimationFrame,它既可以实现如丝般顺滑的动画,又能充当性能优化的利器,还能代替setTimeout,setInterval等定时 ...

  4. 浏览器动画window.requestAnimationFrame

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,欢迎批评指正 再看别人现实粒子效果的时候会有以下码代: 1 window.requestAnimationFrame || (window.req ...

  5. requestAnimationFrame,Web中写动画的另一种选择

    HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了: 你可以用CSS3的animattion+keyframes; 你也可以用css3的transition; 你还可以用通过在canv ...

  6. 动画requestAnimationFrame

    前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...

  7. 神奇的requestAnimationFrame

    引入 计时器一直是JavaScript动画的核心技术.而编写动画循环的关键是要知道延迟时间多长合适.一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅:另一方面,循环间隔还要足够长,这样 ...

  8. 你需要知道的requestAnimationFrame

    你需要知道的requestAnimationFrame 随着前端的发展,css已经能够实现非常多的动画特效,但是仍然存在css无法完成的动画任务(比如页面滚动),通常的解决方案都是使用js中的setI ...

  9. 遇见requestAnimationFrame

    今天,在读javascript异步编程的js事件深入理解部分的时候,了解到了requestAnimationFrame 这个api,在这里记录一下. 原文: setTimeout 和 setInter ...

最新文章

  1. 2022-2028年中国再生天然橡胶行业市场调查分析及未来前景分析报告
  2. python三层装饰器-python开发学习day16 (三层装饰器;迭代器)
  3. QT绘制散点图(2)
  4. Oracle 之 管理
  5. JDBC教程– ULTIMATE指南(PDF下载)
  6. STL源码剖析 第七章 仿函数(函数对象)
  7. RHEL6.4 Keepalive+LVS(DR)部署文档
  8. 树--树的基本性质(JAVA)
  9. 学习过osgi 发布bundle
  10. 冯泽来学分块(二分查找)
  11. 用jQuery插件实现“小图点击预览大图”功能1
  12. @Autowired的作用
  13. 【Excel-2010】日期函数
  14. Java System.getProperty()
  15. 计算机采用流水线目的是什么?
  16. gx works2 存储器空间或桌面堆栈不足_2020淮北Gx螺旋输送机价格厂家出售
  17. C语言入门经典(第5版)电子书pdf下载
  18. 条码打印工具-Bartender的使用
  19. 线性代数之矩阵逆的求法
  20. java可以微信qq同时登陆_多种方法同时登录QQ(pc/微信/web qq/超级qq)

热门文章

  1. AntD Checkbox 的三种状态处理
  2. Windows 软件管理命令行工具scoop介绍
  3. 7月个人:Windows和Linux绑定和解绑ARP 了解ARP命令的用途。 掌握ARP命令的使用。...
  4. 清明是品茗的好时节,那么你了解quot;明前茶quot;吗?
  5. 关于程序猿的几个阶段!
  6. linux 系统装中文输入法 fcitx
  7. c# winform listview 删除
  8. Microsoft Expression Blend 2 密钥,key
  9. python核心编程学习(第四章)
  10. VS2005 和 SQL Server 2005 安装顺序不同会发生什么?