在web应用中,实现动画效果的方法比较多,例如js中可以通过定时器setTimeout来实现;CSS3可以通过transition和animation来实现;html5中通过Canvas来实现。除此之外,html5还提供一个专门用于请求动画的API,即requestAnimationFrame(请求动画帧)。

屏幕绘制频率:

即图像在屏幕上更新的速度,即屏幕上图像每秒出现的次数,一般这个频率是60HZ,所以一幅画面的刷新频率大约是16.7ms。大多数浏览器都会对重绘操作加以限制,不超过显示器的重绘频率,以为即使超过那个频率用户的体验也不会提升。

CSS动画原理

动画的本质就是让人眼看到图像被绘制而引起变化的视觉效果,这个变化要连贯、平滑的方式进行过渡。因为电脑屏幕以每秒60次的频率绘制,绘制频率很高所以感觉不到它在绘制。

js中使用setTimeout实现动画在某些低端机上会出现卡顿、抖动的现象,主要有两个原因:

(1)setTimeout的执行时间并不是确定的。在js中setTimeout任务被放入异步队列中,只有当主线程上的任务执行完之后,才会去检查异步任务是否需要开始执行,所以setTimeout的执行时间一般比设定的晚一些。

(2)刷新频率受屏幕分辨率和屏幕尺寸影响,不同设备的屏幕绘制频率可能会不同,而setTimeout只能设置一个固定的时间间隔,这个时间不一定和屏幕的刷新时间相同。

以上两种情况都会导致setTimeout的执行步调和屏幕的刷新步调不一致,从而引起丢帧现象。所以为什么步调不一致会出现丢帧呢?

首先setTimeout的执行只是在内存中对元素的属性进行改变,这个变化必须要等到屏幕下次绘制时才会被更新到屏幕上。如果步调不一致会导致中间某些帧的操作直接被跨越过去,而直接更新下一帧。

假设屏幕每隔16.7ms刷新一次,而setTimeout 每隔10ms设置图像向左移动1px, 就会出现如下绘制过程(表格)

从上面的绘制过程中可以看出,屏幕没有更新 left=2px 的那一帧画面,元素直接从left=1px 的位置跳到了 left=3px 的的位置,这就是丢帧现象,这种现象就会引起动画卡顿。

requestAnimationFrame(rAF)

与setTimeout相比,rAF的最大优势是由系统来决定回调函数的执行时机。具体来讲就是,系统每次绘制之前都会主动调用rAF中的回调函数。所以rAF的执行频率是跟着系统的绘制频率走的,他能保证回调函数在屏幕每一次的绘制间隔中只被执行一次,这样就不会出现丢帧现象和动画卡顿。

requestAnimationFrame()方法接收一个参数,即在绘制屏幕前调用的一个函数,这个函数负责改变下一次绘制的DOM样式。

function updateProcess(){var div=document.getElementById('status');div.style.width=(parseInt(div.style.width)+5)+'px';if(div.style.width!="300px"){window.requestAnimationFrame(updateProcess);}
}
window.requestAnimationFrame(updateProcess);

rAF还有两个优势:

(1)CPU节能:使用setTimeout实现的动画,当页面被隐藏或最小化时,setTimeout仍然在后台执行动画任务,由于此时页面处于不可见或不可用的状态,刷新动画是没有意义的,还浪费CPU资源。而rAF不同,当页面处于未激活的状态下,该页面的屏幕绘制任务也被系统暂停,因此跟着系统步伐的rAF也停止渲染,当页面被激活时,动画就从上次停留的地方继续执行,有效节约了CPU开销。

(2)函数节流:在高频率事件(resize、scroll等)这种,为了防止在一个刷新间隔内发生多次函数执行,使用rAF可保证每个绘制间隔内函数只被执行一次,这样既能保证流畅性,也能更好的节省函数执行的开销。

转载于:https://www.cnblogs.com/xiaoan0705/p/11212149.html

