Editor Menubar Example
Read This First
The code in this example is not intended for production environments. Before using it for any purpose, read this to understand why.
This is an illustrative example of one way of using ARIA that conforms with the ARIA specification.
- There may be support gaps in some browser and assistive technology combinations, especially for mobile/touch devices. Testing code based on this example with assistive technologies is essential before considering use in production systems.
- The ARIA and Assistive Technologies Project is developing measurements of assistive technology support for APG examples.
- Robust accessibility can be further optimized by choosing implementation patterns that maximize use of semantic HTML and heeding the warning that No ARIA is better than Bad ARIA.
About This Example
The following example demonstrates using the Menubar Pattern to provide access to editing actions for a text area.
Each item in the menubar identifies a category of text formatting actions that can be executed from its submenu.
The submenus demonstrate menuitemradio
and menuitemcheckbox
elements.
Similar examples include:
- Toolbar Example: A text formatting toolbar that uses roving tabindex to manage focus and contains several types of controls, including toggle buttons, radio buttons, a menu button, a spin button, a checkbox, and a link.
- Navigation Menubar Example: A menubar that presents site navigation menus.
Example
Accessibility Features
-
Disabled menu items are demonstrated in the font size menu.
If the font is set to its smallest size, the
Smaller
menu item is disabled. Similarly, if the font is set to its largest size, theLarger
menu item is disabled. - Users of assistive technologies can identify the currently active format options because they are represented by menu item radio and menu item checkbox elements that have a checked state.
- To prevent the character entities that visually represent The down arrow and checked icons from being announced by screen readers, they are hidden from the accessible name computation with the
aria-hidden
attribute. - To help communicate that the arrow keys are available for directional navigation within the menubar and its submenus, a border is added to the menubar container when focus is within the menubar.
- Like most desktop menubars, submenus open on mouse hover over a parent item in the menubar only if another submenu is already open. That is, if all submenus are closed, a click on a parent menu item is required to display a submenu. Minimizing automatic popups triggered by hover makes exploring with a screen magnifier easier.
-
In general, moving focus in response to mouse hover is avoided in accessible widgets; it causes unexpected context changes for keyboard users.
However, like desktop menubars, there are two conditions in this example menubar where focus moves in response to hover in order to help maintain context for users who use both keyboard and mouse:
- After a parent menu item in the menubar has been activated and the user hovers over a different parent item in the menubar, focus will follow hover.
- When a submenu is open and the user hovers over an item in the submenu, focus follows hover.
- To support operating system high contrast settings, focus is highlighted by adding and removing a border around the menu item with focus.
Keyboard Support
Menubar
Key | Function |
---|---|
Space Enter |
Opens submenu and moves focus to first item in the submenu. |
Escape | If a submenu is open, closes it. Otherwise, does nothing. |
Right Arrow |
|
Left Arrow |
|
Down Arrow | Opens submenu and moves focus to first item in the submenu. |
Up Arrow | Opens submenu and moves focus to last item in the submenu. |
Home | Moves focus to first item in the menubar. |
End | Moves focus to last item in the menubar. |
Character |
|
Submenu
Key | Function |
---|---|
Space Enter |
Activates menu item, causing action to be executed, e.g., bold text, change font. |
Escape |
|
Right Arrow |
|
Left Arrow |
|
Down Arrow |
|
Up Arrow |
|
Home | Moves focus to the first item in the submenu. |
End | Moves focus to the last item in the submenu. |
Character |
|
Role, Property, State, and Tabindex Attributes
Menubar
Role | Attribute | Element | Usage |
---|---|---|---|
menubar
|
ul
|
|
|
aria-label="string"
|
ul
|
|
|
menuitem
|
span
|
|
|
tabindex="-1"
|
span
|
Makes the menuitem element keyboard focusable but not part of the Tab sequence of the page. |
|
tabindex="0"
|
span
|
|
|
aria-haspopup="true"
|
span
|
Indicates that the menuitem has a submenu. |
|
aria-expanded="true"
|
span
|
|
|
aria-expanded="false"
|
span
|
|
|
aria-hidden="true"
|
span
|
Removes the character entities used to represent the down arrow icons for parent menu items from the accessibility tree to prevent them from being included in the accessible name of the menu item. |
Submenu
Role | Attribute | Element | Usage |
---|---|---|---|
menu
|
ul
|
|
|
aria-label="string"
|
ul
|
Defines an accessible name for the menu . |
|
menuitem
|
li
|
|
|
tabindex="-1"
|
li
|
Makes the item focusable but not part of the page tab sequence. | |
aria-disabled="false"
|
li
|
Used on the font size "Smaller" and "Larger" options to indicate they are active. | |
aria-disabled="true"
|
li
|
Used on the font size "Smaller" and "Larger" options to indicate one of the options is not active because the largest or smallest font has been selected. | |
menuitemcheckbox
|
li
|
|
|
tabindex="-1"
|
li
|
Makes the menuitemcheckbox focusable but not part of the page tab sequence. | |
aria-checked="true"
|
li
|
|
|
aria-checked="false"
|
li
|
|
|
aria-hidden="true"
|
span
|
Removes the character entities that visually represent the checked state of menuitemcheckbox elements from the accessibility tree to prevent them from being included in the accessible name of the menu item. |
|
separator
|
li
|
|
|
group
|
ul
|
|
|
aria-label="string"
|
ul
|
Provides an accessible name for the group of menu items. | |
menuitemradio
|
li
|
|
|
tabindex="-1"
|
li
|
Makes the menuitemradio focusable but not part of the page tab sequence. | |
aria-checked="true"
|
li
|
|
|
aria-checked="false"
|
li
|
|
|
aria-hidden="true"
|
span
|
Removes the character entities that visually represent the checked state of menuitemradio elements from the accessibility tree to prevent them from being included in the accessible name of the menu item. |
Textarea
Role | Attribute | Element | Usage |
---|---|---|---|
aria-label="string"
|
textarea
|
Defines an accessible name for the textarea . |
JavaScript and CSS Source Code
- CSS: menubar-editor.css
- Javascript: menubar-editor.js
- Javascript: style-manager.js
HTML Source Code
To copy the following HTML code, please open it in CodePen.