我有一个带有'bannergroup'类的div,它包含多个div'banneritem'。我希望这些项目能够相互旋转(淡入淡出然后淡出)。
我可以使用类bannergroup有几个div,每个div应该单独旋转。
这是HTML:
<div class="bannergroup">
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
</div>
<div class="bannergroup">
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
<div class="banneritem">Only visible one at a time</div>
</div>
我的Jquery看起来像:
$('.banneritem').css('display', 'none');
$('.bannergroup').children('.banneritem').each(function( i ) {
$(this).fadeIn().delay(4000).fadeOut();
});
问题:每个语句在前一个div完成之前继续运行。我希望它等到上一个孩子不见了。此外,我需要这个继续运行。一次后它停止。我可以把它放到一个函数中,但我不知道怎么知道再次调用它。
编辑:并不总是有4个子项。另外一组可能具有与其他组不同的子组数,但它们应该同步旋转。如果一个在另一个之前完成然后只是重新启动它就没问题。
答案 0 :(得分:7)
我之前已回答过这个问题multiple times。这次我将尝试将其包装在jQuery插件中。 .rotate()
函数会将您想要的效果应用于匹配元素的子元素,即连续动画中每个子元素的淡入/淡出效果。
$.fn.rotate = function(){
return this.each(function() {
/* Cache element's children */
var $children = $(this).children();
/* Current element to display */
var position = -1;
/* IIFE */
!function loop() {
/* Get next element's position.
* Restarting from first children after the last one.
*/
position = (position + 1) % $children.length;
/* Fade element */
$children.eq(position).fadeIn(1000).delay(1000).fadeOut(1000, loop);
}();
});
};
用法:
$(function(){
$(".banneritem").hide();
$(".bannergroup").rotate();
});
答案 1 :(得分:1)
<强> jsFiddle example 强>
$('div.bannergroup').each(function () {
$('div.banneritem', this).not(':first').hide();
var thisDiv = this;
setInterval(function () {
var idx = $('div.banneritem', thisDiv).index($('div.banneritem', thisDiv).filter(':visible'));
$('div.banneritem:eq(' + idx + ')', thisDiv).fadeOut(function () {
idx++;
if (idx == ($('div.banneritem', thisDiv).length)) idx = 0;
$('div.banneritem', thisDiv).eq(idx).fadeIn();
});
}, 2000);
});
答案 2 :(得分:0)
您可以通过两种方式解决此问题。下面的一个是最简单的,使用索引来增加每个项目的延迟。
$('.banneritem').css('display', 'none');
$('.bannergroup').children('.banneritem').each(function( i ) {
$(this).delay(4000 * i)).fadeIn().delay(4000 * (i+1)).fadeOut();
});