JavaScript动画
早期的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高级程序设计3-第25章
- 这一次,彻底弄懂 JavaScript 执行机制
- CSS3动画那么强,requestAnimationFrame还有毛线用?
- window.requestAnimationFrame——MDN
JavaScript动画的更多相关文章
- 梅须逊雪三分白,雪却输梅一段香——CSS动画与JavaScript动画
		CSS动画并不是绝对比JavaScript动画性能更优越,开源动画库Velocity.js等就展现了强劲的性能. 一.两者的主要区别 先开门见山的说说两者之间的区别. 1)CSS动画: 基于CSS的动 ... 
- javascript动画系列第三篇——碰撞检测
		前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ... 
- javascript动画系列第一篇——模拟拖拽
		× 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ... 
- JavaScript动画知多少?
		今天,小学生以自己浅薄的见地,在前辈大能的基础上写这篇文章,希望给大家打开一扇窥探JavaScript(以下简称JS)动画的窗户. JS如何制造出动画效果? 结合浏览器提供的 setInterval ... 
- Javascript动画效果(三)
		Javascript动画效果(三) 前面我们已经介绍了速度动画.透明度动画.多物体运动和任意值变化,并且我们在Javascript动画效果(二)中介绍到我们封装了一个简单的插件雏形,接下来我们对前面的 ... 
- Javascript动画效果(一)
		Javascript动画效果(一) 前面我们介绍了Javascript的回到顶部效果,今天呢,我们对Javascript动画做进一步的研究.在这篇博文中我们只介绍简单的匀速运动.简单的缓冲运动和简单的 ... 
- Javascript动画效果(二)
		Javascript动画效果(二) 在前面的博客中讲了简单的Javascript动画效果,这篇文章主要介绍我在改变之前代码时发现的一些问题及解决方法. 在前面的多物体宽度变化的例子中,我们给其增加代码 ... 
- Javascript动画效果(四)
		Javascript动画效果(四) 前面我们自己写了一个小小的关于js动画的插件,下面我们来使用之前的框架来完成我们想要的动画效果.我们经常在淘宝网中看到,鼠标经过某一图片时,该图片有从上滚出而又从下 ... 
- 给力的轻量级JavaScript动画框架 - jsMorph
		jsMorph 是一个独立的轻量级 JavaScript 动画框架,可以用它来操纵多个 HTML 元素的样式,实现动画效果.此框架会自动检测起始位置.转换单位.调整渲染的速度,以此来获得更流畅的渲染体 ... 
- 10 个顶级 JavaScript 动画框架推荐
		使用JavaScript可以做出一些引人注目的动画效果,但通常不太容易实现.本文为你整理了10个非常优秀的JavaScript动画框架,使用它们你可以轻松实现动画效果.1. RaphaëlRaphaë ... 
随机推荐
- dev的控件放在没有runat="server"的标签中,回调出现的问题
			dev的控件放在没有runat="server"的标签中,第一次回调是会刷新页面, 有runat="server"时不会刷新页面 
- APPCAN的mas服务报错
			报错信息 主要是: [meap_im_java]load java warning { [Error: Cannot find module 'java'] code: 'MODULE_NOT_FOU ... 
- ASP.NET MVC4应用程序无法建立控制器的解决方案/获取自己需要的EF版本
			具体错误是我建立控制器的时候出现如下图那样的错误: Unable to cast object of type 'System.Data.Entity.Core.Objects.ObjectConte ... 
- 【转】详解spring 每个jar的作用
			spring.jar 是包含有完整发布模块的单个jar 包.但是不包括mock.jar, aspects.jar, spring-portlet.jar, and spring-hibernate2. ... 
- SpringBoot(一)初遇
			环境: IDEA 2018.1.3 , jdk 1.8 , maven 3.3.9 零 第一次接触springboot, 如何学习比较困惑, 思前想后最后决定从文档来学习, 以下为学习中的参考资料: ... 
- LDA和PCA区别
			https://blog.csdn.net/brucewong0516/article/details/78684005 
- 查看Windows日志
			之前,在Windows服务管理器中启动WCF服务时,出现“本地计算机上的XXX服务启动后停止.某些服务在未由其它服务或程序使用时将自动停止.”问题,最后通过查看Windows日志中的详细信息才得以解决 ... 
- JS 面试题 实践一
			1.完成 extname 函数,它会接受一个文件名作为参数,你需要返回它的扩展名. 例如,输入 emoji.png,返回 .png. const extname = (filename) => ... 
- 在Linux上利用core dump和GDB调试
			段错误(segfault) "段错误"是程序试图操作不允许访问或试图访问的不允许内存的情况.可能导致段错误的原因主要有: 1.试图解引用空指针(你不允许访问内存地址0) 2.试图解 ... 
- 1.创建maven 项目 动态web工程完整示例
			注意,以下所有需要建立在你的eclipse等已经集成配置好了maven了,说白了就是新建项目的时候已经可以找到maven了 没有的话需要安装maven 一.创建项目 1.新建maven项目,如果不在上 ... 
