2010-09-01 97 views
17

比方说,我已经调用$ element.fadeIn(200)。 100毫秒后,在页面上发生了一些事情,我想中断这个淡入淡出,并立即fadeOut()。我怎样才能做到这一点?jQuery:中断fadeIn()/ fadeOut()

如果调用$ element.fadeIn(200).fadeOut(0),则fadeOut()只发生在fadeIn()完成后。

另外,有没有办法可以检查$元素来确定是否正在运行fadeIn()或fadeOut()? $ element是否有任何改变的.data()成员?

回答

2

AFAIK fadeInfadeOut同步运行,所以不,我不认为你可以打断他们,而他们正在运行。您必须等到执行完成。

如果您调用元素上的stop方法,它将停止所有动画。在您的示例中调用fadeOut的原因在fadeIn之后才会调用,因为动画是以类似队列的方式执行的。

1

您可以使用stop()函数中断在该特定时刻发生的任何动画。让我知道这个是否奏效。

1

它始终是一个很好的做法,以保持在函数的回调内处理动画等功能。你可以告诉我们,如果淡入()已通过其回调内做你的功能,如完成:

$element.fadeIn(200, function(){ 
    //do callback 
}); 

如果这是不可能的,那么你可以声明函数外部的变量。说,var elmFadeInRunning = false。在调用fadeIn之前将其更改为true,并在fadeIn的回调中将其更改为false。这样你可以知道它是否仍然运行,如果elmFadeInRunning == true。

31

stop()只会删除尚未执行的动画。

使用stop(true, true)来中断并删除当前动画!

+1

先生,你的建议就像一个魅力! 我已经重新提出了很多关于这个主题的问题,但是我从来没有发现任何关于stop()interrumping和删除当前动画的问题。 – 2012-02-12 10:54:28

+0

.finish()也可能工作。 – 2015-10-26 19:39:38

4

通过使用.stop(true,false)清除队列,但不会跳到最后,您将获得平滑的淡入/淡出效果,但请注意,由于FadeIn可以这种方式中断,FadeOut不能。我将它报告为几年前的错误,但没人关心。 FadeIn仅在对象被隐藏时才有效。但有解决办法...使用FadeTo代替 - 它可以在隐藏以及部分褪色的对象:

$('.a').hover(function(){ 
    $('.b').stop(true,false).fadeTo(3000,1); // <- fadeTo(), not FadeIn() (!!!) 
},function(){ 
    $('.b').stop(true,false).fadeOut(3000); 
}); 

下面是它如何工作的:http://jsfiddle.net/dJEmB/

+1

多年后解谜。谢谢哥们。 – 2017-07-05 11:07:16

0

另一实施

<div id="fadediv">Yay, I like to fade</div> 
<button id="stopdatfade" >Stop that fade!</button> 
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script> 
<script> 
(function($){ 

    currentfade = $("#fadediv").fadeOut(5000).fadeIn(5000).fadeOut(5000).fadeIn(5000); 
    $('#stopdatfade').on('click', function() { 
     if (typeof currentfade !== 'undefined') { 

      currentfade.stop(true, true); 

     } 

    }); 
})(jQuery); 
</script>