就终极目的来说,requestAnimationFrame就是setTimeout。既然有了setTimeout,那还要requestAnimationFrame来干嘛。setTimeout会存在过度绘制,会造成帧丢失,继而导致动画断续显示。这也是setTimeout的定时器值推荐最小使用16.7ms的原因(16.7 = 1000 / 60, 即每秒60帧)。

浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。requestAnimationFrame就是为了这个而出现的。我所做的事情很简单,跟着浏览器的绘制走,如果浏览设备绘制间隔是16.7ms,那我就这个间隔绘制;如果浏览设备绘制间隔是10ms, 我就10ms绘制。这样就不会存在过度绘制的问题,动画不会掉帧。通过requestAnimationFrame(),JS动画能够和CSS动画/变换或SVG SMIL动画同步发生。另外,如果在一个浏览器标签页里运行一个动画,当这个标签页不可见时,浏览器会暂停它,这会减少CPU,内存的压力,节省电池电量。

requestAnimationFrame的用法

为了更好的兼容各种浏览器,加上了兼容各种浏览器引擎前缀。谷歌浏览器,火狐浏览器,IE10+都实现了这个函数,即使在ie9以下,执行requestAnimationFrame方法也不会出错。

(function() {var lastTime = 0;var vendors = ['webkit', 'moz'];for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {window.requestAnimationFrame = window[vendors[x] + 'RequestAnimationFrame'];window.cancelAnimationFrame = window[vendors[x] + 'CancelAnimationFrame'] ||    // name has changed in Webkitwindow[vendors[x] + 'CancelRequestAnimationFrame'];}if (!window.requestAnimationFrame) {window.requestAnimationFrame = function(callback, element) {var currTime = new Date().getTime();var timeToCall = Math.max(0, 16.7 - (currTime - lastTime));var id = window.setTimeout(function() {callback(currTime + timeToCall);}, timeToCall);lastTime = currTime + timeToCall;return id;};}if (!window.cancelAnimationFrame) {window.cancelAnimationFrame = function(id) {clearTimeout(id);};}
}());window.requestAnimationFrame(function(/* time */ time){// time ~= +new Date // the unix time
});

参考文章
http://www.zhangxinxu.com/wor...http://www.webhek.com/request...http://blog.chinaunix.net/uid...

requestAnimationFrame 优化Web动画相关推荐

  1. html5+shim脚本,HTML5探秘:用requestAnimationFrame优化Web动画

    requestAnimationFrame是什么? 在浏览器动画程序中,我们通常使用一个定时器来循环每隔几毫秒移动目标物体一次,来让它动起来.如今有一个好消息,浏览器开发商们决定:"嗨,为什 ...

  2. Web 动画帧率(FPS)计算

    (点击上方公众号,可快速关注) 作者: 伯乐在线/chokcoco http://web.jobbole.com/93325/ 我们知道,动画其实是由一帧一帧的图像构成的.有 Web 动画那么就会存在 ...

  3. GreenSock面向初学者:Web动画教程(第1部分)

    我在本文中的目的是向您全面介绍GreenSock ,也称为GSAP(GreenSock动画平台),这是一种用于现代Web的高性能,专业级HTML5动画引擎. 这是" 超越CSS:动态DOM动 ...

  4. 从手机端 H5 制作来看 WEB 动画的术与道

    我们在微信朋友圈里经常看到很多人分享 H5 的链接,有的科技感十足,有的展示炫目,有的非常有创意,各大公司也把H5作为他们品牌传播,活动预热的很好方式.企业商户对于这种方式也很有好感,从而导致了 H5 ...

  5. 【Web动画】CSS3 3D 行星运转 浏览器渲染原理

    承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...

  6. Web 动画原则及技巧浅析

    在 Web 动画方面,有一套非常经典的原则 -- Twelve basic principles of animation[1],也就是关于动画的 12 个基本原则(也称之为迪士尼动画原则),网上对它 ...

  7. 流畅web动画的十个法则

    from me: web动画能够带来一个非常酷炫的效果,能够让页面有一个更好的用户体验.对于良好的动画性能没有高招,除了将大量的时间放在测试和优化,当然最重要的还是要易于维护. 流畅web动画的十大法 ...

  8. Apache的管理及优化web

    Apache的管理及优化 web 1 实验环境 2 Apache的作用 3 Apache的安装与启用 3.1 Apache的安装 3.2 Apache的启用 4 Apache的基本信息 5 Apach ...

  9. Web动画API教程:可爱的运动路径(Motion Path)

    这是介绍浏览器中web动画API的系列教程的第五篇.如果你有什么问题/想法,或者发现我理解错了规范的内容,或是希望我在接下来的文章中对某部分内容进行探讨的话,请在Twitter给我留言吧~@dancw ...

最新文章

  1. git 设置 key 到服务器,同步代码不需要输入用户名和密码
  2. ORACLE1.22 %type %rowtype
  3. 深入理解分布式技术 - ZooKeeper数据一致性解读
  4. LAMP环境下动态网站许愿墙的搭建
  5. IDEA写vue项目出现红色波浪线警告如何解决??
  6. 联邦学习--数据攻击(2)
  7. 【详谈 Delta Lake 】系列技术专题 之 湖仓一体( Lakehouse )
  8. 媒体智能-淘宝直播流媒体互动实践 | D2 分享视频+文章
  9. js 给动态li添加动态点击事件
  10. 第二周java基础学习内容
  11. Unreal Engine UE4虚幻引擎,生成Cubemap(HDR高动态范围贴图)
  12. 中医药天池大数据竞赛——中医文献问题生成挑战(二)
  13. excel多条件筛选公式
  14. elasticsearch篇之mapping
  15. random.uniform()和random.random()区别
  16. David Silver强化算法学习地址和PPT
  17. 1 深度学习为甚么如此火热发展如此迅速
  18. 天融信java面试_天融信面试准备
  19. ROS 2 Foxy Fitzroy:为生产和开发机器人设定新标准
  20. 想爱,爱不了,想恨,恨不下,想忘,忘不了

热门文章

  1. append,appendTo和prepend
  2. docker-for-windows配置了阿里云镜像,仍然无法获得链接:(Client.Timeout exceeded while awaiting headers)
  3. perfdog 性能狗之Jank
  4. n卡eth挖矿设置_ETH2.0要来了,要不要布局显卡挖矿?
  5. java io字符流_Java IO流字符流简介及基本使用
  6. 五子棋 鼠标 C语言,c语言写的鼠标操作的五子棋游戏,欢迎观赏!
  7. 他写出了 Vue,却做不对这十道 Vue 笔试题
  8. 前端、后端、全栈都要学什么?薪资前景如何?
  9. QPainter的使用
  10. linux rdma服务,容器网络启用RDMA高速通讯-Freeflow