Доступность (accessibility): как сделать сайт удобным для всех пользователей

Сделать сайт доступным значит обеспечить понятную структуру, управление с клавиатуры, корректный фокус, читаемый контент и семантическую разметку, чтобы интерфейс одинаково работал для пользователей с разными возможностями и устройствами. Начните с быстрого аудита, затем исправьте навигацию и формы, добавьте текстовые альтернативы и закрепите процесс тестами в CI.

Коротко о приоритетах доступности

  • Дайте пройти весь путь без мыши: клавиатура, видимый фокус, логичный порядок.
  • Делайте интерфейс предсказуемым: семантические элементы, корректные заголовки и области страницы.
  • Пишите понятные подписи и сообщения об ошибках в формах, без зависимости от цвета.
  • Добавляйте текстовые альтернативы: alt у изображений, подписи у контролов, расшифровки для медиа.
  • Проверяйте контраст и масштабирование, чтобы текст оставался читаемым при увеличении.
  • Закрепляйте качество: сочетайте авто-проверки и сценарии ручного тестирования перед релизом.

Аудит доступности: методика и набор инструментов

Начинайте с аудит доступности сайта, если продукт уже в проде, есть жалобы пользователей, планируется редизайн или нужно снизить риск регрессий при активной разработке. Методика работает и для лендинга, и для сложных кабинетов: вы быстро находите блокирующие дефекты и превращаете их в задачи.

Минимальный набор инструментов: браузерные DevTools, Lighthouse, axe DevTools (расширение), WAVE, скринридер (NVDA/VoiceOver), эмуляция клавиатурной навигации (Tab/Shift+Tab/Enter/Space/стрелки), проверка контраста (любая валидная утилита/плагин).

Когда не стоит начинать с полноценного аудита:

  • если нет доступа к дизайну/коду/тестовому стенду и нельзя фиксировать и проверять правки;
  • если команда не готова заводить баги и выделять время на исправления (лучше стартовать с короткого скрининга и чек-листа релизов);
  • если интерфейс в стадии прототипа - выгоднее заложить требования в дизайн-систему, чем аудировать черновик.

Если нужен внешний взгляд и разбор приоритетов, это обычно оформляют как консультация по доступности сайта с разбором ключевых сценариев и формированием бэклога.

Проектирование интерфейсов с учётом разных возможностей

Для устойчивого результата доступность должна быть не последним этапом, а частью требований. Это особенно важно, если планируется внедрение доступности WCAG на сайте и нужно удерживать единый уровень качества на всех страницах.

Что подготовить заранее

  • Сценарии: 5-10 критичных пользовательских потоков (поиск, авторизация, оплата, заявка, личный кабинет) и состояния (ошибка, пусто, загрузка).
  • Требования: базовые критерии: управление с клавиатуры, видимый фокус, семантика, подписи, ошибки, контраст, альтернативы медиа.
  • Доступы: тестовый стенд, возможность включить фичи, доступ к дизайн-макетам и компонентам UI.
  • Компоненты: инвентаризация дизайн-системы (кнопки, поля, модальные окна, меню, табы), чтобы чинить один компонент вместо сотни страниц.
  • Правила контента: гайд для редакторов (заголовки, списки, ссылки, alt, таблицы, вложения).

Разделение работ на быстрые правки и глубокие улучшения

  • Быстрые исправления: видимый фокус, корректные , исправление порядка Tab, alt для ключевых изображений, явные сообщения об ошибках.
  • Глубокие улучшения: переработка компонентов (модалки/меню/табы), единые ARIA-паттерны, контракт на доступность в дизайн-системе, регресс-тесты в CI.

Если вы внедряете требования системно, это напрямую влияет на разработка доступного сайта для людей с инвалидностью: меньше особых случаев, больше стабильных паттернов для всех.

Навигация и управление: клавиатурная доступность и фокусировка

