requestAnimationFrame小结
背景
在Web应用中,实现动画效果的方法比较多,Javascript 中可以通过定时器 setTimeout或者setInterval 来实现,css3 可以使用 transition 和 animation 来实现,html5 中的 canvas 也可以实现。除此之外,html5 还提供一个专门用于请求动画的API,那就是 requestAnimationFrame,顾名思义就是请求动画帧。
但是传统的通过setTimeout或者setInterval实现的动画,存在两个问题,第一个就是动画的循时间环间隔不好确定,设置长了动画显得不够平滑流畅, 设置短了浏览器的重绘频率会达到瓶颈,推荐的最佳循环间隔是17ms(大多数电脑的显示器刷新频率是60Hz,1000ms / 60),第二个问题是定时器第二个时间参数只是指定了多久后将动画任务添加到浏览器的UI线程队列中,如果UI线程处于忙碌状态,那么动画不会立刻执行,为了解决这个问题,H5中加入了requestAnimationFrame。
setInterval实现一个动画
<html>
<head>
<title></title>
<style type="text/css">
#box {
margin: 200px;
width: 200px;
height: 200px;
background: green;
}
</style>
</head> <body>
<div id="box"></div>
</body>
<script type="text/javascript">
var element = document.getElementById('box')
var left = 0;
var animateCallback = function() {
element.style.marginLeft = (++left)+ 'px';
if (left === 500) {
clearInterval(interval);
}
}
var interval = setInterval(animateCallback, (1000 / 60));
</script>
丢帧
例如我们使用setInterval进行颜色的切换
var color = ['green', 'red', 'blue', 'yellow'];
var element = document.getElementById('box');
var index = 0;
var animateCallback = function() {
index++;
element.style.backgroundColor = color[index];
if (index === 3){
clearInterval(interval);
}
}
var interval = setInterval(interval, 1000 / 100);
上面的动画切换我们设置了间隔10切换一次,但是此时的屏幕刷新频率为16.7,
- 第0ms时,屏幕未刷新,等待中,setInterval也未执行,等待中;
- 第10ms时,屏幕未刷新,等待中,setInterval执行颜色切换为green
- 第16.7ms时: 屏幕刷新,屏幕的box颜色改变为green,setInterval未执行。继续等待
- 第20ms时:屏幕未刷新,等待中,setInterval执行颜色切换为red,
- 第30ms时,屏幕未刷新,等待中,setInterval执行颜色切换为blue,
- 第34.7ms时,屏幕刷新,屏幕的box颜色改变为blue,setTimeout未执行,继续等待中。
- ...
requstAnimationFrame实现
<html>
<head>
<title></title>
<style type="text/css">
#box {
margin: 200px;
width: 200px;
height: 200px;
background: green;
}
</style>
</head> <body>
<div id="box"></div>
</body>
<script type="text/javascript">
var start = null;
var element = document.getElementById('box');
var left = 0;
var raf_id = null;
function animateCallback() {
element.style.marginLeft = (++left) + 'px';
if (left === 500) {
cancelAnimationFrame(raf_id);
} else {
raf_id = requestAnimationFrame( animateCallback );
}
}
raf_id = window.requestAnimationFrame(animateCallback);
</script>
requestAnimationFrame优势
CPU节能
函数节流
requestAnimationFrame小结的更多相关文章
- 关于 requestAnimationFrame 小结
一.小谈 requestAnimationFrame: 说起 requestAnimationFrame,我们先看幅图: 相当一部分的浏览器的显示频率是16.7ms, 就是上图第一行的节奏,表现就是“ ...
- 3月web前端面试小结
说一下box-sizing的应用场景 box-sizing的属性值分为两个,border-box和content-box,其中, border-box:width=content+padding+bo ...
- 神奇的requestAnimationFrame解决传统定时器bug
可能你还没见过这个东西是个啥,其实他就是类似于setTimeout和setInterval,然而它与setTimeout和setInterval又有所不同,requestAnimationFrame不 ...
- 小程序刷新webview小结
场景 在小程序其它页面做了操作,数据发生改变,回到webview页面时需要更新webview里面的数据.由于小程序没有提供与webview的实时通信能力,因此刷新页面是个可考虑的做法. 方法一 最常见 ...
- 动画requestAnimationFrame
前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- java单向加密算法小结(2)--MD5哈希算法
上一篇文章整理了Base64算法的相关知识,严格来说,Base64只能算是一种编码方式而非加密算法,这一篇要说的MD5,其实也不算是加密算法,而是一种哈希算法,即将目标文本转化为固定长度,不可逆的字符 ...
- iOS--->微信支付小结
iOS--->微信支付小结 说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下 ***那么首先还是由公司去创建并申请使用 ...
随机推荐
- maven版本仲裁原则
这里有一个案例是项目里依赖了b组件,b组件依赖了a组件1.0.2版本,而用户也直接在pom依赖了a组件并声明的1.0.0版本,结果在仲裁时选择了1.0.0版本的a组件: +- com.xxx:a:ja ...
- 第14章节 BJROBOT karto 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
建地图前说明:请确保你的小车已经校正好 IMU.角速度.线速度,虚拟机配置好 ROS 网络的前提进行,否则会造成构建地图无边界.虚拟机端无法正常收到小车主控端发布的话题数据等异常情况!! 1.把小车平 ...
- Linux下使用acme.sh申请和管理Let’s Encrypt证书
关于Let's Encrypt 免费SSL证书 Let's Encrypt 作为一个公共且免费 SSL 的项目逐渐被广大用户传播和使用,是由 Mozilla.Cisco.Akamai.IdenTrus ...
- 实战Git命令(界面操作+命令行)
先说明下公司的发版步骤,当需要开发一个新的功能,先从master分支中拉出一个自己的分支a(假设分支为a),在a分支开发功能完后,需要切换到dev分支,然后把自己的分支a合到dev分支,部署测试环境让 ...
- ForwardProcess
共享式网络中,发送的报文所有设备都可以收到 0.0.0.0/0 缺省路由 可以到达任意网络 From WizNote
- 在微信小程序开发中使用Typescript
Typescript的优势咱不需要赘述太多,有兴趣可以参考(https://www.typescriptlang.org/).今天给大家分享一下如何在微信小程序(或者其他同类小程序)开发中使用Type ...
- ASP.NET 上传文件到共享文件夹
创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 上传文件代码 web.config <!--上传文件配置,UploadP ...
- LeetCode116 每个节点的右向指针
给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充它的每个 ...
- 【Flutter】功能型组件之对话框详解
前言 对话框本质上也是UI布局,通常一个对话框会包含标题.内容,以及一些操作按钮,为此,Material库中提供了一些现成的对话框组件来用于快速的构建出一个完整的对话框. 接口描述 // 1. Ale ...
- Centos 7 杂章
CentOS-7-x86_64-DVD-2003.iso 下载地址: http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DV ...