【问题标题】:jQuery function callbacks and animation timingjQuery 函数回调和动画计时
【发布时间】:2010-08-05 22:57:03
【问题描述】:

我想让一个 DIV 在淡出另一个 DIV 后淡入。因为一个 DIV 在另一个 DIV 内部,所以在子 DIV 淡入之前,我需要父 DIV 完全淡出(清除可能显示的任何其他内容)。我尝试在下面的代码中使用 jQuery 回调函数为 no有用。

$('#viewer a').click(function(e) {
    e.preventDefault();
    $('#content > *').fadeOut(500, function(){
        $('#kiosk').fadeIn(250);
    });
});

DIV 是跳跃的,很明显脚本没有等待动画完成,然后开始淡入另一个 DIV。这是为什么呢?

注意事项:我知道我可能会链接一个 .delay() 或类似的东西,但我宁愿在回调函数就是为了这个目的!

【问题讨论】:

    标签: jquery callback delay


    【解决方案1】:

    我猜这部分不稳定是因为您正在褪色的元素,而这些元素的祖先目前正在褪色。

    当你淡化某些东西时,它也会自动淡化它的后代,所以你应该这样做。

    $('#content').children().fadeOut(500, function(){
        $('#kiosk').fadeIn(250);
    });
    

    现在请记住,带有.fadeIn() 的回调将为淡出的每个 元素调用一次。这也可能是一个问题。

    由于(大概)#kiosk#content 的直系后代,您可以直接将fadeIn() 链接到末尾。不需要.delay()

    试试看:http://jsfiddle.net/rrM28/

    $('#content').children().fadeOut(500).filter('#kiosk').fadeIn(250);
    

    编辑:从您在评论中更新的示例中,fadeIn() 立即运行,因为 #kiosk 最初是隐藏的,因此该动画立即完成,并且链继续.

    一种解决方案是将.fadeIn() 放置在动画.queue() 中,这样它只会在fadeOut() 完成后运行。

    试试看:http://jsfiddle.net/rrM28/4

    $('#viewer a').click(function(e) {
        e.preventDefault();
               // Don't fadeOut the #kiosk
        $('#content').children(':not(#kiosk)').fadeOut(500)
               // Place the fadeIn of #kiosk in the next step of the animation queue
            .queue(function() {
                $(this).siblings('#kiosk').fadeIn(250).dequeue();
            });
    });
    

    【讨论】:

    • @Patrick,感谢您的回答和代码。我更新了你的小提琴,在#kiosk DIV 中包含一个选择器,它在加载后淡入(在我的网站上,一个大的img,在这个代码中,一个跨度)。在之前的内容完全淡出之前,我仍然看到正在加载的内容,让我知道您的想法:jsfiddle.net/rrM28/3
    • @BenjiBee - 我明白了。问题是因为#kiosk 最初是隐藏的,它必须看到动画(对于那个元素)是立即完成的,所以它继续链接.filter().fadeIn()。隐藏和淡化嵌套的 <span> 对您没有帮助。我试图找出最简单的解决方案。我希望能在几分钟内发布一些内容。
    • @Patrick - 感谢您的回复,感谢您的解释和代码。我认为对于这个项目和我的其他项目,阅读 .queue() 会很有帮助,但我不确定它是否正是我想要的。我想我真的对回调函数的想法很感兴趣。据我所知,进行回调的方法应该在回调执行之前完全执行。所以,正如我所看到的,如果你有一个 .fadeIn(500) 在回调之前应该有 500 毫秒的淡入执行,我不明白它是如何重叠的!
    • @BenjiBee - 请记住,当您调用 $('#content').children().fadeOut... 时,您会在 几个 元素上调用 fadeOut()。如果其中一个元素(在本例中为 #kiosk)已经“淡出”,那么我猜 jQuery 认为 fadeOut() 对于那个元素来说是完整的,并且即使其他元素仍在淡出,也会触发回调。这是另一个应该可以工作的版本。 jsfiddle.net/rrM28/5 类似于使用queue() 的那个。它从fadeOut() 中排除#kiosk,然后进行回调。现在回调起作用了,因为 #kiosk 没有提前结束。
    • ...不过,请记住一件事。由于新示例中的回调为 each 元素触发一次,因此您可能会看到一些意外行为,因为 fadeIn() 被触发了多次。如果发生这种情况,您可能需要设置一个标志,以便 fadeIn() 只触发一次。想象一个名为fadeInCalled 的变量设置为false。当回调运行时,它会检查该标志。如果是false,它会执行fadeIn() 并将标志设置为true,以便后续运行回调时,不会触发fadeIn()。除非这是一个问题,否则不要担心。
    猜你喜欢
    • 2013-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多