Стандарти · ARIA

Роля Контрола

menuitem

Маркира елемент като действащ запис вътре в меню или лента с менюта. Няма HTML еквивалент — менютата са конструкция само за ARIA. Тази роля се използва единствено при изграждане на истинско меню от тип приложение; обикновен навигационен списък НЕ трябва да използва menu/menuitem.

Кога да се използва

Само вътре в role="menu" или role="menubar", и само когато менюто е меню от тип приложение — такова, което имитира лентата File/Edit/View на настолно приложение, с единична Tab-спирка, навигация с клавиши-стрелки и затваряне с Escape.

Горната навигация на сайт НЕ е меню. За нея се използва <nav> с <ul> от <a> връзки. Объркването на двете е най-честата ARIA грешка в уеб — тя блокира потребителите с клавиатура в навигация с клавиши-стрелки, когато Tab би бил по-естествен, и съобщава на екранните четци „меню на приложение”, когато съдържанието всъщност са просто връзки.

Сродни роли: menuitemcheckbox (за записи в менюто, които се превключват) и menuitemradio (за изключителни избори вътре в меню).

Договор за клавиатура и фокус

Съгласно APG шаблона за меню:

  • Tab влиза в и излиза от менюто — фокусът се позиционира на първия menuitem при влизане. Tab НЕ обхожда записите на менюто.
  • Стрелките нагоре/надолу преместват фокуса между записите (с обхождане в кръг).
  • Дясна/Лява стрелка отварят подменюта / връщат към родителя.
  • Enter или интервал активира фокусирания запис.
  • Escape затваря менюто и връща фокуса към тригера.
  • Въвеждането на буква прескача към следващия запис, започващ с тази буква (typeahead).

Използва се roving tabindex: само текущо фокусираният menuitem има tabindex="0"; останалите имат tabindex="-1".

Чести грешки

  • Употреба на role="menuitem" за обикновена връзка в навигацията на сайта. Причинява блокиране на клавиатурата и некоректно обявяване от екранния четец.
  • Всеки menuitem с tabindex="0", поради което Tab обхожда всеки запис поотделно. Шаблонът изисква единична Tab-спирка.
  • Подменюта, които се отварят при преминаване с мишката, но не и при натискане на дясна стрелка.
  • Escape затваря подменюто, но фокусът се губи и потребителят остава без ориентация извън менюто.
  • Записи без достъпно наименование, тъй като иконата е единственото съдържание — необходим е aria-label.

Пример

<button id="fileBtn" aria-haspopup="menu" aria-expanded="false" aria-controls="fileMenu">
  File
</button>
<ul id="fileMenu" role="menu" aria-labelledby="fileBtn" hidden>
  <li role="menuitem" tabindex="0">New</li>
  <li role="menuitem" tabindex="-1">Open</li>
  <li role="menuitem" tabindex="-1" aria-haspopup="menu" aria-expanded="false">
    Open recent
  </li>
  <li role="separator"></li>
  <li role="menuitem" tabindex="-1">Save</li>
</ul>