← Назад к вопросам
Что такое доступность интерфейсов?
1.2 Junior🔥 61 комментариев
#HTML и CSS#Браузер и сетевые технологии
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI20 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Доступность интерфейсов (Accessibility, a11y) — принцип проектирования для всех пользователей
Доступность интерфейсов (часто сокращается как a11y) — это практика разработки веб-приложений таким образом, чтобы ими могли пользоваться все люди, независимо от их физических, сенсорных или когнитивных способностей. Это не только этичный принцип, но и юридическое требование (законы WCAG, ADA).
Основные категории доступности
1. Зрительная доступность
Для пользователей с нарушениями зрения (слепота, низкое зрение, дальтонизм):
<!-- ❌ Плохо —нет alt-текста -->
<img src="user.png">
<!-- ✅ Хорошо — описательный alt -->
<img src="user.png" alt="Фото профиля пользователя John Doe">
<!-- ❌ Плохо — недостаточный контраст -->
<p style="color: #999; background: #f0f0f0;">Важный текст</p>
<!-- ✅ Хорошо — контраст не менее 4.5:1 -->
<p style="color: #222; background: #fff;">Важный текст</p>
2. Моторная доступность
Для пользователей, которые не могут использовать мышь:
<!-- ❌ Плохо — невозможно активировать клавиатурой -->
<div onclick="handleClick()" style="cursor: pointer;">Нажми</div>
<!-- ✅ Хорошо — семантический элемент -->
<button onclick="handleClick()">Нажми</button>
<!-- ❌ Плохо — нет видимого фокуса -->
<button>Кнопка</button>
<!-- ✅ Хорошо — виден фокус -->
<button style="outline: 2px solid blue; outline-offset: 2px;">Кнопка</button>
3. Слуховая доступность
Для пользователей с нарушениями слуха:
<!-- ❌ Плохо — видео без субтитров -->
<video src="tutorial.mp4"></video>
<!-- ✅ Хорошо — с track для субтитров -->
<video src="tutorial.mp4">
<track kind="captions" src="subtitles.vtt" srclang="ru" label="Русский">
</video>
4. Когнитивная доступность
Для пользователей с когнитивными нарушениями:
<!-- ✅ Хорошо —простой и понятный язык -->
<!-- ✅ Логичная структура с заголовками -->
<h1>Основная информация</h1>
<section>
<h2>Раздел 1</h2>
<p>Описание в два предложения.</p>
</section>
<!-- ✅ Последовательная навигация -->
<!-- ✅ Ясные сообщения об ошибках -->
ARIA (Accessible Rich Internet Applications)
Добавляет семантику для скринридеров:
<!-- ❌ Плохо — без роли -->
<div class="toggle">Показать/скрыть</div>
<!-- ✅ Хорошо — с ARIA атрибутами -->
<button
aria-pressed="false"
aria-label="Показать детали"
onclick="this.setAttribute('aria-pressed', 'true')">
Показать/скрыть
</button>
<!-- Другие важные ARIA атрибуты -->
<div role="alert" aria-live="polite">Ошибка при загрузке</div>
<nav aria-label="Основная навигация"></nav>
<form aria-describedby="error-message"></form>
<div id="error-message">Заполните обязательные поля</div>
Семантический HTML
Используйте правильные HTML элементы:
<!-- ❌ Плохо — неправильная семантика -->
<div class="button" onclick="submit()">Отправить</div>
<div class="heading">Заголовок</div>
<div class="list-item">Пункт</div>
<!-- ✅ Хорошо — семантические элементы -->
<button>Отправить</button>
<h1>Заголовок</h1>
<li>Пункт</li>
<!-- Структурные элементы -->
<header>Шапка</header>
<nav>Навигация</nav>
<main>Основной контент</main>
<article>Статья</article>
<aside>Боковая панель</aside>
<footer>Подвал</footer>
Практические примеры для React
// ✅ Хорошо — доступная форма
function LoginForm() {
const [email, setEmail] = useState('');
const [error, setError] = useState('');
const inputRef = useRef(null);
const handleSubmit = (e) => {
e.preventDefault();
if (!email) {
setError('Email обязателен');
inputRef.current?.focus();
}
};
return (
<form onSubmit={handleSubmit}>
<label htmlFor="email">Email</label>
<input
id="email"
ref={inputRef}
type="email"
value={email}
onChange={(e) => setEmail(e.target.value)}
aria-invalid={error ? 'true' : 'false'}
aria-describedby={error ? 'error-message' : undefined}
/>
{error && <div id="error-message" role="alert">{error}</div>}
<button type="submit">Войти</button>
</form>
);
}
// ✅ Хорошо — доступный модальный диалог
function Modal({ isOpen, title, onClose, children }) {
return (
<dialog open={isOpen} aria-labelledby="dialog-title">
<h2 id="dialog-title">{title}</h2>
{children}
<button onClick={onClose} aria-label="Закрыть диалог">✕</button>
</dialog>
);
}
Инструменты тестирования
- Lighthouse — встроен в Chrome DevTools
- WAVE — расширение браузера для проверки доступности
- axe DevTools — мощный инструмент для поиска проблем
- Screen readers — NVDA (бесплатно), JAWS (платно)
- Keyboard navigation — используйте Tab, Enter, Arrow keys
WCAG 2.1 стандарты
- A — базовый уровень доступности
- AA — рекомендуемый уровень (контраст 4.5:1, размер текста ≥14px)
- AAA — усиленный уровень (контраст 7:1)
Частые ошибки
- Игнорирование клавиатурной навигации
- Отсутствие alt-текста на изображениях
- Недостаточный контраст цветов
- Отсутствие labels на input полях
- Использование только цвета для передачи информации
- Автоматическое проигрывание аудио/видео
- Малый размер кликаемых элементов (менее 44x44px)
Доступность — не дополнительная функция, а обязательная часть качественной разработки.