Рекомендуемая реализация WAI-ARIA для панели навигации / меню

Мы находимся в процессе внедрения (то есть добавления) поддержки WAI-ARIA в главное меню навигации веб-портала. Меню показано здесь:

Снимок экрана меню навигации

Меню реализовано с помощью классического <ul> / <li> / <a> дерева DOM, стилизованного с помощью CSS, чтобы оно выглядело как горизонтальные вкладки.

Какова рекомендуемая реализация WAI-ARIA для такого виджета?

Я собираюсь опубликовать здесь возможную реализацию в качестве ответа, чтобы начать работу.

Пропустите оставшиеся абзацы, если вы знаете / не заботитесь о меню навигации CSS в контексте WAI-ARIA.

TA

Преамбула (так сказать)

Я прочитал многие части самых последних спецификаций WAI-ARIA от w3org для общего понимания, таксономии и так далее. Затем я прочитал о нескольких примерах реализации виджетов пользовательского интерфейса. Я не смог найти ни одного примера, специально предназначенного для такого меню навигации CSS. Ближайшие виджеты, которые я всегда встречал, - это Menu, MenuBar и TabPanel. Конечно, я также искал в группу сообщества Free ARIA (где изначально был размещен этот вопрос).

Я бы сказал, что ни один из этих виджетов в точности не соответствует меню навигации (CSS). Например, TabPanel может управлять некоторым контентом на странице (-> aria-controls), возможно, MenuBar тоже; но я совсем не уверен, что меню навигации управляет содержимым страницы (оно управляет следующей отображаемой страницей). Не вдаваясь в подробности, есть и другие отличия. Ссылки в конце поста. Если у кого-то такие же лучшие (или более подходящие) примеры меню навигации, мы будем рады узнать о них.

Ссылки


person superjos    schedule 05.09.2012    source источник


Ответы (5)


Возможная реализация:

Структура HTML:

<div> <!-- Outer wrapper -->
  <ul> <!-- Main navigation bar container -->
    <li> <!-- First-level item without submenu -->
      <a> <!-- Destination URL -->
      </a>
    </li>
    <li> <!-- First-level item with submenu -->
      <a> <!-- Destination URL -->
      </a>
      <ul> <!-- Second-level menu container -->
        <li> <!-- Second-level item -->
          <a>
          </a> <!-- Destination URL -->
        </li>
      </ul>
    </li>
  </ul>
</div>

Роли:

  • role = "navigation" для внешней оболочки <div>
  • role = "menubar" для <ul> контейнера панели навигации
  • role = "menu" для <ul> контейнеров второго уровня
  • role = "presentation" для <li> пунктов меню первого и второго уровня (они не нужны в открытой доступной структуре строки меню)
  • role = "menuitem" для <a> пунктов меню первого и второго уровня

Свойства:

  • aria-haspopup = "true" для <a> пунктов меню первого уровня, имеющих подменю
  • aria-labelledby = "ID предыдущего <a> пункта меню" для <ul> контейнеров второго уровня

Состояния:

  • aria-selected = "true" для посещаемого в данный момент <a> элемента первого или второго уровня; aria-selected = "false" по остальным <a> элементам. Это необходимо для реализации концепции «выбранная‹ ==> текущая страница ».
  • aria-extended = "true / false" для <ul> контейнеров второго уровня
  • aria-hidden = "true / false" для <ul> контейнеров второго уровня
  • aria-activedescendant = "" для контейнера основной <ul> панели навигации. Это альтернатива работе с tabindex
  • tabindex = 0 для посещаемого в данный момент <a> элемента; tabindex = -1 для остальных <a> элементов. Это необходимо для того, чтобы сначала сосредоточиться на текущей странице при переходе на панель навигации. Это альтернатива работе с aria-activedescendant.

Клавиатура:

  • Вкладка: перемещение фокуса в / из меню из других точек веб-приложения.
  • Shift + Tab: перемещение фокуса в / из меню из других точек веб-приложения в обратном порядке.
  • Стрелка вправо: следующий элемент панели навигации
  • Стрелка влево: предыдущий элемент панели навигации
  • Enter: активировать выбранный в данный момент элемент (т. Е. Перейти к соответствующему URL-адресу)
  • Пробел: активировать выбранный в данный момент элемент (т. Е. Перейти к соответствующему URL-адресу)

Август / 2014: выбор арии по сравнению с пунктом меню

В ответ на комментарий @Joshua Muheim: теперь я могу видеть отсюда, а также из его ссылки, этот атрибут aria-selected не допускается для роли menuitem.
Как я прочитал из недавнего SO answer, есть некоторые решения с учетом текущего положения вещей, а также предлагается новый атрибут.

