В интерфейсах, где важна доступность, текстовое содержимое элементов
должно быть не только визуально понятно, но и корректно
интерпретироваться вспомогательными технологиями: экранными дикторами,
брайлевскими дисплеями и системами голосового управления. Стандарт
WAI-ARIA предоставляет атрибуты, позволяющие уточнять
смысл и контекст элементов. Одним из ключевых механизмов является
атрибут aria-describedby, предназначенный
для связывания элемента с дополнительным описанием.
ARIA-описание расширяет информацию, которую получает пользователь
вспомогательных технологий. В отличие от краткой подписи
(label), описание обычно содержит пояснение,
предупреждение, инструкцию или уточняющую информацию.
Пример HTML:
<input type="password" id="password" aria-describedby="password-hint">
<p id="password-hint">
Пароль должен содержать не менее 8 символов и включать цифры.
</p>
В этом случае экранный диктор читает не только сам элемент ввода, но и связанный текст-пояснение.
ARIA предусматривает несколько способов связывания элементов с текстом:
| Атрибут | Назначение |
|---|---|
aria-labelledby |
определяет основной текстовый заголовок элемента |
aria-describedby |
добавляет дополнительное пояснение |
Ключевое различие заключается в семантике:
aria-labelledby формирует имя
элемента.aria-describedby добавляет описание,
которое читается после имени.Пример комбинирования:
<label id="email-label" for="email">Email</label>
<input id="email" aria-labelledby="email-label" aria-describedby="email-help">
<span id="email-help">Используется для восстановления доступа.</span>
Последовательность чтения для экранного диктора:
Атрибут принимает одно или несколько значений, представляющих собой идентификаторы элементов.
<input aria-describedby="desc1 desc2">
В этом случае текст из #desc1 и #desc2
объединяется.
Порядок идентификаторов в атрибуте определяет порядок чтения описаний.
<input aria-describedby="warning hint">
Сначала будет прочитан текст warning, затем
hint.
ARIA допускает использование визуально скрытых элементов в качестве описаний. Они могут быть скрыты CSS, но доступны для вспомогательных технологий.
Пример:
<span id="visually-hidden-info" class="sr-only">
Поле обязательно для заполнения.
</span>
<input aria-describedby="visually-hidden-info">
Типичный CSS для скрытия:
.sr-only {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
}
Современные веб-приложения активно используют JavaScript, модальные окна, всплывающие подсказки, динамическую валидацию форм. В таких условиях возникают сложности:
Например, при появлении ошибки валидации требуется динамически
добавить текст ошибки в aria-describedby.
<input id="username">
<span id="username-error">Имя пользователя уже занято</span>
input.setAttribute(
"aria-describedby",
"username-error"
);
При исправлении ошибки описание должно быть удалено. Вручную отслеживать такие изменения сложно, особенно в больших интерфейсах.
Библиотека ally.js предоставляет набор инструментов для работы с доступностью интерфейсов. Она упрощает управление фокусом, ARIA-атрибутами и поведением элементов.
Среди возможностей:
При работе с aria-describedby библиотека помогает
корректно связывать элементы и поддерживать стабильную структуру
описаний.
В интерфейсах с динамическим поведением ally.js используется для аккуратного управления атрибутами ARIA.
Пример добавления описания:
var input = document.getElementById('username');
var description = document.getElementById('username-help');
input.setAttribute('aria-describedby', description.id);
Хотя это возможно стандартными средствами DOM, ally.js помогает избежать распространённых ошибок:
В реальных интерфейсах один элемент может иметь несколько типов описаний:
Пример:
<input
id="password"
aria-describedby="password-hint password-warning password-error"
>
Описание:
<span id="password-hint">Минимум 8 символов.</span>
<span id="password-warning">Не используйте личные данные.</span>
<span id="password-error">Пароль слишком короткий.</span>
ally.js позволяет аккуратно управлять списком описаний, добавляя или удаляя отдельные элементы без перезаписи всей строки.
Логика управления:
Пример:
function addDescription(element, id) {
const existing = element.getAttribute('aria-describedby') || '';
const ids = existing.split(/\s+/).filter(Boolean);
if (!ids.includes(id)) {
ids.push(id);
}
element.setAttribute('aria-describedby', ids.join(' '));
}
ARIA-описания активно применяются в системах валидации форм.
При ошибке поле связывается с элементом ошибки.
<input id="email" aria-describedby="email-error">
<span id="email-error" role="alert">
Неверный формат email.
</span>
Атрибут role="alert" обеспечивает немедленное
озвучивание сообщения экранным диктором.
Типичный сценарий:
aria-describedby обновляетсяARIA-описания часто используются для tooltip-подсказок.
Пример:
<button aria-describedby="delete-help">
Удалить
</button>
<div id="delete-help">
Элемент будет удалён без возможности восстановления.
</div>
Даже если подсказка появляется только при наведении, экранный диктор может прочитать описание.
Это особенно важно для:
В модальных окнах ARIA-описание используется для передачи контекста.
Пример:
<div role="dialog" aria-describedby="dialog-desc">
<p id="dialog-desc">
Подтвердите удаление файла.
</p>
</div>
Экранный диктор при фокусе внутри окна сообщает не только тип
элемента (dialog), но и его описание.
ally.js часто применяется совместно с такими структурами, поскольку библиотека умеет:
Несмотря на гибкость, атрибут имеет ряд особенностей:
Описание не заменяет label
Поле ввода должно иметь явную подпись.
Неправильно:
<input aria-describedby="username-help">
Правильно:
<label for="username">Имя пользователя</label>
<input id="username" aria-describedby="username-help">
Описание не должно содержать критически важной информации
Некоторые пользователи могут пропускать длинные описания.
Избыточные описания ухудшают восприятие
Экранный диктор последовательно читает все связанные элементы.
Слишком длинные описания делают интерфейс тяжёлым для восприятия.
Использование aria-describedby оправдано в следующих ситуациях:
Нежелательные сценарии:
После добавления ARIA-описаний интерфейс необходимо проверять:
Типичные проблемы:
ally.js помогает минимизировать такие ошибки благодаря системному подходу к управлению доступностью элементов.
ARIA-описания выполняют важную роль в построении семантического слоя интерфейса. Они не влияют на визуальное отображение, но формируют дополнительную информационную структуру для вспомогательных технологий.
В сложных веб-приложениях с большим количеством интерактивных
элементов aria-describedby становится механизмом передачи
контекста:
Интеграция с библиотеками вроде ally.js позволяет управлять этими связями программно, поддерживая согласованность интерфейса даже при высокой динамике DOM и сложных сценариях взаимодействия.