Ниже - практический алгоритм, который обычно даёт самый быстрый прирост качества: вы убираете блокирующие проблемы, из-за которых пользователь не может дойти до цели без мыши.

  1. Пройдите основные сценарии только клавиатурой. Откройте главные страницы и выполните целевые действия с Tab/Shift+Tab, Enter и Space. Фиксируйте места, где фокус теряется, зацикливается или невозможно активировать элемент.

    • Проверьте: шапку, меню, поиск, формы, модалки, фильтры, пагинацию.
    • Отмечайте блокеры: невозможно закрыть модалку, нельзя попасть в поле, невозможно отправить форму.
  2. Сделайте фокус всегда видимым. У интерактивных элементов должен быть заметный фокус в любых темах/состояниях, включая кастомные кнопки и ссылки. Не убирайте outline без замены на равноценный стиль.

    • Проверьте: :focus и :focus-visible, контрастность обводки, видимость на тёмных/пёстрых фонах.
  3. Нормализуйте порядок обхода (Tab order). Порядок фокуса должен соответствовать визуальной логике и чтению сверху вниз. Не используйте tabindex больше 0 для пересборки навигации - это быстро ломается.

    • Если элемент скрыт - он не должен попадать в Tab.
    • Сначала чините DOM-порядок и семантику, потом точечно применяйте tabindex="0" для несемантических, но интерактивных элементов (лучше заменить на кнопку/ссылку).
  4. Управляйте фокусом в модальных окнах и динамических блоках. При открытии модалки переводите фокус внутрь, ограничивайте фокус рамками модалки (focus trap), при закрытии возвращайте фокус на элемент-инициатор.

    • Закрытие по Escape должно работать и не конфликтовать с вложенными компонентами.
    • Фоновый контент не должен быть доступен для Tab, пока модалка открыта.
  5. Проверьте элементы со сложным управлением. Меню, табы, кастомные селекты, слайдеры, аккордеоны должны иметь предсказуемое управление и роли. Если компонент не проходит проверку - замените на нативный или на библиотеку с доказанной доступностью.

    • Не делайте кликабельные div/span без роли и клавиатурных обработчиков - лучше <button> или <a>.

Быстрый режим

  1. Пройдите 3 ключевых сценария только Tab/Enter/Escape и выпишите блокеры.
  2. Включите заметный :focus-visible для всех интерактивных элементов.
  3. Исправьте модалки: фокус внутрь, ловушка фокуса, возврат фокуса назад.
  4. Замените кликабельные div на нативные элементы (button/a).
  5. Повторите проход и убедитесь, что путь до цели проходим без мыши.

Контент и мультимедиа: контраст, структура и текстовые альтернативы

Проверяйте результат после правок по чек-листу ниже. Он подходит и редакторам, и разработчикам: помогает не пропускать простые дефекты, которые массово размножаются на страницах.

  • Заголовки размечены иерархично (без прыжков уровня), списки - через <ul>/<ol>, а не переносами строк.
  • Ссылки различимы не только цветом: есть подчёркивание/стиль, а текст ссылки описывает назначение (не просто "тут").
  • У изображений есть корректный alt: информативный - описывает смысл, декоративный - пустой alt="".
  • Видео имеет субтитры, а для важного аудио/видео есть текстовая расшифровка или краткое резюме рядом.
  • Контраст текста/иконок/границ контролов достаточен для чтения и распознавания состояний (особенно ошибка и disabled).
  • Сообщения об ошибках не завязаны только на цвет и находятся рядом с полем; указывается, что исправить.
  • Текст сохраняет читабельность при увеличении масштаба браузера; элементы не перекрываются и не уезжают.
  • Таблицы данных имеют заголовки столбцов/строк и читаются линейно (без таблиц для вёрстки).

Код и семантика: правильная разметка, роли и ARIA-паттерны

