Процесс обработки любого события - это создание какой-либо функции и добавление ее в качестве обработчика для конкретного элемента. Прочитать о способах обработки событий вы можете в статье "Обработка событий в JavaScript".
Пример обработчика события onmouseover как атрибута элемента
Сейчас речь пойдет о событии onmouseover, которое происходит, когда указатель мыши перемещается на элемент или на один из его дочерних элементов. Например,
1 | <p onmouseover="this.style.color = 'red'">Наведи мышь, и текст покраснеет</p> |
Наведи мышь, и текст покраснеет
Однако, это событие редко используется самостоятельно. Обычно оно "идет в паре" с обработкой события onmouseout, которое происходит , когда пользователь убирает указатель мыши с элемента или с одного из его дочерних элементов, т.е. выполняет действие, обратное для onmouseover. Посмотрим, как похожий пример будет выглядеть с обработкой 2-х событий:
1 2 3 | <p onmouseover="this.style.color = 'red'" onmouseout="this.style.color = ''"> Наведи мышь, и текст покраснеет, а потом почернеет снова</p> |
Наведи мышь, и текст покраснеет, а потом почернеет снова
В примерах выше в обоих случаях было использовано ключевое слово this
, которое указывает на объект, к которому применяется обработчик события. В нашем случае это был абзац с текстом.
Если задуматься о сути того, что было сделано, то мы просто сымитировали двумя обработчиками событий работу псевдокласса :hover
:
1 2 3 4 5 6 | <style> p.example:hover { color: red; } </style> <div class="test"> <p class="example">Наведи мышь, и текст покраснеет, а потом почернеет снова</p> </div> |
Наведи мышь, и текст покраснеет, а потом почернеет снова
Данный пример говорит о том, что если обработку каких-то событий в JS можно заменить с помощью CSS-свойств, лучше отдать предпочтение стилям.
Обработка наведения/уведения курсора мыши для изображений
Рассмотрим пример посложнее. Предположим, на нужно заменить одно изображение другим. Просто так это в CSS или HTML не сделать, хотя можно использовать свойства background-image
или свойство content:url()
в псевдоэлементах ::before или ::after. Для тега <img> это нужно будет сделать с помощью JavaScript:
1 2 3 4 5 6 7 8 9 10 11 | <img src="images/boat.jpg" alt="Boat" title="Boat" id="pic"> <script> pic.onmouseover = function(){ this.src = 'images/zakat.jpg'; this.alt = this.title ='Zakat'; } pic.onmouseout = function(){ this.src = 'images/boat.jpg'; this.alt = this.title ='Boat'; } </script> |
Наведите курсор мыши на изображение, а затем уберите его
Смена изображений с анимацией
В том случае, если вам необходимо сменять изображения с анимационным эффектом, например, плавного появления изображения из opacity
, можно использовать css-свойство animation
. Чтобы анимация запускалась не при появлении изображения, а в момент смены src
, управлять этим процессом будем с помощью класса active. И при наведении, и при уведении курсора мыши мы будем сначала добавлять класс active
с помощью свойства classList
и его метода .add()
, а затем удалять этот класс через 500ms, которые соответствуют 0.5s, определенных в свойстве animation
для класса active
. Удалять класс бцдем методом remove()
того же свойства classList
, но задавать это будем с помощью метода setTimeout
и стрелочной функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <style> @keyframes fadePic { 0% {opacity: 0} 100% {opacity: 1} } #picture.active { animation: fadePic .5s ease-out;} </style> <div class="test"> <img src="images/headphones-01.jpg" alt="Black headphones" title="Headphones" id="picture"> <p>Наведите курсор мыши на изображение, а затем уберите его</p> </div> <script> picture.onmouseover = function(){ this.classList.add('active'); this.src = 'images/headphones-03.jpg'; this.alt = this.title ='White headphones'; setTimeout(() =>{this.classList.remove('active');}, 500); } picture.onmouseout = function(){ this.classList.add('active'); this.src = 'images/headphones-01.jpg'; this.alt = this.title ='Black headphones'; setTimeout(() => {this.classList.remove('active');}, 500); } </script> |
Пример с анимационным переходом при обработке событий onmouseover и onmouseout:
Наведите курсор мыши на изображение, а затем уберите его
Пример обработки событий onmouseover и onmouseout с делегированием событий
В примере выше при наведении/уведении курсора мыши изображение меняется на другое и затем опять происходит возврат к отображению первой картинки. Мы усложним задачу и сделаем несложный вариант увеличения картинки в отдельном блоке при наведении курсора мыши на нее. Что-то подобное, но в более сложном варианте, предлагают обычно интернет-магазины одежды.
Для примера нам понадобится 2 div-а-контейнера:
- для 4х небольших изображений, уменьшенных с помощью css-кода
- для увеличенного изображения с абсолютным позиционированием
Ниже представлена разметка и CSS-стили.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <style> #picHolder { position: absolute; top: 90px; left: 290px; width: 400px; height: 400px; padding: 10px; border: 6px solid #ddd; box-shadow: 0 0 26px rgba(0, 0, 0, 0.7); background: #fff no-repeat 10px 10px; display: none; } #picContainer { width: 250px; padding: 5px; border: 3px solid #ccc; margin: 20px 0; } #picContainer img { width: 100px; border: 1px solid #ddd; cursor: pointer; padding: 5px; margin: 5px; } </style> <div id="picContainer"> <img src="cups/cup2.jpg" alt="Cup with cat"> <img src="cups/cup1.jpg" alt="Cup with cat"> <img src="cups/cup3.jpg" alt="Cup with cat"> <img src="cups/cup4.png" alt="Cup with sheep"> </div> <div id="picHolder"></div> |
Сам пример выглядит так:
Код на JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <script> var picHolder = document.getElementById("picHolder"); var picContainer = document.getElementById("picContainer") picContainer.addEventListener('mouseover', function(event) { var target = event.target; console.log(target.tagName); if (target.tagName != "IMG") picHolder.style.display = 'none'; else { picHolder.style.backgroundImage = "url(" + target.src + ")"; picHolder.style.display = 'block'; } }); picContainer.addEventListener('mouseout', function() { picHolder.style.display = 'none'; }); </script> |
Обратите внимание, что здесь использована обработка событий с помощью метода addEventListener
. В этом случае вместо onmouseover
(onmouseout
) записывается только название, а не обработчик события - mouseover
(mouseout
).
Делегирование событий заключается в том, что мы не писали обработчики для каждого тега img
, а задали всего один для их родительского элемента - div-a c id="picContainer"
. В функции же, которая обрабатывает действия пользователя, мы использовали строку var target = event.target
для того, чтобы определить целевой объект события, т.е. тег img
.
Также в коде мы учли, что между изображениями в div-e есть отступы, которые относятся к родительскому элементу, поэтому строка if (target.tagName != "IMG")
проверяет, а является ли наш целевой объект тегом <img>, и только в этом случае отображает увеличенное изображение. Вы можете самостоятельно отследить, для какого элемента наступает событие при наведении курсора мыши с помощью строки console.log(target.tagName)
и консоли в браузере (ее вызывает клавиша F12), если откроете пример в новой вкладке.
На скриншоте представлена консоль в браузере Mozilla Firefox. Стрелками показаны места наведения указателя мыши.
афтор, почему код низя скопирнуть?
Можно скопировать, на самом деле.
Для этого есть кнопка в виде 2-х листочков. Нажимаете на нее и CTRL + C, а потом CTRL + V в свой файл.
добавить в СSS transition: 1s; - для блока c фото
Это, похоже, ответ на предыдущий комментарий насчет плавной смены изображений при наведении.
Лучше использовать для этой цели свойство animation из примера.
Подскажите как сделать плавную смену изображений, в этом случае
В каком именно случае нужна плавная смена изображений?
Не знал что можно так легко менять картинку или тому подобное, через просто скрипт
Да, вот такой он, красивый и мощный JavaScript