advanced

ARIA

Применяйте ARIA roles, states и properties только когда native HTML недостаточен и поведение виджета совпадает с объявляемой семантикой.

ARIA добавляет roles, states и properties, когда native HTML не выражает виджет. **Первое правило ARIA: не используйте ARIA, если работает native HTML.** ARIA описывает; не реализует keyboard, focus и обработку событий.

					<!-- Предпочтительно native -->
<select>...</select>

<!-- Кастомный listbox нуждается в role, keyboard и state -->
<ul role="listbox" aria-activedescendant="opt-2">
  <li id="opt-1" role="option">One</li>
  <li id="opt-2" role="option" aria-selected="true">Two</li>
</ul>
				

| Ошибка | Исправление | |--------|-------------| | `role="button"` на div без клавиш | `<button>` или Space/Enter | | Role не совпадает с поведением | Паттерн APG для tabs, combobox, dialog | | `aria-hidden` на сфокусированном потомке | Ломает focus и объявления |

Для сложных виджетов — WAI-ARIA Authoring Practices; вместе с тестами, не только атрибутами.

На интервью: role vs native; `aria-expanded`, `aria-controls`, `aria-activedescendant`; почему `aria-label` перекрывает видимый текст.

Типовые ошибки: roles без поведения; лишний ARIA на native; спам live regions; путаница menu и listbox.

Компромисс — быстрый кастомный UI против полной ответственности за accessibility behavior.

Чеклист:

  • Сначала native HTML; ARIA только при необходимости.
  • Полный keyboard и focus для custom roles.
  • APG для составных виджетов.
  • Проверка accessibility tree, не только ESLint plugins.