Наведение и переключение в jQuery

У меня есть два div: красный над синим. Я хочу, чтобы когда пользователь наводит курсор на красный цвет, это fadeOut, а при наведении на фон (когда он выходит из синего) красный цвет исчезает. (Что меня больше удивляет, так это то, что красный цвет исчезает не при наведении курсора на фон, а при выходе из него мышью? Я не понимаю)

Пример здесь жизнь: http://jsfiddle.net/DpD8S/

HTML:

<div id="background">
    <div id="red"></div>
    <div id="blue"></div>
</div>​

CSS:

#red{
    position:absolute;
    top: 20px;
    left: 20px;
    width: 60px;
    height: 30px;
    background-color:red;
    cursor: pointer;
    z-index: 1; 
    }

#blue{
    position:absolute;
    top: 20px;
    left: 20px;
    width: 60px;
    height: 30px;
    background-color:blue;
    cursor: pointer; 
    }

#background{
    position: relative;
    margin: 0 auto;
    width:300px;
    height: 300px;
    border: 1px solid;
    border-color:#CCC;
    text-align: center;
    cursor: pointer;  }

JЗАПРОС:

$(function(){      
    $("#red").hover(function() {
        $("#red").fadeOut();
    });

    $("#background").hover(function() {
        $("#red").fadeIn("normal");
    });   
})​

person Nrc    schedule 18.12.2012    source источник
comment
Если я правильно понимаю, jsfiddle работает именно так, как вы описали   -  person dualed    schedule 18.12.2012
comment
Я хочу, чтобы при наведении курсора на красный цвет исчезал, а при наведении на фон красный исчезал. Теперь, когда я наводил курсор на фон, красный цвет НЕ исчезал. Я не понимаю, почему?   -  person Nrc    schedule 18.12.2012


Ответы (5)


Сделайте прозрачную стабильную зону, которая будет ловить ваше мероприятие.

<div id="background">
    <div id="blue"></div>
    <div id="red"></div>
    <div id="transparent"></div>
</div>​

CSS:

#red{
    position:absolute;
    top: 20px;
    left: 20px;
    width: 60px;
    height: 30px;
    background-color:red;
    cursor: pointer;
    z-index: 1; 
    }

#blue{
    position:absolute;
    top: 20px;
    left: 20px;
    width: 60px;
    height: 30px;
    background-color:blue;
    cursor: pointer; 
    }

#transparent {
    position:absolute;
    top: 20px;
    left: 20px;
    width: 60px;
    height: 30px;
    background-color:none;
    cursor: pointer; 
    z-index: 2; 
    }

#background{
    position: relative;
    margin: 0 auto;
    width:300px;
    height: 300px;
    border: 1px solid;
    border-color:#CCC;
    text-align: center;
    cursor: pointer; 
}
​

Затем используйте наведение (функция (), функция ()). Не забудьте остановить там выполнение событийных функций:

$(function(){      
    $("#transparent").hover(function() {
        $("#red").stop().fadeOut();
    }, function() {
       $("#red").fadeIn("normal");
    });

})​

http://jsfiddle.net/DpD8S/14/

person user666    schedule 18.12.2012
comment
Эту проблему можно решить, не добавляя бесполезные элементы в файл DOM. - person Rémi Breton; 18.12.2012
comment
Это умное решение, и оно работает на скрипке. Так как это очень упрощенный пример гораздо более сложной проблемы, с которой я столкнулся с большим количеством div. Я не уверен, что смогу применить его там. Во всяком случае, это дает мне новую линию возможностей. Спасибо!! - person Nrc; 18.12.2012
comment
Это мой любимый вариант, потому что он работает в любой ситуации, не имеет значения, имеют ли элементы div одинаковый размер или положение. Я также пробовал вариант с mouseenter и mouseleave: jsfiddle.net/DpD8S/22 - person Nrc; 19.12.2012

Ваша проблема, вероятно, заключается в определении hover.

hover( handlerIn(eventObject) , handlerOut(eventObject)  )
hover( handlerInOut(eventObject)  )

Это означает, что когда вы передаете только одну функцию, она вызывается для mouseenter, а также mouseleave. Вы должны либо использовать эти события, либо передать две функции в hover

Кроме того, это в значительной степени «назад». Скрыть что-то при входе всегда будет проблемой. Вот почему я теперь переименовываю ваши div. Вы должны показывать #active при вводе #inactive и скрывать #active при выходе из #active.

Вот скрипт http://jsfiddle.net/MwQaf/1/

