Кратко
СкопированоСамостоятельная роль виджета из WAI-ARIA для пункта строки меню или из связанного со строкой подменю.
В HTML нет тега с ролью menuitem
.
Пример
Скопировано<div role="menubar"> <button role="menuitem" type="button" aria-expanded="false" aria-haspopup="menu" aria-controls="fonts" > Начертание </button> <ul role="menu" id="fonts" > <!-- Пункты подменю --> </ul> <!-- Другие пункты строки меню --> <button role="menuitem" type="button" tabindex="-1" > Новая дока </button></div>
<div role="menubar"> <button role="menuitem" type="button" aria-expanded="false" aria-haspopup="menu" aria-controls="fonts" > Начертание </button> <ul role="menu" id="fonts" > <!-- Пункты подменю --> </ul> <!-- Другие пункты строки меню --> <button role="menuitem" type="button" tabindex="-1" > Новая дока </button> </div>
Как пишется
СкопированоЗадайте role
любому тегу. Это может быть <div>
, <span>
, <li>
и даже <button>
.
Пункты menuitem
должны находиться внутри строки меню menubar
или в подменю menu
. При этом они могут располагаться отдельно или группироваться внутри другого элемента-обёртки с ролью group
.
<div role="menubar"> <span role="menuitem" tabindex="0" > Редактирование </span> <div role="group"> <span role="menuitem" tabindex="-1" > Помощь </span> <span role="menuitem" tabindex="-1" > Клавиатурные сокращения </span> </div> <span role="menuitem" tabindex="-1" > Сохранение </span></div>
<div role="menubar"> <span role="menuitem" tabindex="0" > Редактирование </span> <div role="group"> <span role="menuitem" tabindex="-1" > Помощь </span> <span role="menuitem" tabindex="-1" > Клавиатурные сокращения </span> </div> <span role="menuitem" tabindex="-1" > Сохранение </span> </div>
У menuitem
обязательно должно быть имя — краткое название, которое описывают цель пункта меню. Лучше всего добавлять видимые подписи, как «Начертание» в этом примере:
<span role="menuitem" tabindex="0"> Начертание</span>
<span role="menuitem" tabindex="0" > Начертание </span>
Другой способ добавить имя пункту меню, о котором будет знать только скринридер, — атрибут aria
:
<span role="menuitem" aria-label="Начертание" tabindex="0"> <!-- Иконка --></span>
<span role="menuitem" aria-label="Начертание" tabindex="0" > <!-- Иконка --> </span>
Пунктам menuitem
можно задавать все глобальные ARIA-атрибуты, а также некоторые атрибуты виджетов:
aria
— неактивный пункт.- disabled aria
— пункт, раскрывающий попап.- expanded aria
— тип попапа, который раскрывает пункт. Это может быть подменю- haspopup menu
, диалоговое окноdialog
, выпадающий списокlistbox
, древовидный списокtree
или сеткаgrid
.aria
— сколько всего пунктов в группе с учётом тех, которых пока нет на странице.- setsize aria
— порядковый номер или положение пункта меню в группе, пока его нет на странице.- posinset
По пунктам строки меню menubar
перемещаются стрелками влево ← и вправо →, а внутри menu
— стрелками вверх ↑ и вниз ↓. Для перехода к первому пункту используют Home, к последнему — End.
Дополнительно можно отслеживать нажатие на клавиши с буквами и символами при фокусе на строке меню или в подменю. Пользователи смогут быстро переместиться к нужным пунктам, которые начинаются со знака с нажатой клавиши. Например, попасть на пункт «Настройки» при нажатии на клавишу H.
Поведение кнопки
СкопированоЕсли задаёте роль menuitem
неинтерактивным тегам вроде <div>
или <span>
, не забудьте сделать их кнопками с точки зрения поведения. Тут не обойтись без JavaScript.
Настоящие кнопки <button>
срабатывают при нажатии Enter и пробела, а также при клике и тапе на них. Кнопка нажимается столько, сколько зажимаете и не отпускаете Enter (событие keydown
). Если нажали на пробел (событие keyup
), то действие с кнопкой срабатывает после того, как отпустили клавишу.
Управление фокусом
СкопированоПолностью кастомные пункты menuitem
также нужно добавить в порядок фокуса с помощью tabindex
со значением -1
по умолчанию. Когда пользователь сделал фокус на пункте, меняйте значение на 0
. Имейте в виду, что только у одного пункта может быть нулевое значение tabindex
.
Как понять
СкопированоПункты меню обычно раскрывают попапы или изменяют что-то в интерфейсе. menuitem
по желаемому поведению и свойствам похожа на другую роль button
, которая по умолчанию есть у одноимённого тега <button>
. Некоторые Accessibility API даже вычисляют в случае пунктов строк меню и подменю роль menubutton
.
menuitem
— базовый элемент строки меню. Два других — menuitemcheckbox
и menuitemradio
. Обычные пункты меню внешне похожи на кнопки или вкладки, menuitemcheckbox
— на чекбоксы, а menuitemradio
— на радиокнопки.