【问题标题】:fadeOut first div then fadeIn second div淡出第一个 div 然后淡入第二个 div
【发布时间】:2012-04-17 15:35:48
【问题描述】:

遇到一个问题,我需要做一些类似褪色横幅的操作 - 一个 div 淡出然后第二个 div 淡入,这里是代码:

$(document).ready(function() {
    setTimeout(function() {
        $('#zeus').fadeOut(1000);
     }, 5000);
    $('#zeuss').hide();
    setTimeout(function(){
        $('#zeuss').fadeIn(1000);
    }, 6000);
});

它可以工作,但在#zeuss 淡入之后,它就会停留在这里。我需要反复这样做。并且请不要提供使用 .delay() 因为我在 jquery 1.3.2 上

编辑。 默认情况下#zeus 显示在页面上,我想将其淡出然后淡入#zeuss,然后再次淡入#zeus,然后淡出#zeus 并淡入#zeuss 等等。

【问题讨论】:

  • 你试过setInterval()吗,setTimeout()只发生一次,interval会被重复调用
  • 不清楚您想要实现什么:1. 淡出 zeus,2. 淡入 zeusS,然后呢?等待... 5 秒?进而?淡出 zeusS,然后淡入 zeus,然后等待 5 秒并从头开始?
  • 你能举个例子吗?我没试过 setInterval()
  • @Heihachi 检查我的答案和DEMO,如果你想要的话,请告诉我。

标签: jquery settimeout fadein fadeout


【解决方案1】:

通常情况下,通用且可扩展的解决方案更简单:

更新:采纳 jfriend00 的建议,并从多个计时器转移到完成功能,以防止随着时间的推移累积错误。

/**
 * Fade-cycles elements with class 'banner'
 */
$(document).ready(function() {

    var delay = 3000, fade = 1000; // tweak-able
    var banners = $('.banner');
    var len = banners.length;
    var i = 0;

    setTimeout(cycle, delay); // <-- start

    function cycle() {
        $(banners[i%len]).fadeOut(fade, function() {
            $(banners[++i%len]).fadeIn(fade, function() { // mod ftw
                setTimeout(cycle, delay);
            });
        });
    }

});
  • DEMO 使用 jQuery 1.3.2

【讨论】:

  • 这是一个聪明的实现,但你认为间隔计时器和两个动画的总和会永远保持完美同步吗?由于我们知道在像 javascript 这样的非抢占式单线程系统中,计时器并不是 100% 准确的,而且这里有多个计时器,因此间隔计时器似乎不太可能与动画中涉及的计时器保持完全同步。从完成函数而不是从间隔开始下一个循环不是更安全,因此永远不会有一些累积错误吗?
  • @jfriend00 很好,虽然如果delay2*fade 大得多,我的直觉告诉我这不会有问题。已更新。
  • 是的,如果一个动画完成后在下一个动画开始之前有额外的时间,那么小的错误累积就不太可能被注意到(我想这取决于它运行多长时间和累积多长时间错误)。
  • 但是如果 OP 希望它在动画之间没有空闲时间连续运行,那么它很容易引起注意。使用在开始/结束时使用 display:blockdisplay: none 的淡入/淡出,因此可能会在开始/结束时更改页面的布局,如果两者都在页面中,即使两者之间的轻微重叠有时也会很明显同时隐藏或同时隐藏,即使只是在不打算这样做的情况下短暂隐藏。
  • 这正是我所需要的!感谢佩斯利和其他人!你救了我的爸爸!
【解决方案2】:

我认为您想在无限滚动中淡入和淡出 2 个不同的 div。试试下面的代码,让我知道,

DEMO

$(document).ready(function() {
    var isZeuss = false;
    var $zeus = $('#zeus');
    var $zeuss = $('#zeuss');

    $zeuss.hide();

    setTimeout(function () {//<-- Not sure if you want this 5 sec delay in starting the animation
       setInterval(function() {
         var $fadeOutBanner = (isZeuss)?$zeuss:$zeus;
         var $fadeInBanner = (isZeuss)?$zeus:$zeuss;

         $fadeOutBanner.fadeOut(1000, function () {
             $fadeInBanner.fadeIn(1000);
             isZeuss = !isZeuss;
         });
       }, 2000);
     }, 5000); //<-- Not sure if you want this         
});

编辑:您可以增加fadeIn/fadeOut 计时器或setInterval 计时器以减慢转换速度。