RequestAnimationFrame知多少?相关推荐

  1. 每个 JavaScript 工程师都应懂的33个概念

    简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的.它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南. 本篇文章是参照 @leonardomso 创立,英文版项 ...

  2. 每个JavaScript工程师都应懂的33个概念

    摘要: 基础很重要啊! 原文:33 concepts every JavaScript developer should know 译文:每个 JavaScript 工程师都应懂的33个概念 作者:s ...

  3. JavaScript 开发者应懂的 33 个概念

    JavaScript开发者应懂的33个概念 Fundebug 一行代码搞定BUG监控:www.fundebug.com ​关注她 356 人赞同了该文章 摘要: 基础很重要啊! 原文:33 conce ...

  4. 每个 JavaScript 工程师都应懂的33个概念 1

    简介 这个项目是为了帮助开发者掌握 JavaScript 概念而创立的.它不是必备,但在未来学习(JavaScript)中,可以作为一篇指南. 本篇文章是参照 @leonardomso 创立,英文版项 ...

  5. 你需要知道的网页渲染性能优化方法(上)

    关注公众号 前端开发博客,回复"加群" 加入我们一起学习,天天进步 作者:晨风明悟 链接:https://zhuanlan.zhihu.com/p/39878259 性能优化 上文 ...

  6. 按键精灵开发者认证1-6题库

    这是以前整理的题库,包过. 题目:(前台)区域范围为(100,150)到(200,300)内的所有点是否均为"FFFFFF",是则弹出对话框"没有其他颜色",否 ...

  7. 你需要知道的requestAnimationFrame

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

  8. 浏览器 刷新页面后回到顶部_JavaScript仿知乎回到顶部功能

    一般的网站都有个回到顶部,回到顶部又有多种方法可以实现, 方法1: 在css中添加 html {scroll-behavior: smooth; } 然后在回到顶部按钮上加一个a标签,herf属性写顶 ...

  9. 面试总结 - 大量数据分批渲染(requestAnimationFrame)6.js

    分批渲染和同时渲染区别的例子效果~~ 使用requestAnimationFrame来实现.requestAnimationFrame这个玩意儿呢,就是告诉浏览器--你希望执行一个动画,并且要求浏览器 ...

最新文章

  1. JavaScript 获取服务器端checkBoxlist控件选中的值
  2. Learn About Service Console Productivity Tools
  3. python3占位符 中文_WxString:有没有使用Python 3-占位符实现字符串格式化的C/C++代码?...
  4. java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象
  5. boost::geometry::detail::as_range用法的测试程序
  6. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了
  7. 怎样实现登录用户管理_如何编写程序实现图书管理系统里面的用户管理功能
  8. c语言语音控制游戏文献,C语言课程设计-基于C语言推箱子游戏设计-毕业论文文献.doc...
  9. 陶哲轩实分析 命题 7.3.4 (Cauchy 准则) 证明
  10. python发送图片邮件exchangelib_使用Python-Exchangelib库的电子邮件正文中的表格式
  11. Kubernetes 权限管理
  12. POJ1001 高精度浮点数幂运算
  13. LINUX虚拟机安装增强功能时报错:/sbin/mount.vboxsf: mounting failed with the error: No such device
  14. 我数学不好,适合做程序员吗?
  15. 《量子信息与量子计算简明教程》第一章·基本概念(下)
  16. 后盾网php项目开发实例,后盾网thinkphp许愿墙html源码
  17. 11210怎么等于24_所有能算24点的四个数,(4个数只能是1——10之间的数)我举个例:1,1,1,8.1,1,2,6.………………所有能算...
  18. 如何看懂照片的直方图?
  19. android 教你如何创建马甲包
  20. UCAS计算机网络实验

热门文章

  1. jq选择器||基本选择器 层级选择器 属性选择器 过滤选择器 表单过滤选择器
  2. python pyppeteer自定义chromium目录
  3. MVC %%与%=%与区别
  4. 利用puppeteer自动录入成绩
  5. CTFshow php特性 web136
  6. C++ for循环跳过某一项求和
  7. ones--创建全1矩阵
  8. cart2pol函数
  9. Shi-Tomasi算子的运用 ,用于检测角点
  10. webchart= php 解码,Web Pages - Chart 帮助器