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 鼠标点击事件及其它捕获
Jun 04 Javascript
javascript+html5实现绘制圆环的方法
Jul 28 Javascript
浅析JavaScript Array和string的转换(推荐)
May 20 Javascript
js与applet相互调用的方法
Jun 22 Javascript
Vue.js组件使用开发实例教程
Nov 01 Javascript
利用Node.js对文件进行重命名
Mar 12 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
Aug 09 Javascript
微信小程序下拉刷新界面的实现
Sep 28 Javascript
AngularJS中下拉框的高级用法示例
Oct 11 Javascript
微信小程序实现tab页面切换功能
Jul 13 Javascript
JS实现关闭小广告特效
Jan 29 Javascript
JS 基本概念详细介绍
Oct 16 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
PHP7扩展开发之hello word实现方法详解
2018/01/15 PHP
php中的依赖注入实例详解
2019/08/14 PHP
JavaScript 学习点滴记录
2009/04/24 Javascript
Jquery 最近浏览过的商品的功能实现代码
2010/05/14 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
2014/06/24 Javascript
js文本框走动跑马灯效果代码分享
2015/08/25 Javascript
JS实现超简洁网页title标题跑动闪烁提示效果代码
2015/10/23 Javascript
Node.js开启Https的实践详解
2016/10/25 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
Angular angular-file-upload文件上传的示例代码
2018/08/23 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
JavaScript实现滑动门效果
2020/01/18 Javascript
[55:56]NB vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
深入理解python中的浅拷贝和深拷贝
2016/05/30 Python
在Python中使用AOP实现Redis缓存示例
2017/07/11 Python
python模拟表单提交登录图书馆
2018/04/27 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
Python3中bytes类型转换为str类型
2018/09/27 Python
Python3 导入上级目录中的模块实例
2019/02/16 Python
Pythony运维入门之Socket网络编程详解
2019/04/15 Python
Django  ORM 练习题及答案
2019/07/19 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
2019/12/18 Python
HTML5拖拽文件到浏览器并实现文件上传下载功能代码
2013/06/06 HTML / CSS
大四毕业生学习总结的自我评价
2013/10/31 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
点菜员岗位职责范本
2014/02/14 职场文书
《满井游记》教学反思
2014/02/26 职场文书
合作协议书
2014/04/23 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
纪律委员竞选稿
2015/11/19 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python