person dualed    schedule 18.12.2012
comment
@Nrc это потому, что когда вы скрываете красный, вы вводите синий. Если вы прикрепите этот второй обработчик к mouseenter обработчику #background, он должен работать - person dualed; 18.12.2012
comment
Вы имеете в виду это?: jsfiddle.net/DpD8S/13 Вы можете попробовать прямо в Fiddle. я думаю, что это не работает - person Nrc; 18.12.2012
comment
@Nrc Я был немного поспешным. Я обновил свой ответ, используйте это. ;) - person dualed; 18.12.2012
comment
@Nrc просто любопытно, почему вы отклоняете этот ответ, скрипка не работает в вашей системе? - person dualed; 18.12.2012
comment
Возможно, это похоже, но менее сложно: jsfiddle.net/DpD8S/21 В любом случае ваш вариант работает и хорошо. Спасибо. - person Nrc; 19.12.2012
comment
@Nrc Скрипка, которую вы связали, как я уже сказал в своем ответе, задом наперед. Когда-нибудь это обязательно вызовет у вас головную боль, если не уже (попробуйте быстро навести указатель мыши на элемент, иногда он застревает в синем цвете). Я попытался объяснить вам, что вы на самом деле сделали неправильно, может быть, поэтому это выглядит более сложным, но это всего лишь два очень крошечных обработчика событий на двух элементах, я не понимаю, почему это сложно . Принятый ответ, конечно, хорош, хотя для этого требуется больше кода CSS и HTML. - person dualed; 19.12.2012

Возможно, вы бы предпочли изменить: $("#background").hover(...) на $("#blue").mouseleave(...)

http://jsfiddle.net/DpD8S/18/

person IsisCode    schedule 18.12.2012
comment
То, что вы говорите, является очень хорошим решением. Но будьте осторожны, ваша скрипка не работает. Я думаю, вы имеете в виду это?: jsfiddle.net/DpD8S/18 - person Nrc; 18.12.2012
comment
Это очень хорошее решение, потому что оно понятное и простое. Но я думаю, что это сработает только в том случае, если 2 div имеют одинаковый размер и положение. - person Nrc; 19.12.2012

#background div оборачивает два других. Ваша функция $('#background').hover() вызывается всякий раз, когда событие hover происходит в #background, даже в его дочерних элементах.

Я считаю, что вы можете достичь желаемого, сделав следующее:

$("#red").mouseenter(function() {
    $(this).fadeOut();
});

$("#red, #blue").mouseleave(function() {
    $("#red").fadeIn("normal");
}); 

Это, однако, приводит к странному поведению, поскольку две анимации «затухания» ставятся в очередь. Если пользователь быстро входит и выходит, div кажется невосприимчивым и анимируется странным образом.

Если установка плагинов возможна, вы можете попробовать этот плагин для анимации цветов. . Это позволит вам даже уменьшить количество элементов до самого div. Вы также сможете сократить использование CSS и использовать более чистый JavaScript. Проверьте скрипт.

person Rémi Breton    schedule 18.12.2012
comment
То, что вы говорите, имеет смысл, но ваш пример делает какое-то странное движение на мышином листе. Я попытался добавить event.stopPropagation(), но это тоже не работает: jsfiddle.net/DpD8S/16 - person Nrc; 18.12.2012
comment
Я только что подумал об этом; есть ли причина, по которой CSS3 нельзя использовать в вашей ситуации? - person Rémi Breton; 18.12.2012
comment
Странное поведение вызвано тем, что элемент #red заканчивает анимацию fadeOut() до того, как может начаться fadeIn(). - person Rémi Breton; 18.12.2012
comment
Что можно улучшить с помощью css3? - person Nrc; 19.12.2012
comment
Вы можете использовать переходы CSS3 для анимации цвета фона. Вот так: jsfiddle.net/DpD8S/23. Ознакомьтесь с этим другим ответом, в котором говорится о переходах CSS: несколько свойств"> stackoverflow.com/questions/9670075/ - person Rémi Breton; 19.12.2012

Функция наведения обычно определяется следующим образом:

$('#red').hover(function() {
    $(this).fadeOut();
}, function() {
    $(this).fadeIn();
});

Первая функция — это часть mouseenter .hover(). Вторая функция — часть зависания мыши. В вашем случае фоновый div не имеет значения для проблемы.

person Jay Blanchard    schedule 18.12.2012
comment
Странный. Я бы согласился с ответом @Remi Breton, где он правильно разделяет функции. Я не думал, что ховер так реагирует. - person Jay Blanchard; 18.12.2012