你排队的动画,但从来没有“屈服”的执行返回给浏览器,因为你立即再次调用该函数。
浏览器永远不会进入其事件循环,并且动画不会启动。
要解决这个问题,你需要使浏览器等到所有的动画已经完成,并然后再次排队它们:
$(function() {
(function animate() {
$('#page_effect').fadeIn(1500).delay(3500).fadeOut(1500);
$('#page_effect2').delay(7000).fadeIn(1500).delay(3500).fadeOut(1500);
$('#page_effect3').delay(13900).fadeIn(1500).delay(3500).fadeOut(1500);
$('#page_effect4').delay(21000).fadeIn(1500).delay(3500).fadeOut(1500);
// using deferred objects, ask for a promise that will be resolved
// when all animations on the specified elements have been completed,
// and when done, call myself to start all over again
$('#page_effect,#page_effect2,#page_effect3,#page_effect4')
.promise().done(animate);
})(); // invoke immediately
});
我注意到,你的四个独立的效果可能应该是以串联方式运行,但如果上面的.promise()
解决方案全部并行运行,它们也可以运行。
见http://jsfiddle.net/alnitak/ZKevs/
请注意,如果你打算运行在一系列的影响,你真的不应该只是排队起来一起 - 有没有时间保证,它可能是下一个元素会前的启动动画前一个完成。
传统的解决方案是在最后一个动画中添加一个“动画完整”回调,但是有四个单独的动画,这些动画最终会被嵌套在一起。
jQuery的递延对象可以帮助在这里,太 - 注意如何消除了额外的计算.delay()
电话:
$('#page_effect').fadeIn(1500).delay(3500).fadeOut(1500);
$('#page_effect').promise().done(function() {
$('#page_effect2').fadeIn(1500).delay(3500).fadeOut(1500);
});
$('#page_effect2').promise().done(function() {
$('#page_effect3').fadeIn(1500).delay(3500).fadeOut(1500);
});
$('#page_effect4').promise().done(function() {
$('#page_effect4').fadeIn(1500).delay(3500).fadeOut(1500);
});
$('#page_effect4').promise.done(animate);
此时你可以看到每一个动画链是相同的,可重构:
function cycle($els) {
var i = 0, n = $els.length;
(function next() {
var $this = $els.eq(i);
i = (i + 1) % n;
$this.fadeIn(1500).delay(3500).fadeOut(1500).promise().done(next);
})();
});
cycle($('#page_effect,#page_effect2,#page_effect3,#page_effect4'));
不能使用加载页面后的'document.write' ...会清除内容 – charlietfl