2011-12-15 3 views
1

Это простое меню скрыть/показать: Когда вы наводите указатель на элемент списка, скрипт показывает любые неупорядоченные списки, которые являются дочерними элементами этого элемента списка, а затем отображает. CSS помещает этот под-список в непосредственное правое положение элемента списка. Когда вы наведите курсор мыши, он снова скрывает этот неупорядоченный список.jQuery hover() hide/show cause bounce

HTML-:

<div class="menu-header-category-menu-container"> 
    <ul id="menu-header-category-menu" class="menu"> 
    <li id="menu-item-58"><a href="?cat=3">Parent Category I</a> 
     <ul class="sub-menu"> 
     <li id="menu-item-59"><a href="?cat=6">Child Category I</a></li> 
     <li id="menu-item-60"> 
      <a href="?cat=7">Child Category II</a> 
      <ul class="sub-menu"> 
      <li id="menu-item-61"><a href="?cat=9">Grandchild Category I</a></li> 
      </ul> 
     </li> 
     </ul> 
    </li> 
    <li id="menu-item-62"><a href="?cat=4">Parent Category II</a></li> 
    <li id="menu-item-63"> 
     <a href="?cat=5">Parent Category III</a> 
     <ul class="sub-menu"> 
     <li id="menu-item-64"><a href="?cat=8">Child Category III</a></li> 
     </ul> 
    </li> 
    <li id="menu-item-57"><a href="?cat=1">Uncategorized</a></li> 
    </ul> 
</div> 

CSS-:

li { 
    width: 150px; 
    border: 1px solid black; 
    background-color: aqua; 
    list-style-type: none; 
    position: relative; 
} 

ul.sub-menu { 
    position: absolute; 
    left: 110px; 
    top: 0px; 
    display: none; 
} 

JavaScript:

$(document).ready(function() { 
    $('li').hover(
     function() { $(this).children('ul').show('slow'); }, 
     function() { $(this).children('ul').hide('slow'); } 
    ); 
}); 

Он работает в основном как это должно быть. За исключением случаев, когда вы перемещаете мышь из элемента списка и оставляете ее в пространстве, где должен появляться суб-список (перед тем, как подсвечник заканчивается), вы застряли в цикле show/hide/show/hide, пока вы не переместите указатель мыши.

Я попытался исправить это, используя setTimeout() как в функции аргумента mouseover, так и в функции аргумента mouseout. Я также пытался использовать условия, чтобы проверить, скрыт ли подсписчик в этих аргументах. Я не вижу разницы в производительности.

Любой

+0

Попробуйте привязки обработчика к курсора, находящегося якоря вместо элемента списка. У меня такое чувство, что он прояснится. – lsuarez

+0

Я вижу логику в этом (так как li содержит подменю), но это не приведет к исчезновению подменю при выводе мыши из якоря (что вы сделали бы, если бы вам нужно было щелкнуть что-то в подменю) –

+0

Derp. Посмотрел, прежде чем я прыгнул, так что это не решение, но у меня такое чувство, что это источник проблемы. Кажется, что указатель мыши на элементе списка должен скрывать любые видимые подменю на текущем уровне, а затем показывать свои собственные, с помощью мыши на верхнем уровне ul, чтобы скрыть любые видимые подменю. – lsuarez

ответ

1

Это является общей проблемой, проверьте Hover Intent

+0

это интересно. Я использовал Hover Intent, и это сложнее случайно вызвать ошибку, но если я намереваюсь это сделать, я могу заставить ее произойти. Интересно, с кем мне будет жить. –

+0

Я работал немного больше, и использование аргумента тайм-аута сделало почти невозможным дублирование. Я почти уверен, что меня это больше не волнует. Ура! –

0

Я думаю, что это улавливает ваше мероприятие MouseOut перед показом подменю. Попытайтесь быстро изменить скорость показа/скрытия. Но это не решение.

+0

Да, несчастная вещь об этом - проблема внешнего вида. –

0

Этот код будет также избежать многократного подпрыгивая

var myVar; 
$(".liveUser").on({ 
     mouseenter: function() { 
     myVar = setTimeout(function(){ //optional delay 
      //$(".userDetail").stop().hide().fadeIn(); 
       $(".userDetail").stop().hide().show(); 
       }, 400); 
     }, 
     mouseleave: function() { 
      clearTimeout(myVar); 
      //$(".userDetail").stop().fadeOut(); 
      $(".userDetail").stop().hide(); 
     } 
    }); 
Смежные вопросы