2012-12-16 71 views
-1

嗨,我有这个javascript函数,如果用户悬停在另一个div淡入div。当他们将鼠标悬停或离开时,div会退出。无限循环一个Javascript函数?

有谁知道我可以循环这个运行无限次,因为此刻它只做一次。

<script> 
$(".change-profile-pic").hide(); 
$('.img-with-border').hover(function() { 
    if ($('.change-profile-pic').is(":hidden")) { 
     $('.change-profile-pic').fadeTo(0, 500); 
    } else {  
     $('.change-profile-pic').fadeTo(500, 0);    
    } 
}); 
</script>  
+0

一旦用户将鼠标悬停在图像上,或者鼠标悬停在图像上,您希望它淡入淡出吗?或者你的意思是它只运行一次,当你希望它运行时*每次*鼠标悬停/拖出图像? –

+0

你说的第二件事。每当用户将鼠标移到其上并远离它时,我都希望它一次又一次地运行。 –

+0

@KevinReeves考虑CSS动画。 –

回答

1

如果你真的想使用jQuery(不CSS转换),然后用.hover.fadeIn.fadeOut和我对

的理解

我希望它再次运行并再次每次用户通过它从它

$(".change-profile-pic").hide(); 
$('.img-with-border').hover(
    function over() { // fade in on mouseover 
     $('.change-profile-pic').fadeIn(500); 
    }, 
    function out() { // fade out on mouseout 
     $('.change-profile-pic').fadeOut(500); 
    } 
); 

编辑将鼠标移动和离开没有淡出悬停时在.change-profile-pic

(function setUpHover() { 
    $(".change-profile-pic").hide(); 
    var timeout = null, 
        over = function over() { 
            window.clearTimeout(timeout); 
            $('.change-profile-pic').fadeIn(500); 
        }, 
        outAfterDelay = function outAfterDelay() { 
            $('.change-profile-pic').fadeOut(500); 
        }, 
        out = function out() { 
            timeout = window.setTimeout(outAfterDelay, 1000); // give enough time to move to elm here 
        }; 
         
    $('.img-with-border').hover(over, out); 
    $('.change-profile-pic').hover(over, out); 
}()); 

Example fiddle(根据jfriend00demo用JavaScript代替)

+0

对于脉动行为,请参阅jfriend00的答案。 –

+0

感谢这一点。我现在唯一的问题是,当你将鼠标悬停在它上面时,'change-profile = pic'div会淡出,因为它显然留下了'img-with-border'div。但我想'change-profile-pic'div的行为像一个按钮,在不使用时淡入和淡出,但在悬停或点击它时停留在那里? –

+0

对于这种行为,您必须在合理的时间内使用'window.setTimeout'延迟淡出。清除鼠标悬停时的超时时间,以便在鼠标悬停时不会调用'.fadeOut',并将相同的'.hover'功能应用于'。change-profile-pic' –

0

如果你想要的是该项目在输入/输出,只要一个鼠标悬停时,可以使用这样的代码脉冲:

<script> 
$(".change-profile-pic").css("opacity", 0); 
$('.img-with-border').hover(function() { 
    var self = $(this); 
    self.data("hovered", true); 

    function fadeInOut(obj) { 
     if (self.data("hovered")) { 
      obj.stop(true).fadeTo(500, 1, function() { 
       obj.fadeTo(500, 0, function() {fadeInOut(obj)}); 
      }); 
     } 
    } 
    $(".change-profile-pic").each(function() { fadeInOut($(this))}); 
}, function() { 
    $(this).data("hovered", false); 
}); 
</script> 

工作演示:http://jsfiddle.net/jfriend00/k54gh/

概念上,这保持了在.data()的悬停项目上标记该项目是否被当前悬停,并且它重复fadeTo 1不透明度,然后只要该项目保持悬停就一遍又一遍地重复fadeTo 0不透明度。它使用第一个淡入淡出的动画完成功能知道何时启动第二个淡入淡出和动画完成第二次启动重新开始循环。

+0

如果我这样做了,我会把所有的东西都放到一个函数作用域中,这样我就可以将悬停状态作为一个不是GC'd的变量来捕获,而不是设置'.data'。这个方法也可以。 –

+0

@PaulS。 - 我认为这种方法比较安全,因为可能有多个'.img-with-border'项目。 – jfriend00