Navigation Menu Button Example

This example demonstrates the menu button design pattern for a button that displays a menu of link targets. The menu items are made from HTML links and maintain their HTML link behaviors. That is, activating a menuitem loads the link target, and the browser's link context menu and associated actions are available.

In this implementation, an HTML button element reveals a menu structure made with an HTML ul element. The menuitem role is on the HTML a element contained by each li element so link behaviors are available when focus is set on the menu item. Another reason the menuitem role is not on the li element is that the semantics of descendants of ARIA menuitem elements are not exposed in the accessibility tree. That is, an item in a menu can only be a menuitem because accessibility APIs do not enable assistive technologies to render elements contained inside of an item in a menu. For a more detailed description of this constraint, see Roles That Automatically Hide Semantics by Making Their Descendants Presentational.

Similar examples include:


Keyboard Support

Menu Button

Key Function
Down Arrow
Opens menu and moves focus to first menuitem
Up Arrow Opens menu and moves focus to last menuitem


Key Function
  • Closes the menu.
  • Sets focus on the menu button
  • Activates the menu item, which is equivalent to activating the link element from which the menu item is made.
  • Closes the menu.
  • Sets focus to the menu button.
Up Arrow
  • Moves focus to the previous menu item.
  • If focus is on the first menu item, moves focus to the last menu item.
Down Arrow
  • Moves focus to the next menu item.
  • If focus is on the last menu item, moves focus to the first menu item.
Home Moves focus to the first menu item.
End Moves focus to the last menu item.
  • Moves focus to the next menu item with a label that starts with the typed character if such an menu item exists.
  • Otherwise, focus does not move.

Role, Property, State, and Tabindex Attributes

Menu Button

Role Attribute Element Usage
aria-haspopup="true" button
  • Indicates the button opens a menu.
  • NOTE: While ARIA does not include a role specifically for menu buttons, most platform accessibility APIs include a menubutton role. Consequently, on such platforms, assistive technologies, such as screen readers, identify buttons that have aria-haspopup set to either true or menu as menu buttons.
aria-controls="IDREF" button
  • Refers to the menu element controlled by the menu button.
  • Optional attribute: assistive technology users can operate the menu if not present.
aria-expanded="true" button
  • Added when the menu is open.
  • Indicates that the menu is displayed and that activating the menu button closes the menu.
  • The aria-expanded attribute is removed when the menu is closed.
  • Included to support touch devices where screen reader users can touch the menu button when the menu is displayed. Keyboard users cannot focus the menu button when the menu is open.


The label for the button is provided by the text content of the button element.


Role Attribute Element Usage
menu ul Identifies the ul element as a menu.
aria-labelledby="IDREF" ul
  • Refers to the element that contains the accessible name for the menu.
  • The menu is labeled by the menu button.
none li
menuitem a
  • Identifies the element as a menuitem.
  • The text content of the a element provides the accessible name of the menuitem.
tabindex="-1" a removes the a element from the page tab sequence but keeps it focusable with JavaScript.

Javascript and CSS Source Code

HTML Source Code