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代码的实现一个图片向上滚动切换
Sep 02 Javascript
php 中序列化和json使用介绍
Jul 08 Javascript
基于jquery插件实现常见的幻灯片效果
Nov 01 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
Jun 05 Javascript
浅析BootStrap栅格系统
Jun 07 Javascript
jQuery实现的兼容性浮动层示例
Aug 02 Javascript
使用Ajax与服务器(JSON)通信实例
Nov 04 Javascript
jQuery.Validate表单验证插件的使用示例详解
Jan 04 Javascript
基于Particles.js制作超炫粒子动态背景效果(仿知乎)
Sep 13 Javascript
vuejs 制作背景淡入淡出切换动画的实例
Sep 01 Javascript
用JavaScript实现贪吃蛇游戏
Oct 23 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP实现数据分页显示的简单实例
2016/05/26 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
javascript 面向对象编程基础:封装
2009/08/21 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
jquery 元素相对定位代码
2010/10/15 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
JavaScript初学者应注意的七个细节小结
2012/01/30 Javascript
浅析用prototype定义自己的方法
2013/11/14 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jQuery基于扩展实现的倒计时效果
2016/05/14 Javascript
JS实现Ajax的方法分析
2016/12/20 Javascript
MvcPager分页控件 适用于Bootstrap
2017/06/03 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
node.js支持多用户web终端实现及安全方案
2017/11/29 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
laravel实现中文和英语互相切换的例子
2019/09/30 Javascript
在Python的Flask中使用WTForms表单框架的基础教程
2016/06/07 Python
python通过zabbix api获取主机
2018/09/17 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
Python类反射机制使用实例解析
2019/12/30 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
在线服装零售商:SheIn
2016/07/22 全球购物
戴尔美国官方折扣店:Dell Outlet
2018/02/13 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
Moda Operandi官网:美国奢侈品电商,海淘秀场T台同款
2020/05/26 全球购物
考试违纪检讨书
2014/02/02 职场文书
七年级政治教学反思
2014/02/03 职场文书
绩效工资实施方案
2014/03/15 职场文书
离婚财产分配协议书
2014/10/21 职场文书
我的中国梦主题班会
2015/08/14 职场文书
研究生毕业登记表的自我鉴定范文
2019/07/15 职场文书
MySQL里面的子查询的基本使用
2021/08/02 MySQL
Redis集群新增、删除节点以及动态增加内存的方法
2021/09/04 Redis