Кратко
СкопированоСостояние виджета из WAI-ARIA, которое помогает вспомогательным технологиям понять, выбран ли элемент: отмечен, не отмечен или находится в промежуточном состоянии. Так же ведёт себя HTML-атрибут checked
.
Атрибут нужен для случаев, когда вы делаете свой чекбокс, переключатель или пункт меню не с помощью стандартного <input>
, а самостоятельно — например, на основе <div>
или <span>
.
Пример
СкопированоИспользование <span role
и HTML-атрибута <label>
.
<span role="checkbox" aria-labelledby="label" tabindex="0" aria-checked="false"></span><label id="label">Получать рассылку</label>
<span role="checkbox" aria-labelledby="label" tabindex="0" aria-checked="false" > </span> <label id="label">Получать рассылку</label>
Использование JavaScript-свойства у DOM-элемента.
const el = document.getElementById('customCheckboxElementId')console.log(el.ariaChecked)// nullel.ariaChecked = 'true'console.log(el.ariaChecked)// true
const el = document.getElementById('customCheckboxElementId') console.log(el.ariaChecked) // null el.ariaChecked = 'true' console.log(el.ariaChecked) // true
Как пишется
СкопированоМожно добавить к тегу атрибут aria
с одним из значений:
true
— элемент отмечен или выбран.false
— элемент не отмечен или не выбран.mixed
— некоторые, но не все, дочерние элементы выбраны.undefined
(по умолчанию) — элемент нельзя отметить или выбрать.
Значение mixed
поддерживают только элементы с ролями checkbox
и menuitemcheckbox
.
Как понять
Скопированоaria
нужен, чтобы сообщать вспомогательным технологиям, выбран ли элемент или нет. Это важно, когда вы делаете свои чекбоксы, переключатели или пункты меню, которые можно отмечать.
Если aria
отсутствует, пользователь скринридера не сможет узнать, что элемент можно выбрать или он уже выбран.
Работа со скринридером
СкопированоСкринридеры по-разному озвучивают элементы с aria
в зависимости от их роли.
Чекбокс
СкопированоСкринридер сообщает, выбран ли чекбокс с role
или нет, находится ли в смешанном состоянии (mixed
). Например:
aria
— «Чекбокс выбран».- checked = "true" aria
— «Чекбокс не выбран».- checked = "false" aria
— «Чекбокс частично выбран».- checked = "mixed"
Переключатель
СкопированоОзвучка похожа на объявление чекбокса, но с акцентом на включение или выключение элемента с role
:
aria
— «Переключатель включен».- checked = "true" aria
— «Переключатель выключён».- checked = "false"
Пункт меню с чекбоксом
СкопированоСкринридер сообщает, выбран ли пункт меню с role
:
aria
— «Пункт меню выбран».- checked = "true" aria
— «Пункт меню не выбран».- checked = "false" aria
— «Пункт меню частично выбран».- checked = "mixed"
Радиокнопка
СкопированоОзвучка происходит в контексте группы радиокнопок с role
:
aria
— «Радиокнопка выбрана».- checked = "true" aria
— «Радиокнопка не выбрана».- checked = "false"
Опции в списках
СкопированоЕсли опция c ролью option
находится внутри listbox
, скринридер озвучит, выбрана ли она:
<div role="listbox" aria-label="Выберите опции"> <div role="option" aria-checked="true">Опция 1</div> <div role="option" aria-checked="false">Опция 2</div> <div role="option" aria-checked="mixed">Опция 3</div></div>
<div role="listbox" aria-label="Выберите опции"> <div role="option" aria-checked="true">Опция 1</div> <div role="option" aria-checked="false">Опция 2</div> <div role="option" aria-checked="mixed">Опция 3</div> </div>
Если опция вложена внутрь group
, скринридер озвучит её как часть группы:
<div role="group" aria-label="Группа опций"> <div role="option" aria-checked="true">Опция A</div> <div role="option" aria-checked="false">Опция B</div></div>
<div role="group" aria-label="Группа опций"> <div role="option" aria-checked="true">Опция A</div> <div role="option" aria-checked="false">Опция B</div> </div>
Когда использовать
Скопированоaria
используется для собственных интерактивных элементов (чекбоксов, переключателей или пунктов меню), чтобы они были доступны для всех пользователей, включая пользователей скринридеров.
- Кастомный чекбокс для подписки на рассылку — скринридер узнает, выбран он или нет.
- Переключатель «Тёмная тема» — скринридер скажет, включена ли она.
- Меню с множественным выбором — скринридер озвучит, какие пункты отмечены, а какие нет.
Не стоит добавлять aria
для <input type
и <input type
. Элементы уже сообщают своё состояние вспомогательным технологиям с помощью атрибута checked
.
Кастомные переключатели и чекбоксы
СкопированоЕсли создаёте свой компонент вроде чекбокса или переключателя и не используется стандартный <input type
, лучше добавить к нему aria
. Это поможет скринридерам правильно озвучивать состояние элемента.
Меню с множественным выбором
СкопированоКогда нужно реализовать выпадающее меню, в котором можно выбрать сразу несколько пунктов и поддерживать промежуточное состояние (например, выбраны не все опции), лучше использовать aria
со значениями true
, false
и mixed
.
Подсказки
Скопировано💡 Для стандартных чекбоксов используйте псевдокласс indeterminate, если нужно показать промежуточное состояние.
💡 Если у элемента нет значения aria
(по умолчанию это undefined
), значит, он не интерактивный или его состояние не важно. Вспомогательные технологии могут игнорировать такой элемент или считать его неактивным.
💡 Атрибут switch
для <input>
работает только в Safari. Для кроссбраузерного переключателя можно использовать кастомный компонент с aria
.
💡 Для чекбоксов и радиокнопок лучше использовать стандартные <input type
и <input type
. Такие элементы сразу работают «из коробки»: поддерживают работу с клавиатурой, управление через формы и другие функции, важные для доступности.
💡 Атрибут aria
работает во всех браузерах. JavaScript-свойство aria
у DOM-элементов (Element
) поддерживается только в современных браузерах (с 2023 года).
💡 Если у элемента не задан атрибут aria
, то JavaScript-свойство aria
вернёт null
. Это стандартно для всех ARIA-свойств в DOM: так можно понять, что атрибут вообще не установлен.
- Chrome 103, поддерживается
- Edge 103, поддерживается
- Firefox 119, поддерживается
- Safari 16.4, поддерживается