ARIA (Accessible Rich Internet Applications) — набор атрибутов и ролей, предназначенных для передачи семантики интерфейса вспомогательным технологиям: экранным читалкам, брайлевским дисплеям, голосовому управлению. В Preact, как и в React-подобных библиотеках, ARIA используется напрямую через JSX и тесно связано с виртуальным DOM и механизмом обновления компонентов.
В отличие от стандартных HTML-элементов с уже заданной семантикой, кастомные компоненты и сложные интерактивные элементы (выпадающие списки, вкладки, модальные окна) требуют явного описания поведения и состояния через ARIA.
JSX в Preact поддерживает ARIA-атрибуты без преобразований. Имена атрибутов записываются в kebab-case, как в обычном HTML.
<button aria-pressed={isActive}>
Фильтр
</button>
Особенности работы:
true /
falseARIA-роли (role) описывают назначение элемента, если оно
не выражено нативной семантикой HTML.
Пример использования роли кнопки на div:
<div role="button" tabIndex={0} aria-pressed={pressed}>
Переключатель
</div>
Ключевые моменты:
aria-label и
aria-labelledbyИспользуются для задания текстового описания элемента.
<input aria-label="Поиск" />
<label id="searchLabel">Поиск</label>
<input aria-labelledby="searchLabel" />
Различия:
aria-label — прямое текстовое описаниеaria-labelledby — ссылка на существующий текст в
DOMaria-hiddenИсключает элемент из доступного дерева.
<div aria-hidden={isHidden}>
Декоративный элемент
</div>
Применение:
aria-expandedОписывает состояние раскрытия.
<button aria-expanded={open}>
Меню
</button>
Часто используется совместно с:
aria-controlsaria-haspopuparia-liveСообщает о динамически обновляемом контенте.
<div aria-live="polite">
{statusMessage}
</div>
Значения:
polite — озвучивание при паузеassertive — немедленное озвучиваниеВ Preact обновление содержимого автоматически инициирует оповещение вспомогательных технологий.
ARIA не управляет фокусом напрямую, но тесно с ним связана. В Preact
фокус обычно контролируется через ref.
const inputRef = useRef(null);
useEffect(() => {
inputRef.current.focus();
}, []);
Комбинация фокуса и ARIA:
tabIndex={0} — включение элемента в порядок
табуляцииtabIndex={-1} — программный фокус без табуляцииdialog, menu,
listbox) для логичной навигацииПример модального окна с ARIA:
<div
role="dialog"
aria-modal="true"
aria-labelledby="dialogTitle"
>
<h2 id="dialogTitle">Настройки</h2>
</div>
Критически важные аспекты:
aria-hidden)<div role="tablist">
<button role="tab" aria-selected={active === 0}>
Профиль
</button>
<button role="tab" aria-selected={active === 1}>
Настройки
</button>
</div>
Дополнительно используются:
aria-controlsrole="tabpanel"<button aria-haspopup="menu" aria-expanded={open}>
Опции
</button>
<ul role="menu">
<li role="menuitem">Редактировать</li>
<li role="menuitem">Удалить</li>
</ul>
В Preact состояние компонента напрямую определяет значения ARIA-атрибутов.
const [checked, setChecked] = useState(false);
<div
role="checkbox"
aria-checked={checked}
onCl ick={() => setChecked(!checked)}
/>
Преимущества:
role="button" на
<button>)aria-hidden к интерактивным элементам с
фокусомaria-label, не отражающие смыслПрактика включает:
ARIA в Preact не требует специальных библиотек или обёрток. Корректное использование стандартных атрибутов и ролей в JSX обеспечивает полноценную доступность без усложнения архитектуры приложения.