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 相关文章推荐
jquery操作select option 的代码小结
Jun 21 Javascript
jquery创建表格(自动增加表格)代码分享
Dec 25 Javascript
jQuery如何防止这种冒泡事件发生
Feb 27 Javascript
js无法获取到html标签的属性的解决方法
Jul 26 Javascript
AngularJS实现单独作用域内的数据操作
Sep 05 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
Mar 03 Javascript
使用javaScript实现鼠标拖拽事件
Apr 03 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
Vue中使用matomo进行访问流量统计的实现
Nov 05 Javascript
Vue3+elementui plus创建项目的方法
Dec 01 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
浅谈TypeScript 索引签名的理解
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
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
php上传文件常见问题总结
2015/02/03 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
php支付宝APP支付功能
2020/07/29 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
Ext.FormPanel 提交和 Ext.Ajax.request 异步提交函数的区别
2009/11/12 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
jquery用offset()方法获得元素的xy坐标
2014/09/06 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
AngularJS实现元素显示和隐藏的几个案例
2015/12/09 Javascript
Javascript将数字转化成为货币格式字符串
2016/06/22 Javascript
详解Html a标签中href和onclick用法、区别、优先级别
2017/01/16 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
在vue中获取dom元素内容的方法
2017/07/10 Javascript
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
利用vue-i18n实现多语言切换效果的方法
2019/06/19 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
node实现mock-plugin中间件的方法
2019/12/25 Javascript
JS实现表单中点击小眼睛显示隐藏密码框中的密码
2020/04/13 Javascript
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python Web框架之Django框架Model基础详解
2019/08/16 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
C# .NET面试题
2015/11/28 面试题
红领巾心向党广播稿
2014/01/19 职场文书
初中科学教学反思
2014/01/21 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
职代会闭幕词
2015/01/28 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
Vue2项目中对百度地图的封装使用详解
2022/06/16 Vue.js