早期的JS动画

早期的JS循环动画主要是通过setInterval/setTimeout实现的

function jump() {
console.log("我跳了一下");
} (function() {
function updataAniamtion() {
jump();
} setInterval(updataAniamtion, 17);
})();

大多数显示器的刷新率为60HZ,因此最佳循环间隔约17ms,使用setInterval可以实现很平滑流畅的动画。

setInterval/setTimeout动画的缺陷

但是由于JS执行机制中,setInterval属于异步任务,实际上是每隔xx毫秒就将参数当中的函数添加到UI线程队列当中,然后等待当前event-Loop中同步任务执行完毕后才开始执行异步任务,这意味着,假如有一个for循环需要执行很久,那么即使你setInterval或者setTimeout当中的延时为0,依然不是马上执行。

setTimeout(function() {
console.log("我是延时0的异步事件");
}, 0); for( let i = 0; i < 1000000000; i++) {
continue;
}

你可以将以上代码复制到你的代码编辑器当中,然后保存刷新,你会发现setTimeout当中的函数并不是马上执行,而是稍微停顿了一下才执行,如果你将for循环的i数值再增大3倍,那么将会更加明显的看出来。这就造成了setInterval动画的缺陷:不精确

想更加详细的了解JS执行机制的可以下面的第二篇参考。

requestAnimationFrame方法

该方法接收一个回调函数作为参数,告诉浏览器在下一次重绘之前调用该回调函数来执行动画,回调的次数通常是每秒60次,也就是大约时间间隔16.7ms,当然这个次数不绝对,准确说是根据浏览器的绘制间隔调整。该函数接收一个时间戳。

var element = document.getElementById('box');
element.style.position = 'absolute'; function moveRight(timestamp) {
// 根据时间戳改变样式
element.style.left = Math.min(timestamp / 10, 300) + 'px'; // 时间戳大于2000ms的时候停止
if (timestamp < 2000) {
window.requestAnimationFrame(moveRight);
}
}
// 调用
window.requestAnimationFrame(moveRight);

假设html当中已经有一个ID为box的盒子,如以上的代码,这个盒子会做向右移动的动画,这里的时间戳可以理解为,第一次启动的时候开始一个计时器,然后通过计时器来进行动画,也就是基于时间戳的动画。

有了CSS3还需要JS动画吗?

需要,虽然CSS的animation以及transition非常强大,但是仍然有不足之处,而requestAnimationFrame可以解决这些问题。

  • 统一的向下兼容策略

    有一些效果CSS3实现兼容性差,例如淡入淡出,而requestAnimationFrame则方便许多,使用方法都是单回调的方式,同setTimeout相同

  • 属性兼容

    对于CSS而言有些属性是不兼容的,而使用requestAnimationFrame可以,例如scrollTop

  • 配合缓动可以实现很复杂的动画效果

参考

JavaScript动画的更多相关文章

  1. 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画

    CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ...

  2. javascript动画系列第三篇——碰撞检测

    前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...

  3. javascript动画系列第一篇——模拟拖拽

    × 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...

  4. JavaScript动画知多少?

    今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户. JS如何制造出动画效果? 结合浏览器提供的 setInterval ...

  5. Javascript动画效果(三)

    Javascript动画效果(三) 前面我们已经介绍了速度动画.透明度动画.多物体运动和任意值变化,并且我们在Javascript动画效果(二)中介绍到我们封装了一个简单的插件雏形,接下来我们对前面的 ...

  6. Javascript动画效果(一)

    Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的 ...

  7. Javascript动画效果(二)

    Javascript动画效果(二) 在前面的博客中讲了简单的Javascript动画效果,这篇文章主要介绍我在改变之前代码时发现的一些问题及解决方法. 在前面的多物体宽度变化的例子中,我们给其增加代码 ...

  8. Javascript动画效果(四)

    Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下 ...

  9. 给力的轻量级JavaScript动画框架 - jsMorph

    jsMorph 是一个独立的轻量级 JavaScript 动画框架,可以用它来操纵多个 HTML 元素的样式,实现动画效果.此框架会自动检测起始位置.转换单位.调整渲染的速度,以此来获得更流畅的渲染体 ...

  10. 10 个顶级 JavaScript 动画框架推荐

    使用JavaScript可以做出一些引人注目的动画效果,但通常不太容易实现.本文为你整理了10个非常优秀的JavaScript动画框架,使用它们你可以轻松实现动画效果.1. RaphaëlRaphaë ...

随机推荐

  1. [CQOI 2018]九连环

    Description 题库链接 给你一个 \(n\) 连环,游戏规则是: 第一个(最右边)环任何时候都可以任意装上或卸下: 如果第 \(k\) 个环没有被卸下,且第 \(k\) 个环右边的所有环都被 ...

  2. Spring MVC之源码速读之RequestMappingHandlerAdapter

    spring-webmvc-4.3.19.RELEASE 下面来看DispatcherServlet中的执行: /** * Exposes the DispatcherServlet-specific ...

  3. Template parse errors: The pipe 'translate' could not be found

    问题描述: 基于Ionic最新的super模板,创建的项目,在自己改造成懒加载机制后,原本正常的项目出现问题了,提示模板内部使用的翻译管道找不到,如图: 模板内部使用的翻译管道代码,我确定没有问题, ...

  4. [javaSE] 变量的传值与传址

    变量:就是将不确定的数据进行存储.也就是需要在内存中开辟一个空间 这个空间需要一个名称,这个名称就是变量名 基本数据类型:byte,short,int,long,double,float,char,b ...

  5. Xcode8 log问题

    去除一堆log的方法: Xcode8--->Product---- Edit Scheme... -> Run -> Arguments, 在Environment Variable ...

  6. 浅谈一致性哈希(My转)

    一致性哈希(Consistent hashing)算法是由 MIT 的Karger 等人与1997年在一篇学术论文(<Consistent hashing and random trees: d ...

  7. 关于JS中闭包的问题

    一直以来,我都以为我已经懂了JavaScript中闭包的概念,直到有一次小伙伴突然问我这个概念的时候,我才发现我根本不知道该怎来么跟他来讲述这个概念. 那时候我就知道我是自我欺骗,打肿脸充胖子了. 所 ...

  8. 一文告诉你git如何使用

    提供简易教程学习网址 http://www.bootcss.com/p/git-guide/ git add . //提交至缓存 git commit -m '注释' //提交至本地 (git com ...

  9. PHP IN_ARRAY 函数 使用需要注意的地方

    今天 看PPChttp://bbs.phpchina.com/thread-171993-1-7.html 这个问题. 其实关键还是因为 php是弱类型语言,php进行比较的时候 最好还是使用stri ...

  10. CF954F Runner's Problem

    离散化+矩阵快速幂 首先看数据范围可以确定该题的算法为矩阵快速幂 然后易得转移矩阵 \[\begin{bmatrix} 1 & 1 & 0 \\ 1 & 1 & 1 \ ...