之前需要使用的定时器的时,立马想到的是setInterval(),用着用着就成为习惯,并没有遇到什么不妥之处。习惯性的操作往往容易让一个人拒绝尝试一些其他的方法。现在的方法用得好好的,没事干啥找其他法子。

摈弃习惯性操作的思想,没事还真得去尝试一些新方法,不然整天敲一样的代码不无聊么?

对于requestAnimationFrame这个东东,其实很早就知道了,但是也就只是局限于‘知道’而已。

直到后面的项目中,在写一个关于榜单滚动的模块,开始当然用的还是setInterval(),榜单列表每秒向上移动1px,很快项目写完了,回头乍看,榜单在滚动的时候,隐隐约约看到跳帧现象,而且页面背景和榜单背景夜色是反色,看起来效果还是不尽如人意。

这时候我开始寻求优化这个问题,捣鼓好久,打算从从滚动动画开刀,查阅资料,动画优化。。。。。。顺藤摸瓜,就找到了requestAnimationFrame。之前也听说过这个,但是就是没有认真捣鼓过,作为一名有态度的前端人员,明明知道这个样子,你竟然不去捣鼓它为什么是这样子,这俨然和你的气质不符合的。

requestAnimationFrame,从我英语专八的角度翻译过来就是:请求动画帧。这也真是太见名知意了。

那么问题来了,为什么会出现这个东西呢?这个东西有什么优越的地方呢?它怎么用呢?

本着‘存在即有道理’的态度。我倒是来会会这厮~~~

每秒60帧,显示频率16.7ms这是现如今大部分浏览器的标配,当显示频率低于16.7ms的时候,就会发现之前所说的跳帧。当你主动使用setInterval()或者setTimeout()时候,如果显示频率为10m或者5ms,这时候就会出现这种情况,这肯定是会降低其他应用的性能的,这也是我们不能容忍的。

为什么会这样子呢?这就关于到资源的问题。浏览器高效的利用资源的方式应该是:让我通知大家开始和结束,我让你的绘制频率是多少就多少,跟着我走就好了,别瞎比比。

requestAnimationFrame这个API正是扮演这种被使唤的角色而应运而生了。浏览器大哥你放心,我来优化动画。如果我的优点该不够明显,让度娘说说吧:

浏览器可以优化并行的动画动作,更合理的重新排列动作序列,并把能够合并的动作放在一个渲染周期内完成,从而呈现出更流畅的动画效果。比如,通过requestAnimationFrame(),JS动画能够和CSS动画/变换或SVG SMIL动画同步发生。另外,如果在一个浏览器标签页里运行一个动画,当这个标签页不可见时,浏览器会暂停它,这会减少CPU,内存的压力,节省电池电量。

怎么用?很简单。懒得打了。。。。

// 当前时间
var start = 0;
var begin = 0;//开始位置
var end = 100;//结束位置
var during = 100;// 持续时间
var step = function() {
// 当前的运动位置
var left = Math.tween.Linear(start, begin, end, during);
// 位移
eleBall.style.transform = 'translateX(' + left + 'px)'; // 时间递增
start++;
// 如果还没有运动到位,继续
if (start <= during) {
requestAnimationFrame(step);
} else {
// 动画结束,这里可以插入回调...
// callback()...
}
};
// 开始执行动画
step(); 对应的清除方法:cancelAnimationFrame()

新东西兼容性总是不是十全十美,不过没关系,好东西总会有各种大神去使之完美。

Opera浏览器的技术师Erik Möller 把这个API的兼容性进行封装

(function() {
var lastTime = 0;
var vendors = ['webkit', 'moz'];
for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
window.cancelAnimationFrame =
window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
} if (!window.requestAnimationFrame)
window.requestAnimationFrame = function(callback, element) {
var currTime = new Date().getTime();
var timeToCall = Math.max(0, 16 - (currTime - lastTime));
var id = window.setTimeout(function() { callback(currTime + timeToCall); },
timeToCall);
lastTime = currTime + timeToCall;
return id;
}; if (!window.cancelAnimationFrame)
window.cancelAnimationFrame = function(id) {
clearTimeout(id);
};
}()); OK,这不是就好了吗。

缓动的应用

上面的例子已经用了

Math.tween.Linear(start, begin, end, during);
再来一个直观的例子~~~
// 滚动到顶部缓动实现
var backToTop = function (rate) {
var doc = document.body.scrollTop? document.body : document.documentElement;
var scrollTop = doc.scrollTop; var top = function () {
scrollTop = scrollTop + (0 - scrollTop) /2;
if (scrollTop < 1) {
doc.scrollTop = 0;
return;
}
doc.scrollTop = scrollTop;
requestAnimationFrame(top);
};
top();
};

