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 Select操作大集合
May 26 Javascript
也说JavaScript中String类的replace函数
Sep 22 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
JS获取节点的兄弟,父级,子级元素的方法
Jan 09 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
Aug 07 Javascript
纯javascript判断查询日期是否为有效日期
Aug 24 Javascript
Vue.js render方法使用详解
Apr 05 Javascript
AngularJS折叠菜单实现方法示例
May 18 Javascript
input file样式修改以及图片预览删除功能详细概括(推荐)
Aug 17 Javascript
Vue精简版风格概述
Jan 30 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
Jan 31 Javascript
JavaScript中利用Array filter() 方法压缩稀疏数组
Feb 24 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
一个取得文件扩展名的函数
2006/10/09 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
深入剖析PHP中printf()函数格式化使用
2016/05/23 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
php实现分页功能的详细实例方法
2019/09/29 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
JavaScript面向对象编程
2008/03/02 Javascript
jquery 按钮状态效果 正常、移上、按下
2013/08/12 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
js unicode 编码解析关于数据转换为中文的两种方法
2014/04/21 Javascript
jQuery使用prepend()方法在元素前添加内容用法实例
2015/03/26 Javascript
js实现点击链接后延迟3秒再跳转的方法
2015/06/05 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
jquery购物车结算功能实现方法
2020/10/29 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
javaScript 连接打印机,打印小票的实例
2017/12/29 Javascript
深入浅出理解JavaScript高级定时器原理与用法
2018/08/02 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python如何获取系统iops示例代码
2016/09/06 Python
Python PyCharm如何进行断点调试
2019/07/05 Python
pytorch打印网络结构的实例
2019/08/19 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Python面向对象实现方法总结
2020/08/12 Python
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
感恩节活动方案
2014/01/27 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
校园歌咏比赛主持词
2014/03/18 职场文书
保送生自荐信范文
2015/03/26 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
金砖之国观后感
2015/06/11 职场文书
商务英语邮件开头问候语
2015/11/10 职场文书