第一种方法: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();
});
这是第一种方法的小提琴。
第二种方法:承诺
如果你想在开始下一个动画时绝对保证两个动画都完成,你可以使用 jQuery 1.6 中的新 Promise。您可以调用$.promise()
两个 jQuery 对象来获得一个承诺,该承诺将在该元素的所有动画完成后得到解决。然后,您可以设置一个主 Promise,$.when(promises...)
当所有给定的 Promise 都被解决并设置一个then
处理程序时,该主 Promise 将被解决。
$(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,你可以制作更高级的过渡序列,同时保持同步。
这是这种方法的一个小提琴。