widget role
role="menu"
A list of commands, usually opened from a trigger, and built to be driven with arrow keys.
What role="menu" means, and when to use it
Use menu for a list of commands driven with arrow keys, the way a desktop application menu works. This is not the role for a site navigation bar. A nav full of links wants role="navigation" and no menu role at all. It is also the only role anybody has published a failure rate for, and the number is not a kind one.
The HTML element behind role="menu"
HTML's menu element does not give you this role. It maps to role="list", the same as ul, which surprises people. There is no native menu widget in HTML, so a real menu means writing the roving focus and the arrow keys yourself.
What role="menu" obliges you to do
- It has to contain
menuitem,menuitemradioormenuitemcheckbox, and those can sit insidegrouprather than being direct children. One of them is enough, so you do not need every role on that list. Inheritance does not substitute, so a subclass of a required child does not satisfy it. An empty one describes a structure that is not there, and if it renders empty and fills in later, ARIA puts a must on marking the containeraria-busywhile it waits. When the markup genuinely cannot nest them,aria-ownsclaims them from elsewhere in the document, and it is a last resort, because the browser has to rebuild the tree from your references and a stale one leaves the role describing children that have moved.
Widget roles say an element is a control somebody has to operate
A widget role tells assistive technology that an element is interactive and what kind of control it is. Buttons, checkboxes, sliders, tabs and menu items all live here.
Using one is a promise, and the keyboard is the half people underestimate. ARIA changes what gets announced and nothing else, so calling a div a checkbox does not make the space bar toggle it. You write that yourself. Eight of these roles carry a stricter duty again, because ARIA puts a must-level obligation on authors to manage focus inside grid, listbox, menu, menubar, radiogroup, tree, treegrid and tablist.
One role here has a measured failure rate. WebAIM found an ARIA menu on 5.7% of the top million home pages in 2026, and 22% of those menus introduced barriers, because the markup and the keyboard behavior a menu needs were never added.
Where role="menu" sits in the model
- The name can come from
- aria-labelledby or aria-label. Its own text does not become the name, so text inside it will not be read as one.
- More specific roles below it
menubar
The normative definition stays with the W3C, so it cannot go stale here. menu in the ARIA specification.
How a checker tests role="menu"
Getting this one wrong is easy to assume is a 4.1.2 Name, Role, Value problem, and mostly it is not. A role in the wrong container, or a container holding the wrong children, is tested against 1.3.1 Info and Relationships, which is Level A. These are the published test rules that apply.
The other widget roles
- button A button does something when you activate it. If it goes to a URL instead, that is a link.
- checkbox A control with two or three states that has to announce which one it is in.
- combobox An input that pops up a list to help you fill it, and has to say what it controls and whether that list is open.
- grid A table you can move through cell by cell with the keyboard.
- gridcell One cell in a grid.
- link A link goes somewhere. If it acts on the page you are already on, that is a button.
- listbox A list of options someone can move through and choose from.
- menubar A menu that stays visible and lays its options out along a bar.
- menuitem One command inside a menu.
- menuitemcheckbox A menu item that toggles on and off like a checkbox.
- menuitemradio A menu item that is one option in a set where only one can be chosen.
- option One choice inside a listbox, which has to announce whether it is currently selected.
- progressbar Shows how far a task has got. It is read-only, not something to operate.
- radio One option in a set where only one can be chosen, and it belongs inside a radiogroup.
- radiogroup The container that turns a set of radios into a single choice rather than several separate ones.
- scrollbar A control that scrolls something, and has to say what it scrolls and where it currently sits.
- searchbox A text input meant for search queries.
- slider A control you set by moving a handle along a range.
- spinbutton A control for stepping a value up and down.
- switch A binary on-or-off control with no mixed state, usually taking effect the moment it is flipped.
- tab A label that reveals its panel, and it means nothing outside a tablist.
- tablist The container for a set of tabs, which has to actually contain tabs.
- tabpanel The panel a tab reveals.
- textbox A text input that takes free-form typing.
- tree A hierarchy whose branches open and close.
- treegrid A grid whose rows open and close, so it behaves as a table and a tree at once.
- treeitem One node in a tree.
All 94 ARIA roles · ARIA explained · How accessible names are computed · Scan your own pages