2015-01-29 3 views
1

В настоящее время я работаю над меню с раскрывающимся меню. Выпадающее меню отображается с помощью JQuery UI «s "Show ('слайд', ...)" функцию MouseEnter и скользит назад, используя его«скрыть '(слайд', ...) функции.hide() не работает сразу после шоу()

Следующая фрагмент кода я поставил вместе, чтобы продемонстрировать мою проблему, которая возникает, когда очень быстро перемещая курсор на Текст элемента.

Я попытался с помощью .stop (правда, правда) и .dequeue(), но не Успех У меня возникло чувство, что проблема заключается в вызове $ (this) .children(). Обратите внимание, что мое использование классов и детей является преднамеренным, поскольку в этом случае оно необязательно, но оно необходимо в моем проекте. С стрелкой $ (< #myElement>) звоните, кажется, работает.

Я благодарен за конструктивную обратную связь по этому вопросу. Я провел весь день googleing/trial и ошибки/устранение неполадок.

$(".element").mouseenter(function(){ 
 
     $(this).children(".toggleme").show("slide", {direction: "left"}, 100); 
 
    }).mouseleave(function(){ 
 
     $(this).children(".toggleme").hide("slide", {direction: "left"}, 100); 
 
    }); 
 
<div class="element"> 
 
    <span> TEST </span> 
 
    <div class="toggleme" style="width:100px; height:100px; background-color: red; display: none;"> 
 
     I appear and vanish! 
 
    </div> 
 
</div> 
 

 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>

+2

Возможно, мне что-то не хватает, поэтому простите меня, если я есть. Какова ваша проблема? Вы не хотите, чтобы блок исчез, когда мышь ушла? – RhapX

+0

Можно также отметить, что в то время как этот эффект работает, очень легко отключиться и открыть меню «застрять». Я бы предложил использовать CSS-переходы для таких меню, вам действительно не нужен javascript для этого. В зависимости от того, сколько объектов или меню на экране, этот подход может стать беспорядочным. – eyegropram

+0

@RhapX: Да, блок должен просто исчезнуть, когда мышь уйдет. Обратите внимание, что это упрощенная версия моего проекта. Что приводит меня к –

ответ

0

Вы бы лучше делать что-то вроде этого:

// handle the mouse entering 
jQuery(document).on('mouseover', ".element", function() { 
    $(this).children(".toggleme").show("slide", {direction: "left"}, 100); 
}); 
// handle the mouse leaving 
jQuery(document).on('mouseout', ".element", function() { 
    $(this).children(".toggleme").hide("slide", {direction: "left"}, 100); 
}); 

Вместо цепочки как вы сделали.


Ссылки

В качестве альтернативы, вы можете также использовать jQUery.mouseleave() но выше, должны делать, как вам требуется.

+0

@loanburger Я вижу, спасибо за скрипку, добавит сейчас! – Darren

+0

Мне кажется, что эта делегация - правильный подход для поддержания плавной анимации. – EternalHour

0

Предполагая, что проблема заключается в том, что красный цвет не скрывается на руке, оберните внутри $ (document) .ready();

$(document).ready(function() { 
     $(".element").mouseenter(function(){ 
     $(this).children(".toggleme").show("slide", {direction: "left"}, 100); 
     }).mouseleave(function(){ 
     $(this).children(".toggleme").hide("slide", {direction: "left"}, 100); 
     }); 
    }); 

Кроме того, необходимо импортировать JQuery UI

http://plnkr.co/edit/qC1dWlTG7pu1QR4fW8h0?p=preview

+0

^Вы не импортируете пользовательский интерфейс jQuery. – ryanlutgen

+0

Ах, да. хороший человек –

0

Обычно я рекомендовал бы метод slideToggle здесь. Но так как вы хотите анимацию слева, кажется, что animate подходит для счета.

$(".element").mouseenter(function(){ 
    $(this).children(".toggleme").animate({width: 'toggle'}); 
    }).mouseleave(function(){ 
     $(this).children(".toggleme").animate({width: 'toggle'}); 
}); 

Адрес Fiddle.

+0

Пока это работает, и я знаю, что с помощью «анимации» функция «стоп» также работает, это не говорит мне, почему мой подход не увенчался успехом. –

+0

Также, используя функцию анимации, как я могу достичь слайда «справа налево» в анимации? –

0

Это то, что вы пытаетесь достичь?

$(".element").children("span").mouseenter(function(){ 
 
     $(this).siblings(".toggleme").show("slide", {direction: "left"}, 100); 
 
    }); 
 
    $(".element").children("div").mouseleave(function(){ 
 
     $(this).hide("slide", {direction: "left"}, 100); 
 
    }); 
 
<div class="element"> 
 
    <span> TEST </span> 
 
    <div class="toggleme" style="width:100px; height:100px; background-color: red; display: none;"> 
 
     I appear and vanish! 
 
    </div> 
 
</div> 
 

 
<script src="http://code.jquery.com/jquery-latest.js"></script> 
 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>

+0

Это работает и ведет себя по желанию, но вы изменили html таким образом, который я не могу сделать в своем проекте. Теперь в вашем jQuery измените функцию mouseleave на «$ («. Element »). Mouseleave ...» и в своем теле выполните «$ (this) .siblings ('. Togglename') ...». Теперь функция mouseenter работает аналогично функции mouseleave -> только с исходной проблемой. И почему мой вопрос? –

+0

См. Редактирование без изменений в HTML. Вы работаете над зависанием, основанным на элементе div. Вам нужно настроить таргетинг на span внутри div элемента. Если вы нацеливаете «элемент» div для вашего наведения, он не будет скрываться и показывать, как вы ожидаете, потому что «элемент» div является большей площадью. Я не уверен на 100%, если я полностью понимаю, хотя, возможно, я ухожу! – garethb

0

$(".element").mouseenter(function(){ 
 
     $(this).children(".toggleme").show("slide", {direction: "left"}, 100); 
 
    }).mouseleave(function(){ 
 
     $(this).children(".toggleme").hide("slide", {direction: "left"}, 100); 
 
    });
.element {display: inline-block;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="element"> 
 
    <span> TEST </span> 
 
    <div class="toggleme" style="width:100px; height:100px; background-color: red; display: none;"> 
 
     I appear and vanish! 
 
    </div> 
 
</div> 
 

 
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.4/jquery-ui.min.js"></script>

Это работает, как ожидалось, поскольку .element представляет собой блок-элемент, так что она занимает 100% ширины страницы. Даже если вы думаете, вы больше не висите элемент, вы все еще на нем своим курсором. Решение состоит в том, чтобы установить .element на display: inline-block;.

Смежные вопросы