Объяснение
Причина, почему эффект исчезает, когда вы наведите курсор мыши на title, это потому, что у вас есть событие только для элемента img
.
Вместо этого вы должны «связать» событие со всем li
, так что, когда пользователь наведет над элементом списка, весь элемент, включая div.title
, будет затронут.
На картинке выше вы можете увидеть, как это работает.
В настоящее время у вас есть события, связанные с зеленым, img
. Это означает, что div.title
, желтый, будет рассматриваться как «внешний» элемент (потому что div.title
не находится внутри элемента img
), и поэтому событие mouseleave
будет срабатывать, когда вы наведите указатель мыши на div.title
.
Если вы связываете события с li
, красный, событие будет охватывать все, что находится на красной рамке, которая зеленеет и желтый.
Вы также должны обработать свои блоки li
как display: inline-block
, чтобы вы могли позиционировать название по отношению к изображению.
Так, в основном, то, что я пытаюсь сказать, вместо
$('#illustration-content ul li img');
вы должны сделать
$('#illustration-content ul li');
Затем установите код соответственно.
Решение
Here is a working solution.
var $lis = $('#illustration-content ul li');
$lis.each(function(index, el){
var $this = $(el);
var eImg = $("img", $this);
$this.mouseenter(function(){
var eTitle = $('<div class="title">' + eImg .attr('alt') + '</div>');
eImg.css('opacity','.1');
$this.prepend(eTitle);
}).mouseleave(function(){
var eTitle = $("div.title", $this);
eImg.css('opacity','1');
eTitle.remove('.title');
});
});
Альтернативное решение
Вместо создания и уничтожения DIV на каждом mouseenter/mouseleave
, это могло бы быть лучше, чтобы произвести Див всего один раз в document.ready()
, и показать/скрыть их, когда пользователь парит над их.
Это должно фактически увеличить общую производительность.
Here's an example.
По умолчанию .title
обладает свойством display: none
стиля.
var $lis = $('#illustration-content ul li');
$lis.each(function(index, el){
var $this = $(el);
var eImg = $("img", $this);
var eTitle = $('<div class="title">' + eImg.attr('alt') + '</div>');
$this.prepend(eTitle)
.mouseenter(function(){
eImg.css('opacity','.1');
eTitle.show();
})
.mouseleave(function(){
eImg.css('opacity','1');
eTitle.hide();
});
});
Дополнительная информация, хорошо знать
Обратите внимание, что я использовал mouseenter
и mouseleave
вместо hover
. Наведение на самом деле является сокращенной функцией этих двух событий вместе взятых. Я склонен использовать первое, потому что его легче читать и более надежно читать.
Также обратите внимание, что в обоих решениях я использовал функцию .each()
. Путем проверки элементов на переменные JQuery не придется тратить больше средств на поиск узлов каждый раз, когда я их ссылаюсь; что делает его более эффективным.
Пропустив элемент в качестве второго параметра в селекторе, как этот
$(".title", parent_element).css(...);
Я не должны использовать такие функции, как .children()
или .next()
. Это также очень эффективно.
Вы упомянули, что вам было нелегко с position
ing, have a look at this, это может прояснить ситуацию.
Фу, эти длинные посты трудно читать, а? Ну, я думаю, что я все понял.
Удача & счастливая кодировка! :)
Большое вам спасибо за удивительное объяснение. Альтернативный способ кодирования работает как сон. Благодаря! – malicedix
@malicedix Нет проблем. Жаль, что у меня нет никакой репутации. Я думаю, что сделал слишком много изменений. : P – ShadowScripter
Да, это странно. Дайте мне знать, если что-нибудь могу сделать :) – malicedix