按顺序逐个动画多个标签
如果您只选择像body这样的标签进行全局排队,您可以利用jQuery内置的动画队列:
$.globalQueue = {
queue: function(anim) {
$('body')
.queue(function(dequeue) {
anim()
.queue(function(innerDequeue) {
dequeue();
innerDequeue();
});
});
return this;
}
};
$(".button").click(function() {
$.globalQueue
.queue(function() {
return $("#header").animate({top: "-50"}, "slow");
}).queue(function() {
return $("#something").animate({height: "hide"}, "slow");
}).queue(function() {
return $("ul#menu").animate({top: "20", left: "0"}, "slow");
}).queue(function() {
return $(".trigger").animate({height: "show", top: "110", left: "0"}, "slow");
});
});
http://jsfiddle.net/b9chris/wjpL31o0/
这是为什么它能够工作以及它的实现原理:
调用 $.globalQueue.queue()
会将你的标签动画函数推入队列,但是会将其推入到 body 标签的队列中。
当 jQuery 到达 body 队列中的你的标签动画函数时,标签动画就开始了,并且该动画队列(此例中为 body 的队列)会在自定义动画回调函数调用传入的 dequeue()
函数之前暂停。因此,尽管你的标签动画和 body 的动画队列是分开的,但是 body 标签的队列现在正在等待它的 dequeue()
被调用。http://api.jquery.com/queue/#queue-queueName-callback
我们只需要将标签队列中最后一个被推入的函数设为调用全局队列的 dequeue()
函数,这就是将队列连接起来的方式。
为了方便,globalQueue.queue
方法返回 this
引用,以便进行链式操作。
setInterval
为了完整起见,如果你只是想按时间间隔触发动画,而不是使独立的动画协调,那么可以像这样替换调用 setInterval
:
setInterval(doAthing, 8000);
使用这个:
$.setInterval = function (fn, interval) {
var body = $('body');
var queueInterval = function () {
body
.delay(interval)
.queue(function(dequeue) {
fn();
queueInterval();
dequeue();
});
};
queueInterval();
};
$.setInterval(doAthing, 8000);
这里是一个示例链接。
同时,避免浏览器重新启用背景标签动画时出现的尴尬的动画爆炸。