JavaScipt 动画引擎
队列操作
jquery中有一个Queue队列的接口,这个模块没有单独拿出来作为一个章节是因为这个是内部专门为动画服务的,Queue队列如同data数据缓存与Deferred异步模型一样,都是jQuery库的内部实现的基础设施
Queue队列
队列是一种特殊的线性表,只允许在表的前端(队头)进行删除操作(出队),在表的后端(队尾)进行出入操作(入队),队列的特点是先进先出,最先插入的元素最先被删除。
为什么要引入队列
var a = 1;
setTimeout(function(){
a=2;
},0)
alert(a);
我们一直习惯于线性的编写代码逻辑,但是在JavaScript编程几乎总是伴随着异步操作:
setTImeout,css3Transition/Animation,ajax,dom的绘制,postmessage,web Database 等等,大量异步操作所带来的回调函数会把我们的算法分解,对于“异步+回调”的模式,怎么“拉平”异步操作使之跟同步一样,因为异步操作进行流程控制的时候无非避免的要嵌套大量的回调逻辑,所以就会出现 promises 约定了。
那么 jQuery 引入队列其实从一个角度上可以认为:允许一系列函数被异步地调用而不会阻塞程序。
看一个代码段:
$("#Aaron").slideUp().fadeIn()
这是 jQuery 的一组动画链式序列,它的内部其实就是一组队列 Queue,所以队列和 Deferred 地位类似,是一个内部使用的基础设施。
- 当 slideUp 运行时,fadeIn 被放到 fx 队列中
- 当 slideUp 完成后,从队列中被取出运行
Queue 函数允许直接操作这个链式调用的行为,同时 Queue 可以指定队列名称获得其他能力而不局限于 fx 队列。
jQuery 提供了 2 组队列操作的 API:
jQuery.queue/dequeue
jQuery.fn.queue/dequeue
但是不同与普通队列定义的是:
- jQuery.queue 和 jQuery.fn.queue 不仅执行出队操作返回队头元素,还会自动执行返回的队头元素
- fn 是扩展在原型上的高级API是提供给实例使用的
- .queue/.dequeue 其内部是调用的 .queue,.dequeue 静态的底层方法实现入列与出列
queue与dequeue
$.queue:显示或操作匹配的元素上已经执行的函数队列这个方法有两个作用,它既是setter,又是getter,第一个参数elem是DOM元素,第二个参数type是字符串,第三个参数data可以是function或数组。
var body = $('body');
function cb1(){alert(1)}
function cb2(){alert(2)}
//set 第三个参数是函数
$.queue(body,'aa',cb1);
$.queue(body,'aa'cb2);
//get
$.queue(body,'aa');
这个方法有点类型get有点类似队列的push操作,jQuery的方法的接口重载是非常严重的,经常同一个接口既是set也是get,不管符不符合基本原则,但是它却很实用,无非就是把数据给缓存起来,为什么载体是一个jQuery对象,因为保存数据的手段是通过data数据缓存实现的
data 与 jQuery 对象之间是通过 uuid 建立了一个无耦合的映射关系,具体可以翻阅之前的关于“数据缓存”,源码有一个默认处理 type = (type || "fx") + "queue" 可见是专职供fx动画队列处理的。
_queueHooks: function(elem, type) {
var key = type + "queueHooks";
return data_priv.get(elem, key) || data_priv.access(elem, key, {
empty: jQuery.Callbacks("once memory").add(function() {
data_priv.remove(elem, [type + "queue", key]);
})
});
}
fn.call(elem, next, hooks)
if ( !startLength && hooks ) {
hooks.empty.fire();
}
book.animate({
left: '+=50',
}).animate({
left: '+=100',
}).animate({
left: '-=50',
});
动画是异步的,但是animate方法的链式代码是同步的,所以这里要涉及一个最重要的问题,动画队列要如何有序的调用。
传统的思路:
定时器setTimeout方法收集,用一个数组保存每一个animate方法,把animate方法排成队列,之后开始执行动画
这里存在的一个严重的问题,让定时器产生足够长的时间差,那么这个时间差需要多长,显而易见这样的思路不是非常的精确。
jQuery 为动画量身定制了队列机制,我们的思路可以是这样
- 有一个队列,在执行第一个 animate 方法的时候加入队列就开始执行动画,因为动画自己在执行的时候就会产生异步的时间差
- 我们在这个时间差的里面继续去加入之后的动画 animate 进去队列,然后在每一个动画结束之后去取出队列中的第一个 animate 方法开始执行,依次循环下去
动画的参数
jQuery的内部的方法都是针对 API 的处理范围设计的,我们看看 Animation 方法的支持情况:
.animate( properties [, duration ] [, easing ] [, complete ] )
.animate( properties, options )
- 区别就与第二组数据的传递,options 是支持对象传参
- properties 参数就是写一个 CSS 属性和值的对象,动画都是涉及变化的,那么什么值才能变化?
- 理论上来说有数值的属性都是可以变化的,width, height 或者 left 可以执行动画,但是 background-color 不能,但是也不是绝对的,主要看数据的解析度,可以用插件支持
- 除了样式属性, 一些非样式的属性,如 scrollTop 和 scrollLeft,以及自定义属性,也可应用于动画
- 除了定义数值,每个属性能使用'show', 'hide', 和 'toggle'。这些快捷方式允许定制隐藏和显示动画用来控制元素的显示或隐藏。为了使用 jQuery 内置的切换状态跟踪,'toggle'关键字必须在动画开始前给定属性值
JavaScipt 动画引擎的更多相关文章
- SpriteSheet精灵动画引擎
SpriteSheet精灵动画引擎 本文介绍Flash中SpriteSheet精灵序列图与其它渲染方式的性能对比.SpriteSheet的原理及注意实现,最后实现了一个精灵序列图的渲染引擎.本文的 ...
- 第四十二课:基于CSS的动画引擎
由于低版本浏览器不支持css3 animation,因此我们需要根据浏览器来选择不同的动画引擎.如果浏览器支持css3 animation,那么就使用此动画引擎,如果不支持,就使用javascript ...
- 聊聊动画引擎 pop
iOS可以通过CADisplayLink实现自定义动画引擎,pop就是基于此实现的,而且比原生Core Animation更强大好用.譬如当ViewController侧滑返回的时候,系统会将Core ...
- POP动画引擎中Layer与CALayer的一点区别
POP动画引擎是facebook提供的一个开源框架, 可以实现很多的动画效果, 这里就不一一介绍啦, 有兴趣的童鞋请移步: https://github.com/facebook/pop 下面简单的讲 ...
- [译]理解 Windows UI 动画引擎
本文译自 Nick Waggoner 的 "Understand what’s possible with the Windows UI Animation Engine",已获原 ...
- 基于canvas与原生JS的H5动画引擎
前一段时间项目组里有一些H5动画的需求,由于没有专业的前端人员,便交由我这个做后台的研究相关的H5动画技术. 通过初步调研,H5动画的实现大概有以下几种方式: 1.基于css实现 这种方式比较简单易学 ...
- Xcode7.3.1中通过最新的CocoaPod安装pop动画引擎
CocoaPod是一个用ruby实现,用于方便的管理Xcode中第三方插件的管理器.用它我们可以很方便的安装和升级插件而不用担心破坏原有的项目. 而pop是一个用于实现App中动画的引擎,它是由Fac ...
- HTML5 动画引擎 小记
国内: Cocos2d-x js版本 layabox Egret Sirius2D lufylegend.js Fireball 国外: CreateJS(EaselJS.TweenJS)http ...
- 用POP动画引擎实现弹簧动画(POPSpringAnimation)
效果图: #import "ViewController.h" #import <POP.h> @interface ViewController () @proper ...
随机推荐
- JuJu团队11月28号工作汇报
JuJu团队11月28号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 于达 解决了数据接口的bug 生成generator形式, 并用熟悉Julia处理数据的方法 处理数据步 ...
- POJ 2823:Sliding Window 单调队列
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 48930 Accepted: 14130 ...
- JS高级学习笔记(1)- 数据类型及转换规则
必读: Javascript对象Oject的强制类型转换 JavaScript筑基篇(二)->JavaScript数据类型 聊一聊valueOf和toString 深入理解JavaScript系 ...
- 干货分享:反思Essay写作指南
在众多Essay写作类型中,有一种较为难写的一种类型——反思写作(Reflective Writing),提前熟悉这类写作风格的要求,并且养成反思性写作的习惯,非常有必要!本文小编就给大家说说什么是反 ...
- 打开文件管理器Device File Explorer
版本Android Studio3.2
- (20)sopel算法
基础知识的理论,主要看这个博客:https://blog.csdn.net/github_38140310/article/details/68959931 然后代码展示: #include &quo ...
- Elasticsearch 使用集群 - 创建和查询文档
章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...
- chrome浏览器安装vue调试器vue-devtools
chrome浏览器安装vue调试器vue-devtools https://blog.csdn.net/zhangjnwei/article/details/76693053
- LARGE_INTEGER 64位的输出格式
%016I64x 第一个016是指当最左边无数据时用00填充:后面的I64x是__int64的前缀要求格式十六进制输出.
- html特殊字符的写法
符号 写法 (空格) <(小于号) < >(大于号) > " " ®(已注册) ® ©(版权) © ™(商标) ™ (半方大的空白) (全方大的空白 ...