queue:

queue主要用于给元素上的函数队列(默认名为fx)添加函数(动画效果),
这样dequeue就可以取出并执行函数队列中的第一个函数(即最先进入函数队列的函数),
delay则可以延迟元素上函数队列的执行。

jquery的动画效果,如animation()、show()、slideUp()、fadeIn()等在我看来它的效果就是用queue给fx队列添加一个函数,然后用dequeue调用了它。

queue相关用法:

.queue(queueName):元素上的函数队列

.queue(queueName,newQueue):用newQueue替换掉queueName,所以.queue(queueName,[])即为停止动画。

.queue(queueName,callback):queueName执行完后的回调函数,它会忽略后续queueName的动画函数

.clearQueue(queueName):清空(剩余)函数队列,正在执行的那个函数会继续

.dequeue(queueName):取出并执行函数队列中的第一个函数

.delay(time,queueName):过time(单位为毫妙)后才执行queueName中的函数

注:以上忽略queueName是即为默认的‘fx'

.stop()或.stop(false):跳过正在执行的那个函数,立马运行下一个动画函数

.stop(true):立即停止动画

.stop(false,true):立即跳到当前函数的结束状态,开始执行下一个函数。

但是stop()只能清空动画队列,不能清空所有通过 .queue() 创建的队列(clearQueue可以)。

animation中也用到了queue:
.animation(params,options):
params::一组包含作为动画属性和终值的样式属性和及其值的集合
options:动画的额外选项。如常用的有:
duration/speed - 设置动画持续的时间;
easing - 规定要使用的 easing 函数,jquery只提供了swing(默认值)和linear,要用别的需要下载插件,
可在http://james.padolsey.com/demos/jquery/easing/查看各种效果;
callback - 规定动画完成之后要执行的函数;
queue - 布尔值。指示是否在效果队列中放置动画,默认值为true。如果为 false,则动画将立即开始(如果当前有正在执行的动画函数,则它会与之同时执行)

来看看实例练习:

参考jQuery动画高级用法(上)——详解animation中的.queue()函数

我们知道如果这样:

实例练习0:

$('#id1').fadeOut('slow').fadeIn('slow');

结果是:id1会先消失,然后再出现。

若要达到先消失,然后再另一个div里出现的效果,如果这样写:

实例练习1:

$('#id1').fadeOut('slow').appendTo($('#rightC')).fadeIn('slow');

id1
 

结果是:id1先append,然后fadeOut,再fadeIn;

为什么没有按代码书写的顺序执行呢?

原因是元素上的非动画函数(如改变css或是append等)就是会自动先于动画函数执行。
为了改变这种情况,我们可以人为的把非动画函数也加入函数队列,然后执行它就可以了。
修改为:

实例练习2:

