- Введение в CSS псевдокласс :focus-visible
- Как работает :focus-visible и почему он важен
- Поддержка :focus-visible в современных и старых браузерах
- Текущая поддержка по данным на 2024 год
- Основные причины отсутствия поддержки :focus-visible в старых браузерах
- Пояснение по техническим аспектам
- Как обеспечить кроссбраузерную поддержку: решения и советы
- Использование полифиллов
- Пример кода с использованием полифилла
- Другие рекомендации
- Статистика использования устаревших браузеров
- Заключение
Введение в CSS псевдокласс :focus-visible
CSS-псевдокласс :focus-visible появился как инструмент для улучшения опыта навигации с клавиатуры, позволяя разработчикам контролировать стилизацию элементов, которые находятся в фокусе и нуждаются в визуальном выделении. Он служит более точной альтернативой классическому :focus, который иногда слишком агрессивно подсвечивает элементы даже при взаимодействии с мышью, что может раздражать пользователей.

Тем не менее, несмотря на свою полезность, :focus-visible не работает в ряде старых и популярных браузеров, что создает проблемы с кроссбраузерной совместимостью.
Как работает :focus-visible и почему он важен
Псевдокласс :focus-visible применяет стили только для элементов, которые получили фокус с клавиатуры (или иными способами, подразумевающими необходимость визуальной индикации, например, с помощью специальных технологий доступа). Это позволяет избежать избыточного подсвечивания, когда пользователь кликает мышкой, что улучшает визуальную чистоту интерфейса.
Пример базового использования:
button:focus-visible {
outline: 2px solid blue;
}
В этом примере кнопка будет выделяться синим контуром только если фокус был установлен клавиатурой.
Поддержка :focus-visible в современных и старых браузерах
Основная причина, почему :focus-visible не работает в старых браузерах — отсутствие поддержки данного спецификатора в их CSS-движках или устаревших версиях движков.
Текущая поддержка по данным на 2024 год
| Браузер | Минимальная поддерживаемая версия | Поддержка :focus-visible |
|---|---|---|
| Google Chrome | 85+ | Полная |
| Firefox | 85+ | Полная |
| Safari | 15.4+ | Полная |
| Edge (Chromium-based) | 85+ | Полная |
| Internet Explorer | — | Нет поддержки |
| Opera | 71+ | Полная |
Как видно из таблицы, «старые» браузеры вроде Internet Explorer и ранние версии популярных браузеров не поддерживают :focus-visible. На практике это значит, что для пользователей, работающих на таких браузерах, стили, которые ориентированы на :focus-visible, не будут применяться.
Основные причины отсутствия поддержки :focus-visible в старых браузерах
- Устаревшая реализация CSS-движка: Сложности внедрения новых псевдоклассов требуют обновления движка, чего не происходит в устаревших браузерах.
- Низкий приоритет развития: Многие старые браузеры, такие как Internet Explorer, перестали получать основные обновления и новые функции.
- Отсутствие стандартизации на момент релиза браузера: :focus-visible стал стандартом только в последние годы, поэтому ранние версии браузеров не могут его «понять».
- Технические ограничения: Работа :focus-visible требует интерактивной логики по определению типа фокуса (клавиатура, мышь и др.), что добавляет сложности для реализации в рендеринг движках.
Пояснение по техническим аспектам
Особенность :focus-visible в том, что браузер должен уметь отличать фокус, вызванный клавиатурным вводом (например, клавишей Tab), от фокуса, вызванного кликом мыши. Возникает необходимость в расширенной логике событий и отслеживании состояния, что не было предусмотрено в старых браузерах.
Как обеспечить кроссбраузерную поддержку: решения и советы
С учетом распространенности старых браузеров, особенно в корпоративной среде, важно применять подходы, которые компенсируют отсутствие поддержки :focus-visible.
Использование полифиллов
Одним из наиболее эффективных способов является подключение JavaScript-полифилла, который имитирует поведение :focus-visible.
- Полифилл отслеживает фокус и взаимодействие пользователя и динамически добавляет класс .focus-visible на элемент.
- Далее в CSS вместо :focus-visible можно использовать .focus-visible класс.
Это гарантирует, что даже в старых браузерах будет работать необходимая стилизация.
Пример кода с использованием полифилла
// JS-полифилл (упрощенный пример)
document.body.addEventListener(‘keydown’, e => {
if (e.key === ‘Tab’) {
document.body.classList.add(‘user-is-tabbing’);
}
});
document.body.addEventListener(‘mousedown’, e => {
document.body.classList.remove(‘user-is-tabbing’);
});
/* CSS */
button:focus {
outline: none;
}
.user-is-tabbing button:focus {
outline: 2px solid blue;
}
Другие рекомендации
- Не полностью полагаться на :focus-visible, а комбинировать с классическими методами подсветки фокуса.
- Проводить тестирование в браузерах, популярных у вашей целевой аудитории.
- Использовать инструменты аудит доступности для проверки корректности визуальной индикации фокуса.
Статистика использования устаревших браузеров
Согласно статистике на 2024 год, доля пользователей Internet Explorer и ранних версий браузеров часто превышает 5% в ряде стран и корпоративных средах. Это значительная аудитория, которая может столкнуться с проблемами из-за отсутствия поддержки :focus-visible.
| Регион | Доля IE и устар. браузеров (%) | Пояснение |
|---|---|---|
| Европа | 3.2 | Корпоративный сектор |
| Северная Америка | 2.5 | В основном офисные ПК |
| Азия | 5.7 | Смесь устройств и ПК |
| Россия | 4.8 | Высокое использование устаревших корпоративных решений |
Исходя из этих данных, игнорирование поддержки :focus-visible в старых браузерах может привести к значительным проблемам с доступностью.
Заключение
CSS псевдокласс :focus-visible — значимый инструмент для улучшения пользовательского опыта и доступности веб-интерфейсов. Его поддержка в современных браузерах уже достаточно хороша, но старые версии и устаревшие браузеры, такие как Internet Explorer и ранние релизы Chrome, Firefox, Safari, не поддерживают этот псевдокласс.
Основные причины кроются в отсутствии обновлений движков, технических ограничениях и низком приоритете внедрения новых стандартов в старом ПО.
Чтобы обеспечить доступность и единообразное поведение во всех браузерах, разработчикам настоятельно рекомендуется применять полифиллы, использовать классические методы подсветки фокуса и тщательно тестировать свои решения.
Авторский совет: «Оптимальное решение — комбинировать :focus-visible с классическим :focus и использовать полифиллы, чтобы обеспечить доступность для максимального числа пользователей, включая тех, кто пользуется старыми браузерами.»
Такой подход позволит сделать взаимодействие с сайтом максимально приятным и удобным, независимо от используемого браузера.