【讨论】:

  • 这不使用完成函数将所有动画链接到前一个动画的末尾。我也没有看到像 OP 那样有 5 秒的延迟。
  • @jfriend00 更新延迟 5 秒。但不是 2 秒间隔是骑自行车所需要的。例如:假设 zeus 是 z1,zeuss 是 z2。 z1 -> 在 1 秒内淡出,然后在 1 秒内 z2 淡入,然后 setInterval 与 z2 淡出,然后 z1 淡入一秒。
  • OP 所需的逻辑并不完全明显,但我认为他们希望在每个周期都可以看到 zeus 的 5 秒暂停。你只是第一次暂停。您的代码假定每个动画都是精确计时的,并且永远不会有任何变化,因此您的间隔可以每两秒运行一次,并假设两个一秒的动画完全按时完成。动画不是那么完美,间隔也不是那么完美。我认为在我的实现中将下一个动画的开始准确地链接到前一个动画的完成而没有错误是很重要的。
【解决方案3】:

这一个从一个可见的横幅开始,然后开始淡出、淡入、延迟等... http://jsfiddle.net/TtPFc/1/

#zeus { background-color: blue; color: white; display:none}
#zeuss { background-color: red; color: white; }


<div id="zeus">Zeus Banner</div>
<div id="zeuss">Zeuss Banner</div>
​

$(document).ready(function() {
    var zeus    =  $('#zeus'), 
        zeuss   =  $('#zeuss'),
        forward = true;

    setInterval(function() {
        if (forward) {
           zeus.fadeOut(1000, function() { zeuss.fadeIn(1000); });
        }
        else { 
           zeuss.fadeOut(1000, function() { zeus.fadeIn(1000); });
        }

        forward = !forward;

     }, 5000);
});​

【讨论】:

  • 这有点奇怪。您在某些情况下使用完成功能,但在其他情况下setInterval() 并且您不链接可以直接链接的两个动画zeuss.fadeIn(1000).fadeOut(1000)。您可以只使用所有完成功能而没有间隔。看起来你接受了 F. Caledarn 的回答并试图解决它。
【解决方案4】:

好的,不使用 .delay() 并将一个动画的开始链接到前一个动画的确切完成(不依赖于计时器和动画的同步)并使用此重复序列实现动画:

  • 宙斯可见,宙斯不可见
  • 暂停 5 秒
  • 淡出宙斯
  • 淡入宙斯
  • 淡出宙斯
  • 淡入宙斯
  • 重复

你可以这样做:

$(document).ready(function() {
    var z1 = $('#zeus');
    var z2 = $('#zeuss').hide();

    function cycle() {
        setTimeout(function() {
            z1.fadeOut(1000, function() {
                z2.fadeIn(1000).fadeOut(1000, function() {
                    z1.fadeIn(1000, cycle)
                });
            });
        }, 5000);
    }
    cycle();
});

如果您只希望在第一个周期之前暂停 5 秒,而不是在接下来的周期中(我在您的问题中并不完全清楚),它可以是这样的:

$(document).ready(function() {
    var z1 = $('#zeus');
    var z2 = $('#zeuss').hide();

    function cycle() {
        z1.fadeOut(1000, function() {
            z2.fadeIn(1000).fadeOut(1000, function() {
                z1.fadeIn(1000, cycle)
            });
        });
    }
    // start the fadeIn/fadeOut cycling after 5 seconds
    setTimeout(cycle, 5000);
});

仅供参考,名称zeuszeuss 的选择非常混乱。很容易让他们混淆,也很容易在代码中出错。

如果你有一个更现代的 jQuery 版本,可以使用.delay(),那么它会更简单一些:

$(document).ready(function() {
    var z1 = $('#zeus');
    var z2 = $('#zeuss').hide();

    function cycle() {
       z1.delay(5000).fadeOut(1000, function() {
           z2.fadeIn(1000).fadeOut(1000, function() {
               z1.fadeIn(1000, cycle)
           });
       });
    }
    cycle();
});

【讨论】:

  • 这是两个元素需要延迟循环而不使用.delay(),并且每个动画都应该链接到前一个的完成。随意发布不太复杂的代码。
  • 您能否查看我的帖子并告诉我这是否与您所拥有的不同(忽略计时器持续时间)。 stackoverflow.com/a/10194544/297641
  • @Vega - 我评论了你的。它缺少我的一些元素。
  • 为我添加了一个选项,它只在第一个动画之前暂停 5 秒,从那时起,它只是淡入淡出,在两个对象之间反复交替。
【解决方案5】:

如果你制作一个 zeusfadeIn 和 zeusfadeOut 怎么办? zeusfadeIn 淡入并调用 zeusfadeOut zeusfadeOut 淡出并调用 zeusfadeIn

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多