2012-12-16 102 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