Управление на сайте с помощью клавиатуры

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Навигация с клавиатуры, это фундаментальный аспект веб-доступности (a11y). Она обеспечивает равный доступ к информации и функциям сайта для пользователей, которые не могут использовать мышь или сенсорный экран: людей с двигательными нарушениями, слабовидящих (использующих скринридеры) и «продвинутых» пользователей, предпочитающих горячие клавиши. На соответствие стандартам доступности перестало быть опцией и стало обязательным требованием для государственных и коммерческих ресурсов во многих юрисдикциях.

Нормативная база: WCAG и принципы доступности

Основным международным стандартом является WCAG (Web Content Accessibility Guidelines), разработанный консорциумом W3C. Руководство группирует требования по трем уровням соответствия: A (минимальный), AA (рекомендуемый стандарт для большинства ресурсов) и AAA (повышенный).

Согласно WCAG, доступность стоит на четырех принципах (POUR):

  • Воспринимаемость (Perceivable): Контент должен быть доступен для восприятия (текстовые альтернативы, адаптивность).
  • Управляемость (Operable): Ключевой принцип для клавиатурной навигации. Интерфейс должен быть управляем с клавиатуры.
  • Понятность (Understandable): Навигация должна быть предсказуемой и логичной.
  • Надежность (Robust): Совместимость с текущими и будущими пользовательскими агентами (браузерами, скринридерами).

Ключевые критерии успеха WCAG для клавиатуры

  1. 2.1.1 Keyboard (Уровень A): Вся функциональность контента должна быть управляема через интерфейс клавиатуры без требования специфических временных интервалов для нажатия клавиш.
  2. 2.1.2 No Keyboard Trap (Уровень A): Если фокус клавиатуры может быть перемещен к компоненту страницы с помощью клавиатуры, то его также можно переместить от этого компонента, используя только клавиатуру.
  3. 2.4.3 Focus Order (Уровень A): Если последовательность навигации влияет на понимание или взаимодействие, фокусируемые компоненты получают фокус в порядке, сохраняющем смысл и работоспособность.
  4. 2.4.7 Focus Visible (Уровень AA): Любой пользовательский интерфейс, управляемый с клавиатуры, имеет режим работы, в котором индикатор фокуса клавиатуры виден.
  5. 2.4.11 Focus Not Obscured (Minimum) (Уровень AA, WCAG 2.2): Элемент с фокусом клавиатуры не должен быть полностью скрыт авторским контентом (например, липким заголовком или чат-виджетом).
  6. 2.4.12 Focus Not Obscured (Enhanced) (Уровень AAA, WCAG 2.2): Элемент с фокусом не должен быть скрыт ни частично.

Использование нативных интерактивных элементов (<a>, <button>, <input>, <select>, <textarea>) автоматически предоставляет:

  • Попадание в таб-порядок (Tab order) по умолчанию.
  • Обработку клавиш Enter / Space для активации.
  • Встроенную семантику для скринридеров.

Плохая практика: Использование <div> или <span> с обработчиками onclick для кнопок или ссылок.

Хорошая практика: Нативные элементы. Если виджет сложный (например, кастомный селект или слайдер) — обязательно использование ARIA (WAI-ARIA) ролей, состояний и свойств (role="button", aria-expanded, aria-controls и т.д.) и ручная реализация клавиатурной логики (roving tabindex, обработка стрелок, Home/End).

Управление фокусом: tabindex

Значение Поведение Когда применять
tabindex="0" Включает элемент в естественный таб-порядок (после всех нативных элементов). Для кастомных интерактивных виджетов (на базе div/span), которые должны быть фокусируемыми.
tabindex="-1" Для модальных окон (фокус на контейнер при открытии), сообщений об ошибках, skip-links.
tabindex="1+" Принудительно устанавливает порядок табуляции. Строго запрещено (нарушает 2.4.3 Focus Order). Ломанная логика DOM-порядка.

Видимость фокуса (Focus Visible)

Критерий 2.4.7 (Level AA) требует явного визуального индикатора. Сброс стандартного аутлайна (outline: none) без замены на альтернативу — грубое нарушение.

