2013-02-16 52 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