Кратко
Скопировано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, Джерард Коэн.
На собеседовании
СкопированоЭто вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.
Это вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.
Это вопрос без ответа. Вы можете помочь! Почитайте о том, как контрибьютить в Доку.