Действия jQuery Mouseenter и mouseleave

Я использую следующий скрипт jQuery:

$("#divid").mouseenter(function() {
    $('#divid').show(1000);
}).mouseleave(function() {
    $('#divid').hide(1000);
});
$("#hldiv").mouseenter(function() {
    $('#divid').show(1000);
}).mouseleave(function() {
    $('#divid').hide(1000);   
});

Как вы можете видеть, когда курсор мыши находится над гиперссылкой #hldiv, #divid должно быть показано. Основная цель - сохранить DIV отображается, если мышь находится над DIV - но #divid не должен быть виден изначально.

Если мышь перемещается по гиперссылке, DIV должен появиться, и когда мышь перемещается DIV, он должен оставаться, пока мышь не уйдет.

Проблема в том, что с моим текущим кодом, когда пользователь перемещается по гиперссылке, а затем - DIV отображается / исчезает правильно, но когда пользователь выходит из гиперссылки и над DIV сам по себе DIV также исчезает.

Как мне это исправить?

3 ответа

Решение

Почему бы вам не добавить контейнер и не сделать:

<div id='container'>
<a ID="hlDiv">hlink</a>
<div ID="divId">Test Test Test</div>
</div>

$(document).ready(function() {
    $("#hlDiv").hover(function() {
        $('#divId').show(1000);
    })
        $('#container').mouseleave(function(){
            $('#divId').hide(1000);
        });
});

скрипка здесь: http://jsfiddle.net/w68YX/8/

Если я правильно понял, переписать

$("#divid").mouseenter(function() {
    $('#divid').stop(true);
    $('#divid').show(1000);
}).mouseleave(function() {
    $('#divid').hide(1000);
});

Может помочь, так как он останавливает текущую анимацию (исчезает) и возвращает ее обратно (если она уже стала немного прозрачной).

Однако это зависит от вашего HTML и может не сработать в вашем случае, поэтому, пожалуйста, опубликуйте также структуру.

Я очень опоздал на эту вечеринку - но есть гораздо лучший способ сделать это, поэтому я хочу добавить его для будущих браузеров. Вам не нужен jQuery для этого эффекта вообще.

Во-первых, оберните два элемента в контейнере (здесь я использую div с классом container), и примените класс к элементу, который вы хотите отобразить / скрыть на месте (здесь я использую show-on-hover класс на #divId элемент)

<div class="container">
  <a id="hlDiv" href="...">link text</a>
  <div class="show-on-hover" id="divId">popup stuff</div>
</div>

Затем настройте свой CSS следующим образом:

.container > .show-on-hover { display: none; }
.container:hover > .show-on-hover { display: block; }

#divId { /* whatever styles you want */ }

Эффект заключается в том, что теперь курсор полностью контролируется CSS - но у него нет перехода 1s, который у вас был изначально. Это немного сложнее (и в настоящее время не работает в IE - но будет поддерживаться начиная с IE10).

Просто измените CSS следующим образом:

.container { position: relative; }
.container > .show-on-hover { opacity: 0.0; position: absolute; }
.container:hover > .show-on-hover { opacity: 1.0; }

.show-on-hover {
    -webkit-transition: opacity 1s; /* Chrome / Safari */
    -moz-transition: opacity 1s;    /* Firefox */
    -o-transition: opacity 1s;      /* Opera */
}

Относительное расположение на .container означает, что контейнер устанавливает свои собственные ограничивающие рамки для своих дочерних элементов и их расположения. Это означает, что когда вы затем установите > .show-on-hover укладка в position: absolute;, он все еще будет ограничен своим родителем (если вы установите left: 0; Например, он переместится к левому краю .container, а не экран).

opacity Переключение теперь просто заставляет абсолютно позиционированный элемент показываться / исчезать везде, где вы его поместили (и вы бы обновили CSS, чтобы разместить его именно там, где вы хотите, относительно гиперссылки). Потому что мы больше не используем display: none - DIV всегда будет занимать место на экране - даже когда скрыто (что, вероятно, не то, что вы хотите).

И наконец - последний блок, который устанавливает переходы, сообщает современным браузерам, что при изменении непрозрачности элементов класса .show-on-hover, сделайте так, чтобы это произошло как анимация в течение 1 с.

Вот jsFiddle, показывающий переходы: http://jsfiddle.net/TroyAlford/nHrXK/2

И вот jsFiddle, показывающий только переключение: http://jsfiddle.net/TroyAlford/nHrXK/3/

Другие вопросы по тегам