requestAnimationFrame之缓动的应用的更多相关文章

  1. window.requestAnimationFrame与Tween.js配合使用实现动画缓动效果

    window.requestAnimationFrame 概述 window.requestAnimationFrame()这个方法是用来在页面重绘之前,通知浏览器调用一个指定的函数,以满足开发者操作 ...

  2. canvas缓动3

    这次缓动的是旋转旋转,写完之后才知道原来rotate是绕原点旋转,而且还带着rect本身的X与Y一起,所以我采用了translate达到位移效果,以免旋转到画布外面去,画完之后效果惨不忍睹,原来是忘记 ...

  3. canvas缓动2

    同之前的缓动原理.这里将终点换成鼠标,做出跟随效果 var canvas = document.getElementById("canvas"); var cxt=canvas.g ...

  4. canvas缓动

    通过不断地将与目标的距离和系数相乘来让物体实现远快近缓的运动. 如图所示可以做出缓动效果,具体代码如下 var canvas = document.getElementById("canva ...

  5. JS实现缓动动画效果

    原理如下: 假设要从数值A变化到数值B,如果是线性运动,则每次移动距离是一样:如果是缓动,每次移动距离不一样.那如何才能不一样呢?很简单,按比例移动就可以. 例如:每次移动剩余距离的一半. 对吧,超容 ...

  6. tweenjs缓动算法使用小实例

    这里的tweenjs不是依托于createjs的tewwnjs,而是一系列缓动算法集合.因为本身是算法,可以用在各个业务场景中,这也正是总结学习它的价值所在.tweenjs代码详情: /* * Twe ...

  7. jQuery-1.9.1源码分析系列(十五) 动画处理——缓动动画核心Tween

    在jQuery内部函数Animation中调用到了createTweens()来创建缓动动画组,创建完成后的结果为: 可以看到上面的缓动动画组有四个原子动画组成.每一个原子动画的信息都包含在里面了. ...

  8. 背水一战 Windows 10 (15) - 动画: 缓动动画

    [源码下载] 背水一战 Windows 10 (15) - 动画: 缓动动画 作者:webabcd 介绍背水一战 Windows 10 之 动画 缓动动画 - easing 示例演示缓动(easing ...

  9. thwen 缓动框架

    描述 目前提供一个方法 ele 元素对象 obj 操作 duration 时间 effect 缓动选择 thwenMove(option) 框架支持以下缓动策略 -指数衰减的正弦曲线缓动 -圆形曲线的 ...

随机推荐

  1. angular2 学习笔记 ( animation 动画 )

    refer : https://angular.io/guide/animations https://github.com/angular/angular/blob/master/packages/ ...

  2. 记一次将公司网站http换成https

    看了博客园将近一年了,一直都只是在被动的看,总觉得应该写点什么,但是又不知道该写点什么.今天正好公司要把网站由http换成https,那我就顺便记录一下吧. 由于之前没有弄过,所以就面向百度编程. 首 ...

  3. django 配置URLconf和获取值

    django中正确配置url匹配找到视图: 1 在项目下的settings.py中ROOT_URLCONF = "项目名.urls" 表示 前台发来请求会先去项目下的test3/u ...

  4. Python之协程

    前言 在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把cpu的利用率提高很多了.但是我们知道无论是创建多进程还是创建多线程来解决问题,都要消耗一定的时间来创建 ...

  5. POJ-1251 Jungle Roads---MST裸题(需要编号)

    题目链接: https://vjudge.net/problem/POJ-1251 题目大意: 首先给你一个图,需要你求出最小生成树,输入N个节点,用大写字母表示了节点,然后节点与节点之间有权值. 思 ...

  6. requests-证书验证

    import requests #response = requests.get('https://www.12306.cn') #print(response.status_code) #以上会显示 ...

  7. JProfiler简明使用教程

    JProfile是一款性能瓶颈分析工具,监控粒度可以细化到某一个类包,堪称神器!我安装了一下9.11的版本,并简单说说使用方法. 1:创建一个监控任务 2:选择tomcat版本 3:监控远程服务器 4 ...

  8. 在windows系统之中查看目前已安装的更新

    方法1:使用PowerShell get-hotfix 方法2:使用cmd systeminfo.exe 参考链接

  9. [LeetCode] Poor Pigs 可怜的猪

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  10. ConcurrentHashMap源码分析(1.8)

    0.说明 1.ConcurrentHashMap跟HashMap,HashTable的对比 2.ConcurrentHashMap原理概览 3.ConcurrentHashMap几个重要概念 4.Co ...