2012-03-06 102 views
0

我有一個jQuery函數slideUp和slideDown的小問題。jQuery slideDown和slideUp子菜單

jsBin Demo

我有它的下面垂直子垂直菜單。

當用戶進入一個具有子菜單的菜單項時,它必須顯示它,這是正在工作的部分。

當用戶離開菜單項並進入子菜單項時,它仍然需要可見。 這個問題,我試圖趕上setTimeout函數,將刪除(上拉)1500ms後的子菜單。如果用戶在此時將鼠標移動到子菜單,則setTimeout將被清除(clearTimeout)

但是,當用戶將鼠標移動到主菜單項上時,將顯示所有子菜單,並顯示來自原始頁面的內容將被推倒。

圖片:http://i43.tinypic.com/5ww8yq.png

這是當我提出我的鼠標速度非常快在所有主要的菜單項。

應該如何: 當用戶將鼠標移動到主菜單項時,必須顯示子菜單。當他移動到另一個主菜單項時,當前子菜單必須是不可見的,並且必須顯示另一個子菜單。

#menu 
{ 
     background-color: white; 
     width: 1000px; 
     margin-top: 10px; 
     height: 30px; 
     position: relative; 
} 
#menu ul li 
{ 
     float: left; 
     display: inline; 
     width: 125px; 
     height: 30px; 
     line-height: 30px; 
     text-align: center; 
} 
#menu ul li.right { float: right; } 
#menu ul li a 
{ 
     top: 5px !important; 
     text-decoration: none; 
     font-size: 20px; 
     height: 30px; 
     color: #01224D; 
} 
.submenu 
{ 

     background-color: #01224D; 
     width: 1000px; 
     height: 30px; 
     color: white; 
     display: none; 
} 
.submenu ul li 
{ 
     display: inline; 
     width: 100px; 
     height: 30px; 
     line-height: 30px; 
     float: left; 
     text-align: center; 
} 
.submenu ul li.right { float: right; } 
.submenu ul li a 
{ 
     text-decoration: none; 
     font-size: 20px; 
     height: 30px; 
     color: white; 
} 

HTML:

<div id="menu"> 
     <ul> 
       <li><a href="index.php">Home</a></li> 
       <li> 
         <a class="mainMenuA" id="menu-1" href="#">Lederwaren</a> 
       </li> 
       <li><a class="mainMenuA" id="menu-2" href="#">Tassen</a></li> 
       <li><a class="mainMenuA" id="menu-3" href="#">Koffers</a></li> 
       <li><a class="mainMenuA" id="menu-4" href="#">Kleding</a></li> 
       <li><a class="mainMenuA" id="menu-5" href="#">Accessoires</a></li> 
       <li class="right"><a href="vestigingen.php">Vestigingen</a></li> 
     </ul> 
</div><!-- menu--> 
<div class="submenu" id='submenu-1'> 
     <ul> 
       <li><a href="#">Submenu</a></li> 
     </ul> 
</div><!-- submenu --> 
<div class="submenu" id='submenu-2'> 
     <ul> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
     </ul> 
</div><!-- submenu --> 
<div class="submenu" id='submenu-3'> 
     <ul> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
     </ul> 
</div><!-- submenu --> 
<div class="submenu" id='submenu-4'> 
     <ul> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
     </ul> 
</div><!-- submenu --> 
<div class="submenu" id='submenu-5'> 
     <ul> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
       <li><a href="#">Submenu</a></li> 
     </ul> 
</div><!-- submenu --> 

JS:

$(document).ready(function(){ 
       var timer; 
       var hover; 
       $('.mainMenuA').hover(
        function() 
        { 
         var id = $(this).attr('id').split('-')[1]; 
         $('#submenu-'+id).slideDown(); 
        }, 
        function() 
        { 
         var id = $(this).attr('id').split('-')[1]; 
         timer = setTimeout(function() { $('#submenu-'+id).slideUp(); },1500); 
        } 
       ); 
       $('.submenu').hover(
        function() 
        { 
         clearTimeout(timer); 
        }, 
        function() 
        { 
         var id = $(this).attr('id'); 
         timer = setTimeout(function() { $('#'+id).slideUp(); },1500); 
        } 
       ); 
      }); 

我希望有人能幫助我。

回答

0

除了使用的定時器使用stop功能停止當前animtion

http://api.jquery.com/stop/

e.g的:如果需要的話,效果最好

$('.mainMenuA').hover(function(){ 
     var id = $(this).attr('id').split('-')[1]; 
     $('#submenu-'+id).stop().slideDown(); 
},function(){ 
     var id = $(this).attr('id').split('-')[1]; 
     $('#submenu-'+id).stop().slideUp(); 
}); 

使用stop參數。

0

您只需隱藏顯示的任何.submenu元素,然後再顯示新的元素。我嘗試了2種不同的方法 - 使用hide()和使用slideUp()。我個人比較喜歡的效果基本show()方法,在此的jsfiddle看到....