person superjos    schedule 05.09.2012
comment
Я был почти готов отказаться от плохо продуманной спецификации арии, пока не прочитал ваш ответ. Для меня это была роль презентации, которой мне не хватало в моем меню, что приводило к странному поведению, когда каждый пункт меню считывался как 1 из 1 вместо 1 из [length]. Большинство примеров, которые я видел в Интернете, приводят к такому нежелательному поведению, и я не нашел ничего, что бы говорило ul[role=menu] > li[role=presentation] > a[role=menuitem], кроме вашего ответа. Отличная работа. - person Iain Fraser; 10.12.2012
comment
На самом деле проблема 1 из 1 возникла, когда я пытался ul[role=menu] > li > a[role=menuitem]. Безусловно, большинство людей рекомендовали ul[role=menu] > li[role=menuitem] > a, который вообще не работал! Он читал пункты меню, но, поскольку ссылки не были выделены, вы не могли никуда пойти с ними. - person Iain Fraser; 10.12.2012
comment
рад что помог! Насколько я понял, необходимость в xxx [role = presentation] сохраняется каждый раз, когда вы вставляете некоторые (вложенные) узлы только для эстетических целей, то есть для позиционирования, отображения / скрытия, окраски фона и так далее. Но эти узлы ничего не значат с точки зрения содержимого, поэтому вы помечаете их для любого инструмента доступности. - person superjos; 10.12.2012
comment
Нужно ли также определять application роль? Кроме того, при использовании программ чтения с экрана (SR), таких как элементы JAWS с menuitem ролями (например, ссылки привязки), будут игнорироваться в списках ярлыков SR. - person skube; 16.06.2014
comment
В этом сценарии мы думали, что роль application не нужна. Что касается menuitem ролей, я помню, что это было лучшее совпадение, которое мы нашли, и я думаю, что это был самый распространенный выбор, который мы видели. - person superjos; 17.06.2014
comment
Недавнее обновление: спецификации теперь написаны более удобным для разработчиков способом, как сказано в html5doctor.com/using-aria-in-html - person superjos; 26.06.2014
comment
Я не вижу, чтобы aria-selected можно было использовать в меню арии. w3.org/TR/wai-aria/states_and_properties#aria-selected Кажется, это распространенная ошибка, и я не знаю лучшего способа сообщить о выбранном состоянии, кроме добавления визуально скрытого текста, такого как активный элемент. - person Joshua Muheim; 11.09.2014
comment
Если некоторые из пунктов меню верхнего уровня не являются ссылками, а являются кнопками только для открытия подменю, как с ними обращаться? - person jbyrd; 31.08.2015
comment
role="menuitem" на <a> заставляет JAWS читать текст дважды. - person Astrotim; 13.10.2016
comment
Почему role="menu" не role="submenu"? - person evolutionxbox; 20.12.2017
comment
В вашем ответе есть ошибка: aria-expanded="true/false" не предназначен для <ul> контейнеров, он предназначен для ссылок / кнопок, запускающих расширение. - person catamphetamine; 09.12.2018
comment
Спасибо что подметил это. Есть ли ссылка на спецификации / документы по этой конкретной теме? - person superjos; 10.12.2018

К вашему сведению, вы можете получить меню для объявления информации «X из Y», добавив атрибуты aria-posinset и aria-setsize к элементам с ролью = menuitem. С уважением, Брайан Гаравента

person Bryan Garaventa    schedule 07.12.2013
comment
Спасибо, что поделились этим. Я думаю, что другим может быть полезно, если DOM меню изменится динамически. Я могу прочитать здесь, что не требуется, если все элементы в набор присутствует в DOM - person superjos; 09.12.2013

Побег, чтобы закрыть - стандартный способ возврата, это ожидаемое поведение многих пользователей.

person Joseph Karr O'Connor    schedule 20.08.2014

Шаблоны проектирования ARIA обеспечивают ожидаемое поведение пользовательского интерфейса для ряда настраиваемых элементов управления http://www.w3.org/TR/wai-aria-practices/#aria_ex использование клавиши esc для закрытия и возврата к запускающему элементу при закрытии является стандартным пользовательским интерфейсом для настольных компьютеров и в Интернете. Попробуйте его в любом приложении Google docs (например).

person Steve Faulkner    schedule 20.08.2014
comment
немного поздно: спасибо за добавление, мистер Фолкнер - person superjos; 05.06.2015

+ Клавиша Escape должна закрывать открытое меню и возвращать фокус элементу, который его открывает.

person user810937    schedule 30.08.2013
comment
Прошло некоторое время с тех пор, как я в последний раз думал об этих функциях. На первый взгляд, использование клавиши Escape для закрытия открытого меню кажется подходящим вариантом (я не помню, видел ли я это уже во время поиска). Я не уверен, что должно произойти после закрытия меню с помощью Esc: ваше предложение (вернуть фокус открывающему его элементу) мне не подходит. - person superjos; 09.09.2013
comment
Побег - это стандарт закрытия. access.aol.com/dhtml-style-guide-working-group / # меню - person user810937; 20.08.2014