2012-11-20 58 views
0

HTML代碼:按鈕藏匿不正常

<div id="slick-slidetoggle">wxyz</div>   
<div id="slickbox" >abcd</div>​ 

的JavaScript:

var hoverVariable=false; 
var hoverVariable2=false; 

$('#slickbox').hide(); 
$('#slick-slidetoggle').mouseover(function() { 
    hoverVariable2=true; 
    $('#slickbox').slideToggle(600); 
    return false; 
}) 
$('#slick-slidetoggle').mouseleave(function() { 
    hoverVariable2=false; 
    setTimeout(function(){ 
    if(!hoverVariable && !hoverVariable2){ 
    $('#slickbox').slideToggle(600); 
    return false;} 
    }, 1000); 
}) 
$('#slickbox').mouseleave(function() {      
    hoverVariable=false; 
    setTimeout(function(){ 
    if(!hoverVariable && !hoverVariable2){      
    $('#slickbox').slideToggle(600); 
    return false;} 
    return false; 
    }, 1000); 
}) 
$('#slickbox').mouseover(function() { 
     hoverVariable2=false; 

    hoverVariable=true; 

})​ 

CSS代碼:

#slickbox { 
    background: black; 
    width:100px; 
    height: 135px; 
    display: none; 
    cursor:pointer; 
    color:white; 
} 
#slick-slidetoggle{ 
background: yellow; 
    width:100px; 
    height: 135px; 
    cursor:pointer; 
    color:black; 

} 
​ 

現在所期望的行爲是當鼠標在黃格幻燈片(「wxyz」)黑色div(「abcd」)應該滑落,如果鼠標移出黃色而不移動到黑色div,黑色div sho兩秒後隱藏。

發生這種情況。如果在移出黃色div後立即將鼠標移到黑色div上,只要鼠標位於黑色div上,黑色div就不應該隱藏。這也正在發生。

接下來的步驟有點難以解釋,但我會嘗試,當鼠標移動到黃色div和黑色div出來然後鼠標移動到黑色div和兩秒鐘之內,如果它移出它(黑色div)那麼整個動畫就會失靈。它的行爲是相反的。但是,如果鼠標在黑色div上保持兩秒鐘以上,然後將其移出,那麼整個腳本運行良好。

這是解釋更好的鏈接。 http://jsfiddle.net/HAQyK/381/

回答

1

嘗試用適當的效果基本show(),並更換了slideDown的slideToggle()()調用。 http://jsfiddle.net/tppiotrowski/HAQyK/386/

var hoverVariable = false; 
var hoverVariable2 = false; 

$('#slickbox').hide(); 
$('#slick-slidetoggle').mouseover(function() { 
    hoverVariable2 = true; 
    $('#slickbox').slideDown(600); 
    return false; 
}) 
$('#slick-slidetoggle').mouseleave(function() { 
    hoverVariable2 = false; 
    setTimeout(function() { 
     if (!hoverVariable && !hoverVariable2) { 
      $('#slickbox').slideUp(600); 
      return false; 
     } 
    }, 1000); 
}) 
$('#slickbox').mouseleave(function() { 
    hoverVariable = false; 
    setTimeout(function() { 
     if (!hoverVariable && !hoverVariable2) { 
      $('#slickbox').slideUp(600); 
      return false; 
     } 
     return false; 
    }, 1000); 
}) 
$('#slickbox').mouseover(function() { 
    hoverVariable2 = false; 
    hoverVariable = true; 
})​ 
+0

感謝這個解決方案超級棒。 –

1

您的問題似乎是由於您的重複超時功能,快速連續發射兩次的slideToggle。處理超時或間隔最徹底的方法是將它們存儲在一個變量來給你刪除它們控制在不需要的時候:

// Defined in global scope 
var timer; 

$('#slick-slidetoggle').mouseleave(function() { 
    hoverVariable2=false; 
    // Timer set as function 
    timer = setTimeout(function(){ 
    if(!hoverVariable && !hoverVariable2){ 
     $('#slickbox').slideToggle(600); 
     // Timer no longer need and so cleared 
     clearTimeout(timer); 
    return false;} 
}, 1000); 
}); 

編輯:忽視添加效果基本show /了slideDown,而不是切換爲根據上面的正確答案。請參閱更新的jsFiddle,它現在是正確的:http://jsfiddle.net/HAQyK/390/

另一種可以接近腳本的方法是使用jQuerys延遲功能和stop();動畫方法。包裝的div一個容器中,你得到的代碼更簡單的塊:

$('#slick-container').mouseenter(function() { 
    $('#slickbox').stop().slideDown(600); 
}).mouseleave(function(){   
    $('#slickbox').stop().delay(1000).slideUp(600); 
}); 

看看這裏:http://jsfiddle.net/HAQyK/387/

+0

非常感謝您的幫助。我很感激。 –

+0

根據所需的行爲,您的代碼完美無缺,但有一個疑問,當鼠標離開黃色div並進入黑色div並立即留下黑色div時,兩個函數的mouseleave都會被調用,並且在兩個函數中if( !hoverVariable1 &&!hovervariable2)條件滿足,並且它會調用slidetoggle()。但仍然在你的代碼中它只能執行一次。不明白如何。當我直接從黑色重新進入黃色時,這是一個小毛病。 Thot我應該通知。 –

+0

如果您將鼠標懸停在黑色方塊上並重新進入黃色方塊,則黑色方塊會向上滑動。 – Bruno

1

我重新編碼了一個解決方案。結帳小提琴here

 var hideB; 
     var $black = $('#slickbox'); 
     var $yellow = $('#slick-slidetoggle'); 

     function showBlack() { 
      if(hideB) window.clearTimeout(hideB); 
      $black.stop(true, true); 
      $black.slideDown(600); 
     } 

     function hideBlack() { 
      hideB = setTimeout(function() { 
       $black.stop(true, true); 
       $black.slideUp(600); } 
       , 1000); 
     } 

     $black.hide(); 

     $yellow.mouseenter(function() { 
      showBlack(); 
     }) 

     $yellow.mouseleave(function() { 
      hideBlack(); 
     }); 

     $black.mouseleave(function() { 
      hideBlack(); 
     }); 

     $black.mouseenter(function() { 
      showBlack(); 
     }); 
+0

非常感謝您的幫助。我很感激。 –

+1

@kapilchhattani不客氣。我的解決方案處理動畫時發生的元素懸停。你可能想看看jQuery stop()方法。如果你快速地進出黃色廣場,你會明白我的意思:) – Bruno

+0

哦,是的,它確實如此。對於長菜單,這可能會派上用場。謝謝你讓我知道。 –