http://jsfiddle.net/DgqS4/

+0

這有我有同樣的問題,當你快速移動菜單項 – WannaKnow 2012-03-07 07:11:01

0

當你告訴一個子菜單,添加classsubmenu-open給它,這將被用來查找和隱藏如有必要。
代碼功能上懸停:

$('.submenu-open').stop().hide().removeClass('submenu-open'); 
var id = $(this).attr('id').split('-')[1]; 
$('#submenu-'+id).addClass('submenu-open').slideDown(); 

這應該很容易解決您的問題,在你的jsBin演示測試吧!

+0

通過這個例子,當我將鼠標移動到項目上時,它仍然顯示出我的所有子菜單 – WannaKnow 2012-03-07 07:38:52

+0

@WannaKnow我重新排序了函數鏈,現在它應該可以工作! – jb10210 2012-03-07 14:22:26

0

很好不知道你是否開放這個解決方案,但我建議你在HTML中做一些改變,因爲你是反正創建子菜單div,如果我理解你的問題,那麼你不想要移動的頁面內容,例如,您可以爲主菜單下面的子菜單提供特定的高度(在您的情況下應爲30px)。

這裏的解決方案,我建議,並希望這是對你有所幫助,

HTML:

<!DOCTYPE html> 
<html> 
<head> 
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<meta charset=utf-8 /> 
<title>DEMO</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
</head> 
<body> 



    <div id="menu"> 
      <ul> 
        <li><a href="index.php">Home</a></li> 
        <li class="mainMenuA"> 
          <a id="menu-1" href="#">Lederwaren</a> 
          <div class="submenu" id='submenu-1'> 
            <ul> 
              <li><a href="#">Submenu</a></li> 
            </ul> 
          </div><!-- submenu --> 
        </li> 
        <li class="mainMenuA"> 
         <a id="menu-2" href="#">Tassen</a> 
         <div class="submenu" id='submenu-2'> 
           <ul> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
           </ul> 
         </div><!-- submenu --> 
        </li> 
        <li class="mainMenuA"> 
         <a id="menu-3" href="#">Koffers</a> 
         <div class="submenu" id='submenu-3'> 
           <ul> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
           </ul> 
         </div><!-- submenu --> 
        </li> 
        <li class="mainMenuA"> 
         <a id="menu-4" href="#">Kleding</a> 
         <div class="submenu" id='submenu-4'> 
           <ul> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
           </ul> 
         </div><!-- submenu --> 
        </li> 
        <li class="mainMenuA"> 
         <a id="menu-5" href="#">Accessoires</a> 
         <div class="submenu" id='submenu-5'> 
           <ul> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
             <li><a href="#">Submenu</a></li> 
           </ul> 
         </div><!-- submenu --> 
        </li> 
        <li class="right"><a href="vestigingen.php">Vestigingen</a></li> 
      </ul> 
    </div><!-- menu--> 

</body> 
</html> 

CSS:

article, aside, figure, footer, header, hgroup, 
     menu, nav, section { display: block; } 
     #menu 
    { 
      background-color: white; 
      width: 1000px; 
      margin-top: 10px; 
      height: 30px; 
      position: relative; 
    } 
    #menu ul li 
    { 
      float: left; 
      display: inline; 
      width: 125px; 
      height: 30px; 
      line-height: 30px; 
      text-align: center; 
    } 
    #menu ul li.right { float: right; } 
    #menu ul li a 
    { 
      top: 5px !important; 
      text-decoration: none; 
      font-size: 20px; 
      height: 30px; 
      color: #01224D; 
    } 
    .submenu 
    { 

      background-color: #01224D; 
      width: 1000px; 
      /*height: 30px;*/ 
      color: white; 
      display: none; 
      position: absolute; 
      left: 0; 
    } 
    .submenu ul li 
    { 
      display: inline; 
      width: 100px; 
      /*height: 30px;*/ 
      line-height: 30px; 
      float: left; 
      text-align: center; 
    } 
    .submenu ul li.right { float: right; } 
    .submenu ul li a 
    { 
      text-decoration: none; 
      font-size: 20px; 
      /*height: 30px;*/ 
      color: white !important; 
    } 

JS:

$(document).ready(function(){ 
    var openSubMenu; 
    $('.mainMenuA').hover(function(){ 
      openSubMenu = $('.submenu', $(this)); 
      openSubMenu.css({height: '30px'}); 
      openSubMenu.stop().slideDown(); 

    },function(){ 
      openSubMenu.stop().slideUp(); 
    }); 
}); 

注意:我創建了su 'li'元素中的bmenu div,以便我們不必將懸停事件寫入子菜單div。我指定懸停事件與「禮」元素本身,我也賦予高度的子菜單前了slideDown,以避免在動畫

這裏的比賽條件的The工作示例http://jsbin.com/odegik/4/edit