Ховер (hover) — это CSS-псевдокласс и визуальное состояние элемента интерфейса, которое активируется при наведении указателя мыши. Этот механизм обеспечивает обратную связь пользователю, подтверждая, что элемент готов к взаимодействию. По данным MDN Web Docs (2026), псевдокласс :hover поддерживается всеми современными браузерами и является одним из самых используемых CSS-селекторов для создания интерактивности.
Главное
Ховер (от англ. hover — парить, зависать) — визуальная реакция элемента интерфейса на наведение курсора мыши. Термин используется для обозначения как самого CSS-псевдокласса :hover, так и состояния элемента при наведении.
Концепция ховера появилась в ранних графических интерфейсах Xerox Alto (1973) и была стандартизирована в вебе с появлением CSS2 в 1998 году. С тех пор ховер стал неотъемлемой частью пользовательского опыта на десктопе.
По данным CSS Usage Statistics (2025), 94% сайтов в топ-1000 используют псевдокласс :hover хотя бы для одного элемента. Наиболее часто ховер применяется для кнопок (89%), ссылок (85%) и карточек (62%).
Ховер ≠ active. :hover активируется при наведении, :active — в момент нажатия. :focus активируется при фокусе через клавиатуру. Каждое состояние решает свою задачу. Ховер — это предпросмотр, active — подтверждение действия.
Псевдокласс :hover в CSS применяет стили к элементу, когда пользователь наводит на него курсор мыши. Он работает с любым HTML-элементом, но чаще всего используется с интерактивными элементами.
/* Basic hover implementation */
.button {
background: #4A90D9;
color: white;
padding: 12px 24px;
border: none;
transition: all 0.3s ease;
}
.button:hover {
background: #357ABD;
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(74,144,217,0.4);
}
Специфичность селектора :hover — такая же, как у класса (0,1,0). Если нужно переопределить ховер для конкретного элемента, используйте селектор с более высокой специфичностью. Порядок объявления важен: если объявить :hover после :focus, ховер может не работать при фокусе.
:hover можно комбинировать с другими псевдоклассами для создания сложной логики. Например, .card:hover .card__title меняет стиль заголовка внутри карточки при наведении на всю карточку. Это позволяет создавать эффекты с вложенной анимацией.
Hover-эффекты делятся на несколько категорий по типу изменяемого свойства. Каждый тип подходит для разных сценариев и создаёт определённое ощущение у пользователя.
| Тип эффекта | CSS-свойство | Пример применения |
|---|---|---|
| Цветовой | background, color | Кнопка меняет цвет фона при наведении |
| Теневой | box-shadow | Карточка приподнимается за счёт тени |
| Масштабный | transform: scale | Иконка увеличивается при наведении |
| Сдвиг | transform: translate | Элемент смещается вверх или в сторону |
| Подчёркивание | border-bottom, underline | Ссылка получает подчёркивание снизу |
| Фильтр | filter: brightness | Изображение становится ярче или темнее |
| Градиент | background-image | Фон переливается при наведении |
Наиболее эффективный тип — комбинация цветового и теневого эффектов. Material Design рекомендует использовать elevation change (изменение высоты тени) как основной тип hover-обратной связи.
По данным Google Material Design (2024), hover-эффект должен быть заметным, но не отвлекающим. Рекомендуемая длительность анимации — 200–300 миллисекунд. Слишком быстрые эффекты (менее 100 мс) могут быть не замечены, слишком медленные (более 500 мс) раздражают пользователя.
CSS-свойство transition делает hover-эффекты плавными, анимируя изменение свойств во времени. Без transition ховер срабатывает мгновенно, что выглядит дёргано и неприятно для глаза.
/* Different transitions per property */
.card {
transition:
box-shadow 0.3s ease-out,
transform 0.2s ease-out,
background 0.15s linear;
}
.card:hover {
box-shadow: 0 8px 30px rgba(0,0,0,0.15);
transform: translateY(-4px);
}
Длительность transition зависит от контекста. Для мелких элементов (иконки, ссылки) — 150–200 мс. Для крупных элементов (карточки, модальные окна) — 250–350 мс. Функция easing ease-out плавно замедляет анимацию к концу, создавая естественное ощущение.
Рекомендуемая практика — указывать transition для каждого анимируемого свойства отдельно. Свойство all удобно на этапе разработки, но в продакшене лучше определять конкретные свойства для анимации, чтобы избежать неожиданных эффектов.
На сенсорных устройствах концепция ховера отсутствует: нет курсора, который можно навести на элемент. Тап по элементу сразу активирует click, минуя hover-состояние. Это создаёт проблемы, если интерфейс полагается исключительно на ховер.
По данным StatCounter (2026), 62% мирового веб-трафика приходится на мобильные устройства. Игнорировать отсутствие ховера на touch-экранах — значит потерять контроль над UX для большинства пользователей.
/* Disable hover on touch devices */
@media (hover: none) and (pointer: coarse) {
.button:hover {
background: initial;
transform: none;
}
}
Медиа-запрос hover: none позволяет определить, что устройство не поддерживает наведение. На таких устройствах ховер-эффекты отключаются, и взаимодействие строится на :active и :focus-состояниях. Альтернативное решение — показывать hover-контент при тапе (первый тап показывает ховер, второй — выполняет действие), но такой паттерн ухудшает UX.
Доступность ховера — критический аспект, который часто упускают. Пользователи, которые управляют интерфейсом с клавиатуры, не могут активировать :hover. Функции, доступные только через ховер, становятся для них недоступными.
Правило WCAG 2.2 (Success Criterion 1.4.13 — Content on Hover or Focus): контент, появляющийся при ховере, должен быть доступен и при фокусе. Если ховер показывает дополнительную информацию (тултип, выпадающее меню), эта же информация должна быть доступна при :focus.
/* Hover + focus for accessibility */
.tooltip-trigger:hover .tooltip,
.tooltip-trigger:focus .tooltip {
opacity: 1;
visibility: visible;
}
/* Disable animation for vestibular disorder */
@media (prefers-reduced-motion: reduce) {
*:hover {
transition: none;
}
}
Медиа-запрос prefers-reduced-motion — уважайте системные настройки пользователей. Если пользователь отключил анимацию в системе — hover-эффекты должны применяться мгновенно, без transition. Это помогает людям с вестибулярными расстройствами.
Дополнительные рекомендации: не используйте ховер для критических функций, не используйте только цвет для передачи информации при ховере (добавляйте иконку или текст) и обеспечьте достаточный контраст для hover-состояний.
Часто задаваемые вопросы
:hover активируется при наведении мыши на элемент. :focus активируется, когда элемент получает фокус — при табуляции с клавиатуры или после клика. Для доступности важно дублировать hover-эффекты через :focus.
На touch-устройствах ховер работает нестабильно: первый тап активирует :hover, второй — click. Это создаёт путаницу. Рекомендуется использовать медиа-запрос @media (hover: none) для отключения ховер-эффектов на сенсорных экранах.
Используйте события mouseenter (наведение) и mouseleave (увод курсора). В отличие от CSS-ховера, JavaScript даёт полный контроль над анимацией и позволяет создавать сложные последовательные эффекты с задержками.
iOS Safari имеет специальную обработку :hover. После тапа элемент входит в состояние :hover и остаётся в нём до следующего тапа. Это может приводить к залипанию hover-стилей. Решение — использовать @media (hover: hover), чтобы применять ховер только на устройствах с поддержкой наведения.
ease-out (cubic-bezier(0, 0, 0.2, 1)) — оптимальный выбор для ховера: быстрый старт и плавное замедление в конце. ease-in-out подходит для эффектов с двумя фазами (появление и исчезновение). Избегайте linear — он выглядит неестественно.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также