Как работает :hover
:hover это псевдокласс, который выбирает элемент, пока над ним находится указатель мыши. Добавьте его к любому селектору и напишите стили для состояния наведения:
Меняются только объявления из правила :hover, все остальное берется из .btn. Когда указатель уходит, элемент возвращается к обычным стилям.
Плавные эффекты наведения с transition
Изменение при наведении происходит мгновенно, если не добавить transition в обычное правило (а не в правило :hover); тогда анимация идет и при наведении, и при уходе:
transform и opacity дешевле всего анимировать: они не сдвигают соседние элементы. Анимация width, height или margin заставляет страницу пересчитывать раскладку на каждом кадре. Длительность, задержки и кривые плавности описаны на странице про transition в CSS.
Цвета ссылок: :link, :visited, :hover, :active
У ссылок четыре классических состояния плюс фокус с клавиатуры, и порядок правил важен:
| Псевдокласс | Действует, когда |
|---|---|
:link | Ссылку еще не посещали |
:visited | URL есть в истории браузера |
:hover | Над ссылкой указатель |
:active | Ссылку нажимают |
:focus-visible | На ссылке фокус с клавиатуры |
Специфичность у всех одинаковая, поэтому при совпадении двух побеждает более позднее правило. Посещенная ссылка под указателем подходит и под :visited, и под :hover; если :visited идет последним, цвет наведения никогда не появится. Надежный порядок: Link, Visited, Hover, Active (LVHA):
Браузеры ограничивают то, что может менять :visited, чтобы страницы не могли прочитать вашу историю. Действуют только свойства, связанные с цветом (color, background-color, border-color, outline-color и еще несколько), а скрипты всегда видят значение непосещенной ссылки.
:active: состояние нажатия
:active выбирает элемент, пока его нажимают. Небольшое смещение делает кнопку ощутимо «физической»:
Наведение на родителя меняет дочерний элемент
Состояние hover принадлежит элементу под указателем и всем его предкам. Поэтому .card:hover .title оформляет заголовок, когда наведена любая часть карточки, и так же можно показывать скрытые элементы:
Строка с :focus-within важна: без нее пользователь клавиатуры, дошедший табом до кнопки Delete, нажал бы невидимую кнопку. Каждому появлению по наведению нужна пара с правилом для фокуса.
Hover на сенсорных экранах
У телефонов и планшетов нет указателя, который задерживается над элементом. Большинство мобильных браузеров применяют :hover при первом касании и держат его, пока вы не коснетесь другого места, поэтому стиль наведения может выглядеть «залипшим». Два правила держат это под контролем:
- Никогда не делайте
:hoverединственным путем к содержимому. Меню, которое открывается по наведению, должно открываться и по клику. - Оборачивайте чисто декоративные эффекты наведения в медиазапрос, который проверяет наличие настоящего устройства с наведением:
@media (hover: hover) {
.card:hover { transform: translateY(-4px); }
}
Частые ошибки
- Пробел перед двоеточием.
.btn :hoverозначает «наведенный элемент внутри.btn». Пишите.btn:hover. transitionтолько в правиле:hover. Тогда анимация есть при наведении, а при уходе стиль возвращается скачком. Ставьте его в обычное правило.- Неправильный порядок для ссылок. Держите
:link,:visited,:hover,:activeименно в этом порядке. - Hover без стиля фокуса. Пользователи клавиатуры никогда не вызывают
:hover; задайте интерактивным элементам и стиль:focus-visible. - Hover на элементе, перекрытом другим. Невидимый слой сверху (часто абсолютный псевдоэлемент) может перехватывать указатель.
pointer-events: noneна этом слое решает проблему.
Часто задаваемые вопросы
Как сделать эффект при наведении в CSS?
Напишите правило с :hover после селектора: .btn:hover { background: #1d4ed8; }. Объявления применяются, пока указатель над элементом. Добавьте transition: background 0.2s; в обычное правило, чтобы изменение было анимированным.
Чем :hover отличается от :active?
:hover действует, пока указатель над элементом. :active действует, пока элемент нажимают, от нажатия кнопки мыши до ее отпускания. Нажатая кнопка обычно одновременно в состояниях hover и active.
В каком порядке писать псевдоклассы ссылок?
:link, :visited, :hover, :active (запомните LVHA, или «LoVe HAte»). Специфичность у них одинаковая, поэтому побеждает более позднее правило; при любом другом порядке стиль посещенной или наведенной ссылки может скрыть стиль hover или active.
Как изменить цвет ссылки в CSS?
Оформите элемент a: a { color: #2563eb; }, а затем a:visited { color: #7c3aed; } и a:hover { color: #1d4ed8; } для других состояний. color на a действует и на непосещенные, и на посещенные ссылки.
Работает ли hover на телефоне?
На сенсорных экранах нет указателя, который может задержаться над элементом. Большинство мобильных браузеров применяют :hover по касанию и держат его, пока вы не коснетесь чего-то другого, поэтому стиль наведения может «залипнуть». Оборачивайте эффекты только для наведения в @media (hover: hover) и никогда не прячьте важное содержимое за hover.