Перейти к содержимому

JavaScript Движение мыши: mouseover/out, mouseenter/leave

Понимание событий движения мыши в JavaScript: mouseover, mouseout, mouseenter и mouseleave

События движения мыши в JavaScript позволяют разработчикам реагировать на перемещение курсора над элементами веб-страницы. Эти события необходимы для создания интерактивных и отзывчивых интерфейсов, реагирующих на действия пользователя. В этом руководстве мы рассмотрим различия между событиями mouseover, mouseout, mouseenter и mouseleave, а также приведём практические примеры их использования.

Типы событий движения мыши

Mouseover и Mouseout

  • mouseover: Это событие срабатывает, когда мышь входит в элемент или любой из его дочерних элементов. Оно полезно для запуска реакций, когда курсор мыши входит в определённую область, включая области, покрытые дочерними элементами.
  • mouseout: Напротив, это событие срабатывает, когда мышь покидает элемент или любой из его дочерних элементов. Как и mouseover, оно учитывает перемещение внутрь и наружу дочерних элементов.

Mouseenter и Mouseleave

  • mouseenter: Это событие похоже на mouseover, но не всплывает и не срабатывает при перемещении мыши над дочерним элементом. Оно идеально подходит для запуска реакции, когда мышь впервые входит в границы элемента.
  • mouseleave: Это событие срабатывает, когда мышь покидает границы элемента, и, как и mouseenter, не всплывает и не срабатывает при перемещении наружу из дочерних элементов.

Практические примеры событий движения мыши

Эти примеры демонстрируют, как реализовать события движения мыши для улучшения пользовательского опыта с помощью интерактивных элементов.

Пример 1: Использование Mouseover и Mouseout

В этом примере показано, как изменить цвет фона блока, когда курсор мыши входит в него и покидает его, включая его дочерние элементы.


javascript
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Mouseover and Mouseout Example</title>
    <style>
        #box {
            width: 200px;
            height: 200px;
            background-color: lightblue;
        }
        #innerBox {
            width: 100px;
            height: 100px;
            background-color: lightcoral;
            margin: 50px;
        }
    </style>
</head>
<body>
<div id="box">
    Hover over me!
    <div id="innerBox"></div>
</div>

<script>
    document.getElementById('box').addEventListener('mouseover', function() {
        this.style.backgroundColor = 'cyan';
    });
    document.getElementById('box').addEventListener('mouseout', function() {
        this.style.backgroundColor = 'lightblue';
    });
</script>
</body>
</html>

Пояснение:

  • Событие mouseover меняет цвет фона блока на голубой (cyan), в том числе при наведении на внутренний блок.
  • Событие mouseout сбрасывает цвет фона, когда мышь покидает блок, также учитывая внутренний блок.

Пример 2: Реализация Mouseenter и Mouseleave

Этот пример улучшает взаимодействие с пользователем, показывая, как использовать mouseenter и mouseleave для более точной реакции без влияния на дочерние элементы.


javascript
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Mouseenter and Mouseleave Visual Example</title>
    <style>
        #parent {
            width: 400px;
            height: 300px;
            background-color: lightblue; /* Initial background color */
            padding: 20px;
            box-sizing: border-box;
            position: relative;
            display: flex;
            justify-content: space-around;
            align-items: center;
            transition: background-color 0.3s ease;
        }
        .child {
            width: 90px;
            height: 90px;
            background-color: lightsalmon;
            display: flex;
            justify-content: center;
            align-items: center;
            transition: background-color 0.3s ease;
        }
        #feedback {
            position: fixed;
            bottom: 10px;
            left: 10px;
            background: white;
            padding: 10px;
            border: 1px solid #ccc;
            font-family: Arial, sans-serif;
        }
    </style>
</head>
<body>
<div id="parent">
    Parent Element
    <div class="child">Child 1</div>
    <div class="child">Child 2</div>
    <div class="child">Child 3</div>
</div>
<div id="feedback">Hover over elements to see interactions.</div>

<script>
    const parent = document.getElementById('parent');
    const children = document.querySelectorAll('.child');
    const feedback = document.getElementById('feedback');

    parent.addEventListener('mouseenter', function() {
        parent.style.backgroundColor = 'cyan'; // Highlight the parent on mouse enter
        feedback.textContent = 'Mouse entered the parent element';
    });

    parent.addEventListener('mouseleave', function() {
        parent.style.backgroundColor = 'lightblue'; // Revert color on mouse leave
        feedback.textContent = 'Mouse left the parent element';
    });

    // Update feedback for child interactions
    children.forEach(child => {
        child.addEventListener('mouseenter', function() {
            feedback.textContent = `Mouse entered ${this.textContent}`;
            this.style.backgroundColor = '#ffcccb'; // Highlight child on mouse enter
        });
        child.addEventListener('mouseleave', function() {
            feedback.textContent = `Mouse left ${this.textContent}`;
            this.style.backgroundColor = 'lightsalmon'; // Revert child color on mouse leave
        });
    });
</script>
</body>
</html>

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

Заключение

События движения мыши позволяют разработчикам создавать тонкие взаимодействия на основе поведения мыши пользователя, повышая динамичность и отзывчивость веб-приложений. Понимая конкретное поведение событий mouseover, mouseout, mouseenter и mouseleave, вы сможете эффективно настроить обработку событий в соответствии с требованиями к дизайну и функциональности различных веб-компонентов.

Практика

Какие основные различия между событиями Mouseover/Mouseout и Mouseenter/Mouseleave в JavaScript?

Считаете ли это полезным?

Предпросмотр dual-run — сравните с маршрутами Symfony на продакшене.