您的代码的一个大问题是,因为其他答案似乎还没有谈到它,所以最后一行slideshow()
调用本身是递归的,这将导致堆栈溢出。不要这样做:
function slideshow() {
// animate code
slideshow();
}
相反,如果您希望它重复运行,请在x毫秒后将setTimeout()
函数的另一个执行排队:
function slideshow() {
// animate code
setTimeout(slideshow, 3500);
}
按照你的方式,没有一个功能真正完成。使用setTimeout()
,每次调用都会slideshow()
完成,然后在指定的延迟后运行一个单独的调用。我会让延迟足够大,以便在当前动画完成后发生下一次调用,否则你将排队越来越多的动画比它们运行的速度更快。
更新: jQuery 为每个元素维护单独的动画队列,这意味着您的五个元素上的动画将同时运行。其他一些答案已经提供了一次按顺序运行动画的方法,但这是我的做法:
$(window).on("load",function() {
// cache a jQuery object containing the elements to animate
// (note you don't need their ids if you use their class)
var $imgs = $('img.slideshow-image'),
i = 0;
function slideShow() {
// start animation for "current" img
$imgs.eq(i).show(1)
.animate({top: "50px",}, 500)
.delay(2000)
.animate({top: "400px",}, 500)
.hide(1, function() {
i = (i+1) % $imgs.length;
setTimeout(slideShow, 500);
});
}
slideShow();
});
工作演示:http: //jsfiddle.net/bARwb/
- 我已经将代码包装在负载处理程序中,以消除对内联
onload=
属性的需要,并作为将代码保持在全局范围之外的一种方便方法(如果您这样做,请不要忘记onload="slideShow()"
从您的 body 标签中删除)。
- 我已经添加
.show()
并.hide()
调用(有一个持续时间,以便它们加入动画队列),以便 img 元素将display:none
在动画之间,因为否则你的position:relative
风格除了第一个之外你什么都看不到(但更改为position:absolute
会阻止他们得到由他们的父母裁剪overflow:hidden
)。
- 当一个元素的动画完成时,回调从
.hide()
增量i
指向下一个元素的索引(但检查它何时超过最后一个元素),然后用于setTimeout()
为下一个元素排队动画。