/* Пример доступного стиля фокуса /
:focus-visible {
 outline: 3px solid #005fcc; / Брендовый цвет или системный /
 outline-offset: 2px;
 box-shadow: 0 0 0 5px rgba(0, 95, 204, 0.3); / Для контраста на сложных фонах /
}

/ Не делайте так! /
:focus { outline: none; } 

Паттерны навигации и сложные виджеты

Skip Links (Ссылки-пропуски)

Первый фокусируемый элемент на странице должен быть ссылкой «Перейти к основному контенту» (Skip to main content). Она скрыта визуально до получения фокуса.

<a href="#main-content" class="skip-link">Перейти к основному контенту</a>
<main id="main-content" tabindex="-1">...</main>

Модальные окна (Dialogs)

  • При открытии: фокус перемещается в модальное окно (на или первый фокусируемый элемент).
  • Focus Trap (Ловушка фокуса): Табуляция циклируется внутри модалки (Tab -> последний -> первый). Esc закрывает окно и возвращает фокус на триггер.
  • Используйте <dialog> (нативный) или role="dialog" + aria-modal="true" + JS для трапа.

Сложные виджеты: Меню, Табы, Деревья, Слайдеры

Для них применяется паттерн Roving Tabindex (блуждающий tabindex):

  1. Только один элемент виджета в таб-порядке (tabindex="0").
  2. Остальные — tabindex="-1".
  3. Стрелки (← → ↑ ↓) перемещают фокус внутри виджета, меняя tabindex у текущего и следующего элемента.
  4. Home / End — переход к первому/последнему.

Справочник паттернов: WAI-ARIA Authoring Practices Guide (APG) — «библия» разработчика доступных виджетов.

Тестирование: Как проверить качество

Тестирование клавиатурной доступности — обязательный этап CI/CD и ручного QA.

Ручное тестирование (Checklist)

  1. Отключите мышь. Используйте только Tab, Shift+Tab, Enter, Space, Esc, стрелки.
  2. Можно ли добраться до всех интерактивных элементов?
  3. Есть ли визуальный фокус на каждом шаге? (Критерий 2.4.7).
  4. Логичен ли порядок? (Сверху вниз, слева направо — 2.4.3).
  5. Нет ли ловушек? (Можно ли уйти с элемента, 2.1.2).
  6. Работают ли Skip-links?
  7. В модалках: фокус заперт? Esc закрывает? Фокус возвращается на триггер?
  8. Не перекрывают ли sticky-хедеры/футеры фокусируемый элемент? (2.4.11/2.4.12).

Автоматизированные инструменты

  • Lighthouse (Chrome DevTools): Аудит «Accessibility» -> проверки «Keyboard», «Focus», «ARIA».
  • axe DevTools (Deque): Стандарт де-факто для автоматизированного аудита (интеграция в CI).
  • WAVE (WebAIM): Визуализация ошибок структуры и порядка фокуса.
  • eslint-plugin-jsx-a11y / @typescript-eslint/eslint-plugin: Линтинг на этапе разработки.

Важно: Автотесты ловят только ~30-50% ошибок. Ручное тестирование клавиатурой и скринридерами (NVDA, JAWS, VoiceOver) обязательно.

Типичные ошибки (Anti-patterns)

  • Потеря фокуса при AJAX/SPA навигации: При смене контента без перезагрузки фокус уходит в <body>. Решение: программно фокусировать <main> или <h1> новой страницы (tabindex="-1").
  • Кастомные чекбоксы/радио без <input>: Не работают с клавиатурой и скринридерами. Используйте нативные инпуты + визуальное скрытие (visually-hidden) + кастомный CSS.
  • Ховер-эффекты без фокус-эффектов: :hover есть, :focus / :focus-visible нет.
  • Игнорирование Esc для закрытия оверлеев/тултипов.

Организация процесса в команде

Доступность — это не только задача разработчика. Как отмечено в лучших практиках, все участники разработки несут ответственность:

  • Дизайнеры: Проектируют фокус-состояния, порядок табуляции в макетах (Figma annotations), проверяют контраст фокуса.
  • QA/Тестировщики: Включают чек-лист клавиатуры в регресс, тестируют скринридерами.
  • PM/PO: Выделяют время на рефакторинг доступности, включают критерии в Definition of Done.
  • Контент-менеджеры/Редакторы: Не ломают структуру заголовков (h1-h6), не вставляют «кликабельные дивы» через визуальные редакторы.

Перспективы: WCAG 2.2 и 3.0

На текущий момент (2026 год) актуальной версией является WCAG 2.2 (опубликована 2023 г.). Она добавила критичные для клавиатуры критерии:

  • 2.4.11 Focus Not Obscured (Minimum), Level AA.
  • 2.4.12 Focus Not Obscured (Enhanced) — Level AAA.
  • 2.5.7 Dragging Movements — Level AA (альтернатива drag-and-drop для клавиатуры).
  • 2.5.8 Target Size (Minimum) — Level AA (размер цели минимум 24×24 CSS px для удобства тапа/клика, актуально для точечных устройств, но влияет на плотность фокусируемых элементов).

Разрабатывается WCAG 3.0 (Project Silver), которая сменит модель A/AA/AAA на более гибкую систему оценки (Bronze/Silver/Gold) и покроет более широкий спектр инвалидностей и технологий (VR/AR, AI).

Управление сайтом с клавиатуры — это не «фича для инвалидов», это признак качественного, профессионального фронтенда. Семантическая верстка, правильный tabindex, видимый фокус, управление фокусом в динамических интерфейсах и тестирование «без мыши» — минимальный набор, который делает веб открытым для всех. Начните с подключения eslint-plugin-jsx-a11y и пройдитесь по своему проекту клавишей Tab уже сегодня.


Статья подготовлена на основе актуальных стандартов W3C WCAG 2.1/2.2 и практик WAI-ARIA APG.

Для консультаций по аудиту доступности: @.**»>@.** | Тел: +7 () -*-

Ответственный эксперт: Иван ** (Ведущий инженер по доступности).