JavaScript requestAnimationFrame动画详解


Posted in Javascript onSeptember 14, 2017

进入web2.0时代,在网页中实现动画已经不再局限于一种方法

  • 你可以用CSS3的animattion+keyframes;
  • 你也可以用css3的transition;
  • 你还可以用通过在canvas上作图来实现动画,也可以借助jQuery动画相关的API方便地实现;
  • 当然最原始的你还可以使用window.setTimout()或者window.setInterval()通过不断更新元素的状态位置等来实现动画,前提是画面的更新频率要达到每秒60次才能让肉眼看到流畅的动画效果。

认识JavaScript requestAnimationFrame

首先我们来看一下它的源码
requestAnimationFrame on github

// Adapted from https://gist.github.com/paulirish/1579671 which derived from 
// http://paulirish.com/2011/requestanimationframe-for-smart-animating/
// http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating

// requestAnimationFrame polyfill by Erik Möller.
// Fixes from Paul Irish, Tino Zijdel, Andrew Mao, Klemen Slavič, Darius Bacon

// MIT license

if (!Date.now)
 Date.now = function() { return new Date().getTime(); };

(function() {
 'use strict';

 var vendors = ['ms', 'moz', 'webkit', 'o'];
 //浏览器兼容
 for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
 //对于支持的浏览器直接统一接口
  var vp = vendors[i];
  window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
  window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
         || window[vp+'CancelRequestAnimationFrame']);
 }
 if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
  || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
  //对于不支持的浏览器退而使用setTimeout和clearTimeout
  var lastTime = 0;
  window.requestAnimationFrame = function(callback) {
   var now = Date.now();
   var nextTime = Math.max(lastTime + 16, now);
   return setTimeout(function() { callback(lastTime = nextTime); },
        nextTime - now);
  };
  window.cancelAnimationFrame = clearTimeout;
 }
}());

相信那一点点源码的阅读对大家都没有问题,就算读不懂也没关系,会调用api就可以了

requestAnimationFrame的优点

浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。比如,通过requestAnimationFrame(),JS动画能够和CSS动画/变换或SVG SMIL动画同步发生。另外,如果在一个浏览器标签页里运行一个动画,当这个标签页不可见时,浏览器会暂停它,这会减少CPU,内存的压力,节省电池电量。

用法示例:

function animate() {
  console.log("animation");
  window.requestAnimationFrame(animate);
 }
animate();

JavaScript requestAnimationFrame动画详解

requestAnimationFrame(animate)是关键,它为要执行的函数设置了动画,所以浏览器控制台会一直执行animate()函数。

浏览器兼容性

JavaScript requestAnimationFrame动画详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 对象成员的可见性说明
Oct 16 Javascript
详解javascript中的事件处理
Nov 06 Javascript
Node.js中Request模块处理HTTP协议请求的基本使用教程
Mar 31 Javascript
浅谈JavaScript 浏览器对象
Jun 03 Javascript
js判断请求的url是否可访问,支持跨域判断的实现方法
Sep 17 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
Dec 22 Javascript
js实现类bootstrap模态框动画
Feb 07 Javascript
关于javascript sort()排序你可能忽略的一点理解
Jul 18 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
Apr 25 Javascript
vue-simple-uploader上传成功之后的response获取代码
Sep 07 Javascript
解决vant-UI库修改样式无效的问题
Nov 03 Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 #Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 #Javascript
jQuery plugin animsition使用小结
Sep 14 #jQuery
angular.extend方法的具体使用
Sep 14 #Javascript
浅谈angular.copy() 深拷贝
Sep 14 #Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 #Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
Sep 14 #Javascript
You might like
PHP反转字符串函数strrev()函数的用法
2012/02/04 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
ThinkPHP框架表单验证操作方法
2017/07/19 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
Laravel框架源码解析之模型Model原理与用法解析
2020/05/14 PHP
Javascript实例教程(19) 使用HoTMetal(7)
2006/12/23 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
JavaScript 图像动画的小demo
2012/05/23 Javascript
jquery 插件学习(二)
2012/08/06 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
jQuery深拷贝Json对象简单示例
2016/07/06 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
javaScript 逻辑运算符使用技巧整理
2017/05/03 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
vue中vee validate表单校验的几种基本使用
2018/06/25 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
在vue中使用回调函数,this调用无效的解决
2020/08/11 Javascript
Vue3.0的优化总结
2020/10/16 Javascript
原生js实现俄罗斯方块
2020/10/20 Javascript
利用Python画ROC曲线和AUC值计算
2016/09/19 Python
python爬虫之BeautifulSoup 使用select方法详解
2017/10/23 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python机器学习之KNN分类算法
2018/08/29 Python
python实现不同数据库间数据同步功能
2021/02/25 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
总经理驾驶员岗位职责
2013/12/04 职场文书
小学生手册家长评语
2014/04/16 职场文书
土地租赁意向书
2014/07/30 职场文书
会员活动策划方案
2014/08/19 职场文书
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server