Когда мы создаём сайты, мы хотим, чтобы ими было удобно пользоваться всем людям — и тем, кто управляет страницей с помощью мыши, и тем, кто использует клавиатуру. Например, человек с ограниченными возможностями зрения может перемещаться по элементам с помощью клавиши Tab
.
Браузеры по умолчанию показывают рамку (outline) вокруг элемента, когда он получает фокус — например, при клике мышкой или при перемещении с помощью клавиатуры. Эта рамка помогает понять, какой элемент активный.
Но бывает так, что рамка появляется даже тогда, когда она не нужна. Например, Вы кликнули мышкой по кнопке, и вокруг неё появилась рамка — выглядит не очень красиво, а пользы от неё нет, потому что курсор мыши уже показывает, куда мы кликнули.
Тут и помогает :focus-visible
. Этот псевдокласс позволяет показывать рамку только в тех случаях, когда это действительно полезно — обычно при навигации с клавиатуры.
Чем: focus-visible лучше просто: focus
Если использовать только :focus
, то стили срабатывают всегда, когда элемент получает фокус — хоть с мыши, хоть с клавиатуры. Это может раздражать:
button:focus {
outline: 2px solid blue;
}
Если кликнуть мышкой по кнопке, вокруг неё появится синяя рамка.
А с :focus-visible
рамка будет появляться только при фокусе с клавиатуры:
button:focus-visible {
outline: 2px solid blue;
}
Так мы делаем интерфейс чище и удобнее для всех.
Как использовать на практике
Давайте посмотрим простой пример. Представьте форму с полями ввода и кнопкой:
<form>
<input type="text" placeholder="Ваше имя">
<input type="email" placeholder="Ваш e-mail">
<button type="submit">Отправить</button>
</form>
Добавим стили:
input:focus-visible,
button:focus-visible {
outline: 3px solid #007acc;
}
input:focus,
button:focus {
outline: none;
}
Что тут происходит?
- Когда элемент получает фокус с клавиатуры, срабатывает
:focus-visible
, и появляется синяя рамка. - Когда элемент получает фокус с мыши, срабатывает
:focus
, но рамку мы убираем, потому чтоoutline: none;
.
Итог: для тех, кто пользуется клавиатурой, подсветка есть — удобно. Для тех, кто кликает мышкой, лишнего визуального шума нет.
Почему это хорошо и правильно
Использование :focus-visible
делает сайт:
- доступным — люди с ограничениями здоровья могут удобно перемещаться по интерфейсу;
- аккуратным — рамка появляется только тогда, когда это нужно;
- современным — поддержка псевдокласса есть во всех актуальных браузерах (кроме очень старых версий).
Советы по применению
Всегда тестируйте фокус с клавиатуры — нажимайте Tab
, чтобы убедиться, что активный элемент виден.
Не убирайте рамку совсем, если не добавляете альтернативный стиль — это ухудшает доступность.
Можно комбинировать с другими псевдоклассами, например :hover
, чтобы добиться идеального внешнего вида.
Полный пример
Вот рабочий пример кода, который можно использовать как основу в своих проектах:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Пример с :focus-visible</title>
<style>
button,
input {
padding: 8px 12px;
font-size: 16px;
margin-bottom: 10px;
display: block;
}
input:focus {
outline: none;
}
button:focus {
outline: none;
}
input:focus-visible,
button:focus-visible {
outline: 3px solid #007acc;
}
</style>
</head>
<body>
<form>
<input type="text" placeholder="Ваше имя">
<input type="email" placeholder="Ваш e-mail">
<button type="submit">Отправить</button>
</form>
</body>
</html>
Попробуйте открыть этот код в браузере и понажимать Tab
. Вы увидите, что рамка появляется только при навигации с клавиатуры, а при кликах мышкой её нет.
Заключение
:focus-visible
— это современный инструмент для улучшения доступности и внешнего вида сайта. Он позволяет показывать фокус там, где это действительно нужно, и не отвлекать пользователя там, где это лишнее.
Используйте :focus-visible
в своих проектах — это хороший тон и забота о пользователях.