Учебник Веб-доступность (a11y) для начинающих
Доступность — не «галочка для галочки», а качество интерфейса: как сделать сайт пригодным для всех, включая клавиатуру и скринридеры.
Курс «Веб-доступность (a11y): сайты для всех» состоит из 6 разделов и 17 уроков: Зачем доступность, Семантика и структура, Клавиатура и фокус, ARIA, Контент, формы, цвет и Тестирование и внедрение. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Зачем доступность
- Кому нужна доступность
Клавиатурные пользователи, слабовидящие, дальтоники, моторные и временные ограничения — кто на самом деле выигрывает от доступного сайта и при чём тут SEO.
- WCAG и уровни A/AA/AAA
Что такое WCAG, как устроены четыре принципа POUR, чем отличаются уровни A, AA и AAA и почему на практике целятся именно в AA.
- С чего начать проверку
Три бесплатных шага аудита доступности: пройти сайт клавиатурой, прогнать axe и Lighthouse, включить скринридер. Почему автопроверка ловит не всё.
- Кому нужна доступность
2 Семантика и структура
- Семантические теги вместо div
Почему div с onclick — не кнопка, а h4 — не «мелкий заголовок». Каркас страницы на header/nav/main/footer и иерархия h1–h6 с примерами «плохо/хорошо».
- Кнопка или ссылка: главная ошибка
Ссылка ведёт, кнопка действует. Что ломается при подмене: Enter и Space, открытие в новой вкладке, контекстное меню, история браузера — и как это чинить.
- Ориентиры, заголовки и skip-link
Как скринридер навигирует по landmarks и заголовкам, зачем нужна ссылка «перейти к содержимому» и почему порядок чтения страницы задаёт DOM, а не CSS.
- Семантические теги вместо div
3 Клавиатура и фокус
- Фокус: видимость и порядок
Почему outline: none ломает сайт, как работает :focus-visible, кто задаёт порядок обхода по Tab и что означают tabindex 0, -1 и положительные значения.
- Ловушка фокуса в модальных окнах
Как сделать доступную модалку: фокус внутрь при открытии, цикл Tab по диалогу, закрытие по Escape, возврат фокуса на кнопку-инициатор и inert для фона.
- Доступные интерактивные компоненты
Меню, табы и аккордеон с клавиатуры: какие клавиши обязаны работать, что такое roving tabindex, когда нужен ARIA, а когда хватает button, details и select.
- Фокус: видимость и порядок
4 ARIA
- Пять правил ARIA (и главное из них)
Что такое ARIA, зачем нужны роли, состояния и свойства, чем aria-label отличается от aria-labelledby и почему первое правило ARIA — не использовать ARIA.
- Живые области (aria-live)
Как сообщить скринридеру об изменении без перезагрузки страницы: aria-live polite и assertive, role=status и role=alert, тосты, ошибки формы и счётчики результатов.
- Как ARIA всё ломает
Антипаттерны ARIA: role=button на div без клавиатуры, aria-hidden на фокусируемом элементе, дублирование ролей и врущие состояния. Почему плохая ARIA хуже, чем никакой.
- Пять правил ARIA (и главное из них)
5 Контент, формы, цвет
- Доступные формы
Как сделать форму доступной: label и связь с полем, aria-describedby, обязательность, сообщения об ошибках с role="alert", fieldset и legend.
- Альтернативный текст
Как писать alt: информативные картинки, декоративные с alt="", графики и схемы, иконки-кнопки. Почему alt="изображение" хуже, чем ничего.
- Цвет, контраст и движение
Контраст 4.5:1 по WCAG, почему нельзя передавать смысл только цветом, и как prefers-reduced-motion спасает от анимаций, вызывающих тошноту.
- Доступные формы
6 Тестирование и внедрение
- Тестируем: клавиатура, скринридер, автопроверка
Сценарий ручной проверки доступности с клавиатуры, базовые команды NVDA и VoiceOver, axe DevTools и Lighthouse — и честный список того, что автотест не поймает.
- Как внедрить доступность в процесс
Доступность как процесс: чек-лист в Definition of Done, eslint-plugin-jsx-a11y и axe в CI, аргументы для бизнеса и приоритизация аудита существующего сайта.
- Тестируем: клавиатура, скринридер, автопроверка