$('#id1').fadeOut('slow')
.queue(function(){$(this).appendTo($('#rightC);})
.fadeIn('slow');

测试一下:

id1
 

结果id1消失了,通过查看源代码可以发现append也执行了,但是fadeIn却没有执行,为什么呢?看前面的“queue相关用法”就知道了。

怎样修改能达到预期效果呢?

试试下面这样:

实例练习3:

$('#id1').fadeOut('slow')
.queue(function(){$(this).appendTo($('#rightC')).dequeue();})
.fadeIn('slow');

测试一下:

id1
 

结果是:表现正常。

如果这样呢:

实例练习4:

$('#id1').fadeOut('slow')
.queue(function(){$(this).appendTo($('#rightC')).dequeue();})
.fadeIn('slow')
.fadeOut('slow');

继续测试:

id1
 

结果也是与预期效果一致,fadeIn结束后即使没有.dequeue(),后一个动画函数也会自己执行。

再来看另一个实例:

实例:
同样来自jQuery动画高级用法(上)——详解animation中的.queue()函数

一个div样式为:
#object{position:absolute;width:200px;height:200px;top:100px;left:0;background:blue;}

现在要达到这样的效果:
在2s内top由默认的100px均匀变为60px,并且在那2s的后1s内opacity由默认的1慢慢变为0。

我首先想到的是:

实例练习5:

$('#object').animate({top:'-=20'},1000)
.animate({top:'-=20',opacity:0},1000);
object

结果:在第1s到第2s之间有明显的停顿,整体的向上移动并不是匀速的。

自然修改成下面这样:

实例练习6:

$('#object').animate({top:'-=20'},{duration: 1000, easing: 'linear'})
.animate({top:'-=20',opacity:0},{duration: 1000, easing: 'linear'});
object

结果:正常了。

换一种方法:
top不拆成两部分,而是设置一秒以后同时运行opacity。

实例练习7:

$("#object")
.delay(1000)
.queue(function() {
$(this).animate({opacity:0},{duration: 1000, queue: false}).dequeue();
})
.animate({top: "-=40"}, {duration: 2000});
object

结果是:1s以后同时开始了opacity和top,这不符合要求。

原因很容易理解:delay针对的是‘fx',queue是立马添加函数成员到'fx’并运行,animate也是'fx'中的成员。所以为了仅仅delay变化透明度的动画效果,必须把它和'fx'区分开来。

实例练习8:

$("#object")
.delay(1000,'fade')
.queue('fade',function() {
$(this).animate({opacity:0},{duration: 1000, queue: false}).dequeue();
})
.animate({top: "-=40"}, {duration: 2000});
object

结果:立马执行top,但始终没有执行opacity。

修改为:

实例练习9:

$("#object")
.delay(1000,'fade')
.queue('fade',function() {
$(this).animate({opacity:0},{duration: 1000, queue: false}).dequeue();
})
.dequeue('fade')
.animate({top: "-=40"}, {duration: 2000});
object

结果:正常了。

而且如果去掉.queue()里面的.dequeue()(实例练习10),表现依然正常。

对比实例练习7(执行了.queue里面的函数)和实例练习8(没有执行.queue()里面的自定义函数),可以发现:

.queue('fx',callback)可以自己执行callback,而.queue('yourOwnName',callback)则需要手动执行.dequeue('yourOwnName');

其实并不是上面说的这样,而是因为fx中的第一个函数总是会自动执行,不管是通过.queue()还是.animate()方式添加进去的,只是queue会阻止后续fx函数成员。而自定义的成员列表.queue('yourOwnName',callback)都需要手动执行。

可以通过实例练习0、2、4和下面这些个例子验证:

$('#id1').queue(function(){$(this).appendTo($('#rightC'));})
.fadeOut('slow')
.fadeIn('slow'); //仅仅append
$('#id1').queue(function(){$(this).appendTo($('#rightC')).dequeue();})
.fadeOut('slow')
.fadeIn('slow'); //按照append、fadeOut、fadeIn一次发生
$('#id1').queue(function(){$(this).appendTo($('#rightC'));})
.dequeue() //执行下一个函数成员
.fadeOut('slow')
.fadeIn('slow'); //按照append、fadeOut、fadeIn一次发生
$('#id1').fadeOut('slow')
.queue(function(){$(this).appendTo($('#rightC'));})
.dequeue()
.fadeIn('slow'); //按照fadeOut、append、fadeIn一次发生

对比实例练习10(执行了.queue后面的函数)和实例练习2(没有执行.queue后面的函数),可以发现原因:

.queue带queueName参数时默认会忽略queueName后续函数,不带这个参数就是忽略fx,而后面的fadeIn就是添加到fx,所以实例练习2中后面left没有执行。
而实例练习10中只忽略了‘fade’,而后面的animate是添加到fx的,二者不影响。

一些关于自定义函数列表的练习:

$('#object')
.queue('fade',function() {
$(this).animate({left: "+=100"},{duration: 1000}).dequeue('fade'); })
.animate({top: "-=40"}, {duration: 2000});//仅仅运行了animate
$("#object")
.delay(1000,'fade')
.queue('fade',function() {
$(this).animate({left: "+=100"},{duration: 1000, queue: false});})
.dequeue('fade')
.queue('fade',function() {
$(this).animate({opacity:0},{duration: 1000});}) //不会执行
.animate({top: "-=40"}, {duration: 2000});
//一开始执行top,经过1000ms后同时执行left。如果left中queue:true,则一开始执行top,经过1000ms后本应该要执行left,但因为要排队,所以left会等到top结束后再执行。
$("#object")
.delay(3000,'fade')
.queue('fade',function() {
$(this).animate({left: "+=100"},{duration: 1000, queue: false}).dequeue('fade'); })
.dequeue('fade')
.queue('fade',function() {
$(this).animate({opacity:0},{duration: 1000});})
.animate({top: "-=40"}, {duration: 2000});
//一开始执行top,经过2000ms后top完毕,等1000ms,在第3s的时候开始同时执行left和opacityt(如果left的queue:true,opacity:false效果也是一样的)。
//如果在left中设置queue:true,则在第3s时先开始left,然后再opacity。

另一种常用的用法是:把所有的动画效果按发生顺序集中写一个数组中。

var func=[
function(){
$("#id1").animate({left: "+=100"},1000 ,deq);
},
function(){
$("#id1").delay(2000);
$("#id1").animate({top: "+=50"},1000 ,deq);
},
function(){
$("#p1").animate({height: "+=100"},1000 );
}
];
$('.divC').queue('myanimations',func);
function deq(){$('.divC').dequeue();}
deq();

jquery的queue方法的更多相关文章

  1. jquery源码解析:jQuery队列操作queue方法实现的原理

    我们先来看一下jQuery中有关队列操作的方法集: 从上图可以看出,既有静态方法,又有实例方法.queue方法,相当于数组中的push操作.dequeue相当于数组的shift操作.举个例子: fun ...

  2. 关于Plupload结合上传插件jquery.plupload.queue的使用

    之前使用过很多的上传组件,但对各种浏览器的兼容性太差,不得不放弃!! plupload 是款很强大的上传组件,不得不推荐.plupload 前端根据浏览器不同选择使用Html5. Gears, Sil ...

  3. jQuery 之 .stop() 方法

    总结version 1.7版本前.stop([clearQueue][,jumpToEnd])clearQueue: 布尔值,默认是 false;此值处理是相关的动画队列是否移除,如果为 false ...

  4. JQuery队列queue与原生模仿其实现

    jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用.特别animate动画,ajax,以及timeout等需要一定时间的函数. queue() 方 ...

  5. CSS-03 queue方法

    queue方法 摘自W3C school手册,用于简单理解使用queue方法 队列 每个元素均可拥有一到多个由 jQuery 添加的函数队列.在大多数应用程序中,只使用一个队列(名为 fx).队列运行 ...

  6. jquery 通过submit()方法 提交表单示例

    jquery 通过submit()方法 提交表单示例: 本示例:以用户注册作为例子.使用jquery中的submit()方法实现表单提交. 注:本示例仅提供了对表单的验证,本例只用选用了三个字段作为测 ...

  7. jquery.on()超级方法

    $.on()方法是jquery1.7之后的一个超级方法,将事件绑定和事件委托整合到一个函数中去,支持绑定多个事件,并且可以绑定自定义事件.使用起来很方便. demo传送门 事件委托 首先说一下事件委托 ...

  8. 重写jquery的ajax方法

    //首先备份下jquery的ajax方法 var _ajax=$.ajax; //重写jquery的ajax方法 $.ajax=function(opt){ //备份opt中error和success ...

  9. jQuery的extend方法

    jq中的extend在面试中经常会被问道,今天我总结一个下有关于extend的用法三种进行对比,可能不全,希望大家指点, 用法一: $.extend({})  ,为jQuery类添加方法,可以理解为扩 ...

随机推荐

  1. 50个PHOTOSHOP快捷键技能!

    一.常用的热键组合 1.图层混合模式快捷键:正常(Shift + Option + N),正片叠底(Shift + Option + M),滤色(Shift + Option + S),叠加(Shif ...

  2. LeetCode _ Gas Station

    There are N gas stations along a circular route, where the amount of gas at station i is gas[i]. You ...

  3. C51汇编语言完整源码

    单片机最小系统,两位LED数码管由串口输出接两个164驱动,Lout,Rout为左右声道输出,SET,  ALT0, ALT1为三个按键,也可自己在开始的I/O定义改成你想用的I/O口:12M晶振,若 ...

  4. use "man rsyslogd" for details. To run rsyslog interactively, use "rsyslogd -n"to run it in debug mo

    zjtest7-frontend:/root# service rsyslog start Starting system logger: usage: rsyslogd [options] use ...

  5. vsftpd,tftp安装配置

    一. 对比共同点:都包含ftp不同点:1)vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序.你可以通过ftp客户端上传下载软件.可设置访问用户名密码,或匿名anonymous登陆.默认 ...

  6. 2012高校GIS论坛

    江苏省会议中心 南京·钟山宾馆(2012年4月21-22日) 以"突破与提升"为主题的"2012高校GIS论坛"将于4月在南京举行,由南京大学和工程中心共同承办 ...

  7. 设计模式(八):Bridge桥接模式 -- 结构型模式

    1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...

  8. HDU_2045——RPG问题,递推

    Problem Description 人称“AC女之杀手”的超级偶像LELE最近忽然玩起了深沉,这可急坏了众多“Cole”(LELE的粉丝,即"可乐"),经过多方打探,某资深Co ...

  9. 深入理解linux网络技术内幕读书笔记(五)--网络设备初始化

    Table of Contents 1 简介 2 系统初始化概论 2.1 引导期间选项 2.2 中断和定时器 2.3 初始化函数 3 设备注册和初始化 3.1 硬件初始化 3.2 软件初始化 3.3 ...

  10. java基础知识(二)

    java的布局管理: borderLayout:则将板块分为东西南北中五个方向,每添加一个组件就要指定组件摆放的方位,放置在东西南北四个方向的组件将贴边放置.当拉大Frame的时候,处在center( ...