Ниже - ошибки, которые чаще всего ломают доступность сильнее, чем косметика. Исправляйте их в первую очередь на уровне компонентов.

  • Кликабельные элементы сделаны как div/span без семантики: нет роли, нет управления с клавиатуры, нет состояния.
  • Кнопка визуально есть, но в коде это ссылка (или наоборот), из-за чего ломается ожидаемое поведение и озвучивание.
  • Нет связки и id у полей, или подпись реализована плейсхолдером вместо label.
  • ARIA используется для галочки: добавлены роли, но не обновляются состояния (aria-expanded, aria-selected, aria-checked).
  • Дублирование: одновременно нативная семантика и конфликтующие ARIA-атрибуты (лучше опираться на нативные элементы и добавлять ARIA только при необходимости).
  • Неправильные имена: кнопки с иконками без доступного имени (нет текста, aria-label не задан).
  • Динамические изменения без оповещения: важные обновления интерфейса происходят молча (для таких случаев продумывают паттерны уведомлений и, при необходимости, live-области).
  • Скрытие контента только через CSS, но он остаётся фокусируемым или читаемым скринридером в неподходящий момент.
  • Слишком агрессивный tabindex: перенумерация фокуса ломает поддержку и усложняет регрессии.

Если вы закупаете или оказываете услуги accessibility для сайта, фиксируйте эти пункты в Definition of Done для компонентов: так правки не будут откатываться в следующих релизах.

Тестирование и внедрение: сочетание автоматизации и пользовательских сценариев

Выбирайте комбинацию подходов под стадию продукта и ограничения команды. Ниже - рабочие альтернативы, которые можно комбинировать.

Вариант 1: Автопроверки в CI для регрессий

Уместно, когда есть компонентные тесты/стабильная вёрстка и частые релизы. Подключайте lint-правила и автоматические проверки страниц/компонентов, чтобы ловить типовые ошибки (label, предупреждения по контрасту, роли, фокусируемость).

Вариант 2: Ручной прогон критичных сценариев по чек-листу

Уместно для небольших команд и быстрого результата. Назначьте 5-10 сценариев и прогоняйте их перед релизом: клавиатура, формы, модалки, ошибки, масштабирование.

Вариант 3: Сессии со скринридером для ключевых экранов

Уместно, когда продукт ориентирован на широкий круг пользователей и есть сложные компоненты. Достаточно регулярно проверять основные экраны NVDA/VoiceOver и фиксировать ломающие места (названия, порядок чтения, состояния).

Вариант 4: Внешний аудит и бэклог плюс сопровождение

Уместно, когда нужно быстро выстроить план работ и не распыляться. Внешняя команда делает аудит, приоритизирует задачи, помогает с внедрением и проверяет исправления в несколько итераций.

Чёткие ответы на типовые вопросы разработчиков

С чего начать, если времени мало?

С клавиатурного прогона ключевых сценариев и исправления фокуса/модалок/форм. Эти проблемы чаще всего блокируют пользователя полностью.

Можно ли закрыть требования доступности только Lighthouse?

Нет: автоматизация находит часть ошибок, но не проверяет логику фокуса, качество текстов, предсказуемость управления и многие сценарии модалок/виджетов.

Когда нужен ARIA, а когда вредно?

Доступность (accessibility): как сделать сайт удобным для всех пользователей - иллюстрация

ARIA нужна для сложных кастомных компонентов, где нативной семантики недостаточно. Вредно использовать ARIA вместо нативных элементов или добавлять роли, не поддерживая состояния.

Как правильно подписывать поля формы?

Используйте , связанный с полем через for/id. Плейсхолдер не заменяет подпись и не должен быть единственным источником смысла.

Что делать с иконками без текста?

Доступность (accessibility): как сделать сайт удобным для всех пользователей - иллюстрация

Дайте элементу доступное имя: видимый текст или aria-label (если текста нет). Декоративные иконки скрывайте от скринридера.

Какие компоненты чаще всего ломают доступность?

Модальные окна, кастомные селекты, выпадающие меню, табы, карусели и валидация форм. Начинайте с них на уровне дизайн-системы.

Как убедиться, что исправления не откатятся?

Закрепите правила в код-ревью и DoD, добавьте авто-проверки и короткий ручной регресс по сценариям перед релизом.

Прокрутить вверх