Доступность: основные принципы
Web accessibility (a11y) — набор практик, обеспечивающих использование веб-сайтов людьми с ограниченными возможностями: незрячими, слабовидящими, с двигательными и когнитивными нарушениями.
Зачем нужно
Около 15–20% населения имеет какое-либо ограничение. Доступный сайт охватывает всю аудиторию, а не только тех, кто использует мышь и имеет нормальное зрение. Стандарт WCAG 2.1 (Web Content Accessibility Guidelines) является обязательным требованием для государственных и корпоративных сайтов во многих странах. Хорошая a11y — это также хорошая SEO, UX и качество кода.
Где используется
- Все публичные веб-страницы
- UI-компоненты (кнопки, формы, диалоги, меню)
- Мобильные веб-приложения
- Документация и контентные сайты
Четыре принципа WCAG (POUR)
| Принцип | Суть |
|---|---|
| Perceivable (Воспринимаемость) | Контент воспринимается хотя бы одним органом чувств |
| Operable (Управляемость) | Все функции доступны с клавиатуры |
| Understandable (Понятность) | Контент и UI понятны пользователю |
| Robust (Надёжность) | Контент интерпретируется разными вспомогательными технологиями |
Ключевые практики в HTML
1. Семантическая разметка
<!-- Правильно: браузер и AT понимают роль -->
<button onclick="openMenu">Меню</button>
<nav aria-label="Основная">...</nav>
<main>...</main>
<!-- Плохо: нет роли, нет фокуса -->
<div onclick="openMenu">Меню</div>
2. Альтернативный текст
<img src="chart.png" alt="График роста продаж на 40% в 2025 году">
<img src="decorative.svg" alt=""> <!-- декор — пустой alt -->
3. Метки для полей формы
<label for="email">Электронная почта</label>
<input type="email" id="email" name="email" required autocomplete="email">
4. Управление фокусом
<!-- Skip link — первый элемент страницы -->
<a href="#main" class="skip-link">Перейти к содержимому</a>
<!-- Видимый focus-visible стиль -->
:focus-visible {
outline: 2px solid #1a73e8;
outline-offset: 2px;
}
5. ARIA — только там, где семантики HTML недостаточно
<!-- Кастомное поле со списком -->
<div role="combobox"
aria-expanded="false"
aria-haspopup="listbox"
aria-labelledby="country-label">
...
</div>
<!-- Живая область (обновляется динамически) -->
<div aria-live="polite" aria-atomic="true" id="status">
<!-- Сообщения об успехе/ошибке обновляются JS -->
</div>
6. Контраст текста
WCAG AA: минимум 4.5:1 для обычного текста, 3:1 для крупного. Подробнее — Контраст и читаемость.
7. Субтитры и транскрипты
<video controls>
<source src="video.mp4" type="video/mp4">
<track kind="subtitles" src="sub-ru.vtt" srclang="ru" label="Русский" default>
</video>
Тестирование доступности
- Tab-навигация: пройди всю страницу только Tab/Enter/Space
- Screen reader: протестируй в NVDA (Windows), VoiceOver (macOS/iOS)
- axe DevTools (расширение Chrome) — автоматический аудит
- Lighthouse в DevTools — вкладка Accessibility
Частые ошибки
| Ошибка | Почему плохо | Как правильно |
|---|---|---|
<div> как кнопка без role и tabindex |
Не фокусируется с клавиатуры | Используй <button> |
Нет alt на <img> |
Screen reader не знает, что показано | Всегда добавляй alt |
outline: none без замены |
Пользователь клавиатуры теряет фокус | Стилизуй :focus-visible |
| Низкий контраст текста | Нечитаемо при нарушении зрения | Минимум 4.5:1 |
| Только цвет как единственный сигнал | Недоступно для дальтоников | Добавляй иконки, текст, форму |
Связанные темы
- Фокус и клавиатурная навигация
- Контраст и читаемость
- alt текст -- лучшие практики
- label и fieldset
- dialog
- _MOC HTML