【问题标题】:How to continuously rotate children in a jQuery animation?如何在 jQuery 动画中连续旋转孩子?
【发布时间】:2013-02-16 15:59:47
【问题描述】:

我有一个类为“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 个子项。此外,一组可能具有与其他组不同数量的孩子,但它们都应该同步旋转。如果一个在另一个之前完成然后自己重​​新启动就可以了。

【问题讨论】:

    标签: javascript jquery jquery-animate


    【解决方案1】:

    我之前回答过这个问题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.

    【讨论】:

    • 太棒了-完美运行!对不起,我找不到你以前的答案。谢谢!
    • @Alexander 我查看了您的代码的更多示例,因为它激发了我对它聪明的兴趣,因此我可以收集一些好的部分。不过,我确实有一个问题,您要声明一个匿名函数,然后是一个带有递归的命名函数。在 .each 之外命名递归函数不是更有效(但不是简洁)吗?
    • position 变量需要更大的范围。我相信你仍然需要两个函数,将命名函数移出 .each() 会增加这些变量的复杂性
    【解决方案2】:

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

    【讨论】:

    • I can see that it works。您可能想要更正您用来测试它的错误标记:)
    • @j08691 是否可以通过单击一个链接来更改当前的一个?例如。我有一个导航,我想在其中有 4 个按钮。这四个按钮显示我的 4 个横幅项目。我单击 Button 1 并显示banneritem 1。单击 Button2 并显示banneritem 2。之后它继续向右,跟随banneritem。
    • @ShawnWhite - 抱歉,我不明白你在问什么。你能用一个例子创建一个新问题吗?
    【解决方案3】:

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

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

    【讨论】:

    • 这会立即将它们全部淡入,然后将它们一一淡出。我尝试通过在淡入之前添加延迟(4000 *(i-1)来修改它,但是新的在另一个淡出之前淡入。4000延迟不考虑淡入/淡出时间。跨度>
    猜你喜欢
    • 2011-12-19
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多