2013-02-16 89 views
4

我有一个包含多个div'banneritem'的'bannergroup'div。我希望这些项目旋转(淡入淡出)而不是彼此。如何在jQuery动画中连续旋转儿童?

我可以有几个div与班级bannergroup,每个人应该分开旋转。

下面是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个子项目。另外一个小组可能有不同数量的孩子,但他们都应该同步旋转。如果一个在另一个之前完成并且然后重新启动,那就没有问题。

回答

7

我已经回答了这个问题multipletimes之前。这次我会尝试将它包装在一个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(); 
}); 

See it here.

+0

真棒 - 完美工作!对不起,我找不到你以前的答案。谢谢! – jpsnow72 2013-02-16 16:36:57

+0

@ jpsnow72,没问题 – Alexander 2013-02-16 16:45:31

+0

@Alexander我看着你的代码的更多的例子,因为它达到了我的兴趣,因为它是聪明的,所以我可以收集一些好东西,但我确实有一个问题,你声明了一个匿名函数,然后是一个带有递归的命名函数。在.each之外命名递归函数会不会更有效率(但不是简单)? – 2013-02-16 17:45:31

0

您可以用两种方法解决这个问题。下面的是最简单的,使用索引来增加每个项目的延迟。

$('.banneritem').css('display', 'none'); 
$('.bannergroup').children('.banneritem').each(function(i) { 
    $(this).delay(4000 * i)).fadeIn().delay(4000 * (i+1)).fadeOut();    
}); 
+0

这变淡他们都在马上,然后通过一个淡出出来1。我尝试通过在淡入之前添加延迟(4000 *(i-1))来修改它,但是在淡入之前新的淡入淡出。4000延迟不考虑淡入/淡出时间。 – jpsnow72 2013-02-16 16:13:44

+0

已更新我的代码 – Niels 2013-02-16 16:21:57

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); 
}); 
+0

[我可以看到它的工作原理](http://jsfiddle.net/wHzkH/)。您可能需要更正您用来测试它的错误标记:) – Alexander 2013-02-16 17:57:36

+0

@ j08691是否可以通过单击链接来更改当前的标记?例如。我有一个导航,我想要4个按钮。这四个按钮显示我的4个banneritems。我点击按钮1,它显示banneritem 1.点击Button2,它显示banneritem 2。之后,它继续右边,继banneritem。 – ShawnWhite 2013-10-29 14:13:47

+0

@ShawnWhite - 对不起,但我不明白你在问什么。你能用一个例子来创建一个新的问题吗? – j08691 2013-10-29 14:18:43