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在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
JS取文本框中最小值的简单实例
Nov 29 Javascript
PHP中使用微秒计算脚本执行时间例子
Nov 19 Javascript
js数组依据下标删除元素
Apr 14 Javascript
jquery实现未经美化的简洁TAB菜单效果
Aug 28 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
基于jQuery实现歌词滚动版音乐播放器的代码
Sep 17 Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 Javascript
ES6通过babel转码使用webpack使用import关键字
Dec 13 Javascript
基于Javascript倒计时效果
Dec 22 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
Oct 12 Javascript
JavaScript canvas绘制折线图
Feb 18 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中$_SERVER的详细参数与说明
2008/07/29 PHP
php模拟js函数unescape的函数代码
2012/10/20 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
2011/10/13 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
JavaScript SetInterval与setTimeout使用方法详解
2013/11/15 Javascript
数据结构中的各种排序方法小结(JS实现)
2016/07/23 Javascript
node.js express安装及示例网站搭建方法(分享)
2016/08/22 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
AngularJS操作键值对象类似java的hashmap(填坑小结)
2016/11/12 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
angular4+百分比进度显示插件用法示例
2019/05/05 Javascript
[00:31]DOTA2上海特级锦标赛 Fnatic战队宣传片
2016/03/04 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python连接phoenix的方法示例
2017/09/29 Python
python实现m3u8格式转换为mp4视频格式
2018/02/28 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
利用numpy和pandas处理csv文件中的时间方法
2018/04/19 Python
python实现简单登陆系统
2018/10/18 Python
HTML5之SVG 2D入门9—蒙板及mask元素介绍与应用
2013/01/30 HTML / CSS
"序列点" 是什么
2016/07/29 面试题
关于赌博的检讨书
2014/01/24 职场文书
三年级数学教学反思
2014/01/31 职场文书
重阳节登山活动方案
2014/02/03 职场文书
机电一体化求职信
2014/03/10 职场文书
小学家长评语大全
2014/04/16 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
PyTorch 如何自动计算梯度
2021/05/23 Python
MySQL学习之基础操作总结
2022/03/19 MySQL
Redis基本数据类型List常用操作命令
2022/06/01 Redis
vue el-table实现递归嵌套的示例代码
2022/08/14 Vue.js