最初のアプローチ:setTimeout
別の関数でトランジションを次のスライドに移動し、で呼び出すことができsetTimeout
ます。次に、スライド番号を変数に格納し、各関数呼び出しの後にインクリメントします。
$(document).ready(function(){
var firstSlides = $("#first li"),
secondSlides = $("#second li"),
nbSlides = firstSlides.length,
slideTime = 500,
nextSlide = 0;
function slideshow() {
firstSlides.eq(nextSlide).fadeIn(400).fadeOut(100);
secondSlides.eq(nextSlide).fadeIn(400).fadeOut(100);
nextSlide = (nextSlide+1) % nbSlides;
setTimeout(slideshow, slideTime);
}
slideshow();
});
これがこの最初のアプローチのフィドルです。
2番目のアプローチ:約束
次のアニメーションを開始するときに両方のアニメーションが完了することを絶対に保証したい場合は、jQuery1.6の新しいpromiseを使用できます。両方のjQueryオブジェクトを呼び出し$.promise()
て、その要素のすべてのアニメーションが完了したときに解決されるpromiseを取得できます。$.when(promises...)
次に、指定されたすべてのPromiseが解決されたときに解決されるマスターPromiseを設定し、then
ハンドラーを設定できます。
$(document).ready(function(){
var firstSlides = $("#first li"),
secondSlides = $("#second li"),
nbSlides = firstSlides.length,
fadeInTime = 400,
fadeOutTime = 100,
nextSlide = 0;
function slideIn() {
var p1 = firstSlides.eq(nextSlide).fadeIn(400).promise();
var p2 = secondSlides.eq(nextSlide).fadeIn(400).promise();
$.when(p1, p2).then(slideOut);
}
function slideOut() {
var p1 = firstSlides.eq(nextSlide).fadeOut(100).promise();
var p2 = secondSlides.eq(nextSlide).fadeOut(100).promise();
nextSlide = (nextSlide+1) % nbSlides;
$.when(p1, p2).then(slideIn);
}
slideIn();
});
単純なスライドショーの場合、おそらくほとんど違いに気付かないでしょう。ただし、Promiseを使用すると、同期を維持しながら、ファンキーなタイミングではるかに高度な遷移シーケンスを作成できます。
これがそのアプローチのフィドルです。