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 相关文章推荐
JS实现随机化快速排序的实例代码
Aug 01 Javascript
jquery复选框checkbox实现删除前判断
Apr 20 Javascript
js闭包实例汇总
Nov 09 Javascript
Javascript中的对象和原型(二)
Aug 12 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
Nov 18 Javascript
教你快速搭建Node.Js服务器的方法教程
Mar 30 Javascript
JavaScript之DOM_动力节点Java学院整理
Jul 03 Javascript
微信小程序 数据绑定及运算的简单实例
Sep 20 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
Dec 15 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
Dec 25 Javascript
微信小程序表单验证form提交错误提示效果
Jun 19 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
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
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
深入array multisort排序原理的详解
2013/06/18 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
JavaScript学习笔记之JS事件对象
2015/01/22 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
提升node.js中使用redis的性能遇到的问题及解决方法
2018/10/30 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
放弃 Python 转向 Go语言有人给出了 9 大理由
2017/10/20 Python
Python实现PS滤镜碎片特效功能示例
2018/01/24 Python
Python贪心算法实例小结
2018/04/22 Python
查看django执行的sql语句及消耗时间的两种方法
2018/05/29 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
Python测试模块doctest使用解析
2019/08/10 Python
python 生成任意形状的凸包图代码
2020/04/16 Python
基于python实现把json数据转换成Excel表格
2020/05/07 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
python3将变量输入的简单实例
2020/08/19 Python
canvas简单连线动画的实现代码
2020/02/04 HTML / CSS
LivingSocial爱尔兰:爱尔兰本地优惠
2018/08/10 全球购物
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
英国家电购物网站:Sonic Direct
2019/03/26 全球购物
幼儿园教师的考核评语
2014/04/18 职场文书
学校百日安全活动总结
2015/05/07 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
nginx实现动静分离的方法示例
2021/11/07 Servers
Python实现批量将文件复制到新的目录中再修改名称
2022/04/12 Python