早期的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. 域名(Domain Name)

    是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置,地理上的域名,指代有行政自主权的一个地方区域). 域名是一个IP地址 ...

  2. MyBatis 常用写法

    MyBatis 常用写法 1.forEach 循环   forEach 元素的属性主要有 item, idnex, collection, open, separator, close. collec ...

  3. 地址解析协议ARP,网络层协议IP、ICMP协议

    分析所用软件下载:Wireshark-win32-1.10.2.exe 阅读导览 1. 分析并且应用ARP协议 2.分析IP协议 3.分析ICMP协议 1.分析arp报文的格式与内容 (1)ping ...

  4. JAVA成员变量的隐藏

    一.如果子类与父类中有一个相同名称的成员变量,那么子类的成员变量会不会覆盖父类的成员变量?我们看下在的例子: public class A { public int x=10; } public cl ...

  5. 高并发第六弹:线程封闭(ThreadLocal)

    当访问共享的可变数据时,通常需要使用同步.一种避免使用同步的方式就是不共享数据.如果仅在单线程内访问数据,就不需要同步.这种技术被称为线程封闭. 它其实就是把对象封装到一个线程里,只有一个线程能看到这 ...

  6. spring boot入门笔记 (二) - application.properties配置文件

    项目最重要的一个东西,用来定义整个项目的一些东西(端口.访问项目的名称.数据源.日志.集成mybatis等框架.静态资源目录.thymeleaf.热部署等),很重要很重要的. #整个项目的端口号,默认 ...

  7. navicat 批量插入 测试数据

    1. 前言 遇到线上大sql执行较慢, 10s+, 做优化改进时,首先想到的是在本地造出一个类似的库环境,先本地实验. 然后往表中创建大量数据... 2. 方案 利用mysql函数来插入大量数据 代码 ...

  8. cf605D. Board Game(BFS 树状数组 set)

    题意 题目链接 有\(n\)张牌,每张牌有四个属性\((a, b, c, d)\),主人公有两个属性\((x, y)\)(初始时为(0, 0)) 一张牌能够被使用当且仅当\(a < x, b & ...

  9. JSPatch 可以让你用 JavaScript 书写原生 iOS APP

    简介   JSPatch 可以让你用 JavaScript 书写原生 iOS APP.只需在项目引入极小的引擎,就可以使用 JavaScript 调用任何 Objective-C 的原生接口,获得脚本 ...

  10. Flutter:Slivers大家族,让滑动视图的组合变得很简单!

     今天呢,我小拉面主要想给大家讲一讲Flutter中的Slivers大家族的使用场景和方法.开发过列表布局的同学们应该对Slivers系列的控件不陌生,或多或少都用过这个库中的控件,来解决复杂的滑动嵌 ...