Кратко
СкопированоARIA (Accessible Rich Internet Applications) — это набор дополнительных атрибутов, которые расширяют возможности HTML, SVG и других языков для создания более доступных интерфейсов.
ARIA помогает повысить уровень доступности элементов или сделать статичную страницу динамическим веб-приложением для пользователей вспомогательных технологий. С помощью ARIA-разметки можно улучшить доступность интерактивных элементов, связать элементы друг с другом, указать в каком состоянии они находятся, отметить изменения на странице или описать структуру документа.
ARIA не влияет на внешний вид элементов и их поведение, а также не изменяет DOM. ARIA-атрибуты изменяют только то, как с элементами и страницами взаимодействуют браузеры, Accessibility API и вспомогательные технологии.
Кому помогает
СкопированоГлавные пользователи ARIA — это люди с визуальными, моторными и когнитивными особенностями, которые пользуются вспомогательными технологиями и настройками доступности в операционных системах или браузерах. Это могут быть:
- Скринридеры.
- Дисплеи Брайля.
- Экранные лупы.
- Альтернативные устройства ввода и манипуляторы — выносные компьютерные кнопки, головные указатели, виртуальные клавиатуры.
- Голосовое управление и программы для преобразования текста в речь.
Пользователи вспомогательных технологий обычно пользуются для навигации клавиатурой.
Как это понять
СкопированоВнешний вид элементов не всегда совпадает с их функциями. К примеру, элемент в демо выглядит внешне как кнопка с текстом «Очистить форму».
Для этого элемента используется семантически нейтральный тег <div>. Поэтому для пользователей скринридеров это не кнопка, и они не могут сфокусироваться на элементе.
<div class="button button-aqua">Очистить форму</div>
<div class="button button-aqua">Очистить форму</div>
В этой ситуации ARIA поможет превратить <div> в кнопку. Добавим ARIA-роль button, а ещё поместим элемент в порядок фокуса с помощью HTML-атрибута tabindex.
<div class="button button-aqua" role="button" tabindex="0"> Очистить форму</div>
<div
class="button button-aqua"
role="button"
tabindex="0"
>
Очистить форму
</div>
Теперь элемент доступен для скринридеров. Пользователи могут установить на нём фокус и узнать, что это кнопка с названием «Очистить форму».
Самое лучшее решение проблемы с доступностью этой кнопки — HTML-тег <button>. Тогда не нужно добавлять к элементу дополнительные атрибуты и отслеживать клики с помощью скрипта. Это всё уже есть в теге по умолчанию. Звучит странно, но одно из главных правил использования ARIA — стараться не использовать ARIA.
<button class="button button-aqua">Очистить форму</button>
<button class="button button-aqua">Очистить форму</button>
Более сложный пример — сообщение об успешности или неуспешности действия. Как рассказать пользователям вспомогательных технологий, что на странице что-то произошло? Например, что форма успешно очищена.
Тут снова ARIA спешит на помощь. Добавим для сообщения об успешной очистке формы role и свяжем с ним кнопку с помощью атрибута aria. Благодаря этой ARIA-роли скринридер автоматически объявит сообщение, когда пользователь нажмёт на кнопку.
<button class="button button-aqua" aria-controls="message"> Очистить форму</button><div class="status-message" role="status" id="message"></div>
<button
class="button button-aqua"
aria-controls="message"
>
Очистить форму
</button>
<div
class="status-message"
role="status"
id="message"
>
</div>
Когда не нужно использовать
СкопированоМастерство владения ARIA заключается не столько в том, как это использовать, а когда это не стоит использовать.
ARIA Spec for the Uninitiated: Part 3, Джерард Коэн.
ARIA вообще не нужна тогда, когда нам хватает возможностей HTML, SVG и других языков. Поэтому вместо <div role лучше использовать <button>, а вместо <div role — <main>. У семантических HTML-элементов уже есть практически всё, что нужно для доступности. К примеру, в них встроены нужные роли и функциональность в случае интерактивных элементов.
Есть несколько ресурсов, которые помогут быстро узнать о встроенных ролях HTML-тегов:
- HTML-элементы и доступные имена.
- Периодическая таблица семантики.
- Таблица с HTML-элементами, встроенными ролями и возможными атрибутами из спецификации ARIA in HTML.
Когда пригодится
СкопированоARIA пригодится во всех случаях, когда возможностей HTML недостаточно. То есть, когда нет элементов с нужными ролями, свойствами и состояниями. Дополнительные атрибуты понадобятся в нескольких ситуациях:
- Динамическое обновление контента. Например, таймеры, оповещения, подгружающиеся не сразу части страниц.
- Кастомные интерактивные элементы и улучшение навигации с клавиатуры, особенно когда используется JavaScript. Примеры — выпадающий список, вкладки, тултип или всплывающее окно.
- Добавление дополнительных ориентиров на страницу. Это такие части страницы, по которым могут быстро перемещаться пользователи вспомогательных технологий. Примеры — область вкладок или поиска.
- Исправление проблем с доступностью в браузерах и для вспомогательных технологий из-за разной поддержки фич из HTML, CSS и других языков.
Как устроено
СкопированоARIA состоит из трёх частей — ролей, состояний и свойств.
Роли — основные цели и функции элемента. Задаются через role.
Роли бывают разных типов. Одни могут отвечать за интерактивные элементы, к примеру, button и tab. Какие-то роли нужны для создания ориентиров на странице. Например, search и banner.
Есть роли для составных элементов, для которых нужны конкретные дочерние элементы. Например, у элемента с ролью list должен быть минимум один вложенный элемент с ролью lisitem. Это логично, ведь список делают списком пункты в нём.
Состояния (states) — в каком состоянии находятся интерактивный или неинтерактивный элемент.
Свойства (properties) — дополнительные функции элемента.
Состояния и свойства похожи друг на друга и задаются через атрибут aria. Их часто объединяют и называют ARIA-атрибутами. Основная разница между ними в том, что значения атрибутов свойств часто не так сильно изменяются, как у атрибутов состояний. К примеру, значение свойства aria изменяется реже, чем состояния aria.
ARIA-атрибуты тоже бывают разными. Какие-то атрибуты можно сочетать практически со всеми ролями элементов, например, aria и aria. Какие-то подходят только для интерактивных элементов, например, aria и aria. Есть атрибуты, которые обязательно нужны для определённых ролей. К примеру, у элемента с ролью combobox обязательно должно быть состояние aria.
Полные список ролей и список атрибутов из спецификации ARIA 1.2.
Правила использования
СкопированоЕсть пять основных правил использования ARIA.
Не используйте ARIA
СкопированоНе используйте ARIA, если можно использовать HTML-теги и атрибуты.
В большинстве случаев вместо ARIA-атрибутов можно использовать семантические HTML-теги.
<!-- Неправильно ⛔ --><div role="banner"> <div role="navigation"></div></div><!-- Правильно ✅ --><header> <nav></nav></header>
<!-- Неправильно ⛔ -->
<div role="banner">
<div role="navigation"></div>
</div>
<!-- Правильно ✅ -->
<header>
<nav></nav>
</header>
Не изменяйте семантику
СкопированоНе изменяйте встроенную семантику элементов без серьёзной необходимости.
Когда используете ARIA-роли, встроенные роли HTML-тегов перезаписываются. Поэтому для кастомных элементов лучше использовать семантически нейтральные <div> и <span>, если это не исключительный случай.
<!-- Неправильно ⛔ --><h2 role="tab">Я первая вкладка</h2><!-- Правильно ✅ --><div role="tab"> <h2>Я первая вкладка</h2></div>
<!-- Неправильно ⛔ -->
<h2 role="tab">Я первая вкладка</h2>
<!-- Правильно ✅ -->
<div role="tab">
<h2>Я первая вкладка</h2>
</div>
Все интерактивные элементы доступны для клавиатуры
СкопированоРоль — это обещание, что элемент будет вести себя в соответствии с ней. Если это интерактивный элемент, то он должен получать фокус с клавиатуры. К примеру, между вкладками принято перемещаться стрелками вправо и влево, а раскрывать нажатием на Enter или пробел.
Для того, чтобы сделать кастомный элемент интерактивным, используют HTML-атрибут tabindex. Старайтесь избегать положительных чисел в качестве значения атрибута и используйте его только там, где это действительно нужно. К примеру, зрячим пользователям клавиатуры не нужен фокус на параграфах, заголовках и похожем текстовом содержимом страницы.
<!-- Неправильно ⛔ --><span role="button" tabindex="1"> Загрузить фото</span><!-- Правильно ✅ --><span role="button" tabindex="0"> Загрузить фото</span>
<!-- Неправильно ⛔ -->
<span role="button" tabindex="1">
Загрузить фото
</span>
<!-- Правильно ✅ -->
<span role="button" tabindex="0">
Загрузить фото
</span>
Подробнее про навигацию с клавиатуры для разных интерактивных элементов рассказано в разделе про паттерны APG (ARIA Authoring Practices Guide, Руководства по авторским ARIA-практикам).
Не используйте role и aria на видимых элементах, которые находятся в порядке фокуса.
Роль presentation удаляет семантику элемента. Интерактивный элемент останется в порядке фокуса даже со сброшенной семантикой. В этом случае пользователи скринридеров смогут на нём сфокусироваться, но не узнают роль элемента.
Свойство aria скрывает элемент от скринридеров и других вспомогательных технологий, но не скрывает его визуально. Если используете этот ARIA-атрибут на неинтерактивном элементе с вложенным интерактивным, то вложенный элемент унаследует этот атрибут. Это тоже приведёт к проблемам с доступностью для вспомогательных устройств.
<!-- Неправильно ⛔ --><button role="presentation"> Передать привет</button><button aria-hidden="true"> Передать привет</button><div aria-hidden="true"> <button> Передать привет </button></div><!-- Правильно ✅ --><!-- Описание картинки берётся из параграфа, а с параграфом связан <div> с ролью картинки--><div role="img" aria-labelledby="caption"> <img src="dog.png" alt="" role="presentation"> <p id="caption"> Собака наклонила голову, прижала уши и смотрит с интересом прямо в камеру. </p></div><button> <span class="emoji" aria-hidden="true">👊</span> <span class="text">Передать привет</span></button>
<!-- Неправильно ⛔ -->
<button role="presentation">
Передать привет
</button>
<button aria-hidden="true">
Передать привет
</button>
<div aria-hidden="true">
<button>
Передать привет
</button>
</div>
<!-- Правильно ✅ -->
<!--
Описание картинки берётся из параграфа,
а с параграфом связан <div> с ролью картинки
-->
<div role="img" aria-labelledby="caption">
<img src="dog.png" alt="" role="presentation">
<p id="caption">
Собака наклонила голову, прижала уши и смотрит
с интересом прямо в камеру.
</p>
</div>
<button>
<span class="emoji" aria-hidden="true">👊</span>
<span class="text">Передать привет</span>
</button>
Интерактивным элементам нужны имена
СкопированоУ всех интерактивных элементов должны быть доступные имена. Они подробнее раскрывают цель элемента. Скринридеры объявляет их перед ролью.
Имена задаются двумя способами:
- с помощью HTML — текстовое содержимое тегов и атрибутов
altиtitle; - с помощью ARIA-атрибутов
ariaи- label aria.- labelledby
<!-- Неправильно ⛔ --><button> <img src="logo.svg" alt=""></button><!-- Правильно ✅ --><button> <img src="logo.svg" alt="Твиттер"></button><button aria-label="Твиттер"> <img src="logo.svg" alt=""></button>
<!-- Неправильно ⛔ -->
<button>
<img src="logo.svg" alt="">
</button>
<!-- Правильно ✅ -->
<button>
<img src="logo.svg" alt="Твиттер">
</button>
<button aria-label="Твиттер">
<img src="logo.svg" alt="">
</button>
Дополнительные правила
Скопировано- Не засоряйте разметку лишними ARIA-ролями и атрибутами.
- Всегда тестируйте элементы с ARIA в разных браузерах и с разными скринридерами.
Спецификация
СкопированоWAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) — техническая спецификация, которая описывает как устроена и должна работать ARIA-разметка. Спецификация похожа на ECMAscript. Она описывает, как надо реализовывать ARIA в браузерах и конкретных языках, которые называют хостовыми. К примеру, в вебе хостовые языки — это HTML и SVG.
У WAI-ARIA есть несколько версий.
- WAI-ARIA 1.0, 20 марта 2014.
- WAI-ARIA 1.1, 14 декабря 2017. Действующие рекомендации.
- WAI-ARIA 1.2, 6 июня 2023. Действующие рекомендации.
- WAI-ARIA 1.3, 22 июля 2022. Черновик.
За обновлениями WAI-ARIA можно следить на странице с новостями W3C.
Связанные рекомендации
Скопировано- APG — рекомендации на простом языке о том, как правильно использовать ARIA.
- Using ARIA — рекомендации, как делать более доступными HTML-элементы при помощи ARIA 1.1.
Связанные спецификации
Скопировано- ARIA in HTML — модуль спецификации о том, как использовать ARIA 1.1 в HTML и на что обращать внимание при тестировании.
- Core Accessibility API Mappings 1.2 (CORE-AAM) — как user agent взаимодействуют с Accessibility API.
- Accessible Name and Description: Computation and API Mappings 1.2 (ACCNAME-AAM) — как user agent определяют имена и описания элементов и передают их Accessibility API.
- HTML Accessibility API Mappings 1.0 (HTML-AAM) — дополнения к спецификациям про HTML.
- SVG Accessibility API Mappings 1.0 (SVG-AAM) — дополнения к спецификациям про SVG.
Поддержка и тестирование
СкопированоТема поддержки ARIA не самая простая. Дело в том, что в этом участвует несколько сторон — браузеры, Accessibility API и операционные системы, а также вспомогательные технологии. У них могут быть разные версии, баги и реализации фич ARIA.
Поддержка ARIA браузерами достаточно высокая — 98.7% в 2022 году, если верить Can I Use. Скринридеры сильно отличаются друг от друга и обычно у них разные подходы к реализации фич из ARIA.
Другая проблема — поддержка ARIA на мобильных устройствах. Многие ARIA-атрибуты привязаны к навигации с клавиатуры, поэтому не всегда хорошо поддерживаются на тач-устройствах.
Так что, ARIA познаётся при тестировании собственными силами и с реальными пользователями вспомогательных технологий.
Есть несколько сайтов, которые помогут заранее прикинуть уровень поддержки атрибутов ARIA:
- Accessibility Support.
- База WAI-ARIA от PowerMapper Software с результатами тестирования со вспомогательными технологиями.
За багами из-за разной реализации ARIA в скринридерах и браузерах удобно следить по багтрекерам:
- NVDA Bugs — скринридер NVDA.
- JAWS Bugs — скринридер JAWS.
- iOS & macOS Bug Tracker — Safari и скринридер VoiceOver.
- Open Radar — macOS, iOS и VoiceOver.
- Chromium Bug Tracker.
- IssueTracker — Android и скринридер TalkBack.
- Bugzilla — Firefox.
Есть отдельный инструмент для поиска по GitHub-репозиториям — Find accessibility stats by github repository.
Автоматические инструменты эффективны для поиска основных и очевидных проблем с ARIA и кодом в целом. Вот некоторые из них:
- W3C HTML validator.
- axe и Lighthouse в инструментах разработчиков Chrome.
- IBM Equal Access Accessibility Checker — расширение, плагин и модуль для Node.js.
- WAI-ARIA usage bookmarklet — букмарклет.
- ANDI — ещё один букмарклет, который проверяет даже содержимое
iframe.
На сайте W3C найдёте полный список инструментов для оценки доступности.
Ссылки
Скопировано- WAI-ARIA Overview, W3C.
- WAI-ARIA basics, MDN.
- ARIA Spec for the Uninitiated — часть 1 (перевод на русский язык), часть 2 и часть 3, Джерард Коэн.
На собеседовании
СкопированоЭто вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.
Это вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.
Это вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.