ARIA (Accessible Rich Internet Applications) представляет собой набор специальных атрибутов, расширяющих стандартную семантику HTML и позволяющих улучшить доступность интерфейсов для вспомогательных технологий. Основная цель ARIA заключается в передаче дополнительной информации о состоянии, роли и свойствах интерфейсных элементов, которые невозможно выразить стандартными HTML-средствами.
Ключевая идея использования ARIA состоит в том, что эти атрибуты не
заменяют нативную семантику HTML, а дополняют её. Приоритет всегда
остаётся за стандартными элементами, такими как
<button>, <input>,
<nav>, <header>, поскольку они уже
обладают встроенной доступностью.
ARIA следует правилу: если можно решить задачу с помощью HTML — ARIA не требуется.
Атрибут role определяет назначение элемента в структуре
интерфейса. Он сообщает вспомогательным технологиям, как именно следует
интерпретировать узел DOM.
Структурные роли
banner — верхняя часть страницыnavigation — навигационный блокmain — основной контентcontentinfo — футерИнтерактивные роли
button — элемент, ведущий себя как кнопкаcheckbox — переключатель состоянияswitch — тумблерtab, tabpanel — вкладки интерфейсаКомпозитные роли
listbox — список выбораgrid — таблица с интерактивными ячейкамиtree — древовидная структураПример применения:
<div role="button" tabindex="0">
Отправить
</div>
Однако предпочтительным остаётся использование:
<button>Отправить</button>
Используется для задания текстовой подписи, когда визуальный текст отсутствует или недостаточен.
<button aria-label="Закрыть окно">
×
</button>
Типичные сценарии:
Связывает элемент с другим элементом, содержащим текстовое описание.
<h2 id="title">Настройки профиля</h2>
<div role="region" aria-labelledby="title">
...
</div>
В отличие от aria-label, здесь используется уже
существующий текст, что повышает консистентность интерфейса.
ARIA предоставляет набор атрибутов для описания динамических состояний элементов.
Отражает раскрытие/сворачивание компонента.
<button aria-expanded="false" aria-controls="menu">
Меню
</button>
<ul id="menu" hidden>
<li>Пункт 1</li>
</ul>
При изменении состояния через JavaScript значение обновляется:
button.setAttribute("aria-expanded", "true");
menu.hidden = false;
Управляет видимостью элемента для вспомогательных технологий.
<div aria-hidden="true">
Декоративный контент
</div>
Важно: aria-hidden="true" не скрывает элемент
визуально.
Описывает неактивное состояние элемента.
<button aria-disabled="true">Сохранить</button>
В отличие от disabled, не всегда блокирует
взаимодействие, поэтому требует дополнительной логики в JavaScript.
Используется для чекбоксов и переключателей.
<div role="checkbox" aria-checked="false" tabindex="0"></div>
Состояния:
truefalsemixedАтрибут aria-live определяет, как изменения содержимого
будут озвучиваться экранными читалками.
off — обновления игнорируютсяpolite — обновления объявляются после завершения
текущей речиassertive — прерывают текущую речьПример:
<div aria-live="polite">
Сообщение отправлено
</div>
Использование в Jav * aScript:
status.textContent = "Файл загружен";
Определяет, должно ли обновление восприниматься как целое.
<div aria-live="polite" aria-atomic="true">
Прогресс: 70%
</div>
При true экранный чтец озвучивает весь блок целиком.
Контролирует, какие типы изменений отслеживаются:
additionsremovalstextall<div aria-live="polite" aria-relevant="additions text"></div>
Указывает, каким элементом управляет текущий контрол.
<button aria-controls="sidebar">
Открыть
</button>
<aside id="sidebar"></aside>
Добавляет дополнительное описание элемента.
<input aria-describedby="hint">
<span id="hint">Минимум 8 символов</span>
Используется для обозначения активного элемента в наборе.
<nav>
<a href="/" aria-current="page">Главная</a>
<a href="/about">О нас</a>
</nav>
Возможные значения:
pagesteplocationtrue<input type="text" aria-required="true">
<input type="email" aria-invalid="true">
Используется совместно с визуальной индикацией ошибок и текстовыми сообщениями.
Отражает состояние загрузки или обработки.
<div aria-busy="true">
Загружается...
</div>
При завершении процесса:
container.setAttribute("aria-busy", "false");
ARIA-атрибуты часто изменяются динамически в ответ на действия пользователя.
function toggleMenu() {
const expanded = button.getAttribute("aria-expanded") === "true";
button.setAttribute("aria-expanded", String(!expanded));
menu.hidden = expanded;
}
Обновление состояния должно быть синхронизировано с DOM, иначе возникает рассинхронизация между визуальным интерфейсом и его семантическим представлением.
Использование ARIA часто приводит к ухудшению доступности при неправильной интеграции.
<div role="button"></div>
вместо
<button></button>
ARIA-роль не добавляет интерактивности автоматически.
<button aria-expanded="true"></button>
<!-- при этом меню скрыто -->
Скрытие значимого контента приводит к потере доступности.
В динамических интерфейсах ARIA становится частью состояния приложения. В компонентах, построенных на чистом JavaScript или фреймворках, состояние UI синхронизируется с набором атрибутов:
aria-hidden,
aria-modalaria-expandedaria-livearia-invalid, aria-requiredСостояние интерфейса должно обновляться атомарно, чтобы исключить промежуточные неконсистентные состояния.
Интерфейсы высокой сложности (таблицы, деревья, вкладки) требуют комбинирования ролей и состояний.
Пример вкладочного интерфейса:
<div role="tablist">
<button role="tab" aria-selected="true">Вкладка 1</button>
<button role="tab" aria-selected="false">Вкладка 2</button>
</div>
<div role="tabpanel">Содержимое 1</div>
Синхронизация состояния вкладок должна поддерживать:
aria-selectedПри построении интерфейса учитывается приоритет источников семантики:
Несоблюдение этого порядка приводит к конфликтам интерпретации и снижению качества взаимодействия с ассистивными технологиями.