あなたのコードの大きな問題は、他の答えのどれもまだそれについて話していなかったように見えるので、最後の行がslideshow()
それ自体を再帰的に呼び出すことであり、それはスタックオーバーフローにつながるでしょう。これを行わないでください:
function slideshow() {
// animate code
slideshow();
}
代わりに、繰り返し実行する場合は、 xミリ秒後にsetTimeout()
関数の別の実行をキューに入れるために使用します。
function slideshow() {
// animate code
setTimeout(slideshow, 3500);
}
あなたがそれを持っていたように、どの機能も実際に終了することはありません。を使用setTimeout()
すると、の各呼び出しslideshow()
が終了し、指定された遅延の後に個別の呼び出しが実行されます。現在のアニメーションが終了した後に次の呼び出しが発生するように、遅延を十分に大きくします。そうしないと、実行されるよりも速く、より多くのアニメーションをキューに入れることになります。
更新: jQueryは、要素ごとに個別のアニメーションキューを維持します。つまり、5つの要素のアニメーションが同時に実行されます。他の回答のいくつかは、アニメーションを一度に1つずつ順番に実行する方法をすでに提供していますが、これが私が行う方法です。
$(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/
- インライン属性の必要性を排除するためと、コードをグローバルスコープから除外するための便利な方法として、コードをロードハンドラーでラップしました(この方法で行う場合は、bodyタグから
onload=
削除することを忘れないでください)。 onload="slideShow()"
)。
- 追加
.show()
して.hide()
呼び出し(アニメーションキューに参加するように期間を指定して)、アニメーションのdisplay:none
間にimg要素が含まれるようにします。そうしないと、position:relative
スタイルでは最初の要素しか表示されないためです(ただし、に変更すると、アニメーションのposition:absolute
取得が妨げられます)親によってトリミングされますoverflow:hidden
)。
- 要素のアニメーションが終了すると、コールバックは
.hide()
増分i
して次の要素のインデックスを参照し(ただし、最後の要素を通過するタイミングをチェックします)、次にsetTimeout()
その次の要素のアニメーションをキューに入れるために使用します。