We are in the process of implementing (i.e. adding) WAI-ARIA support to the main navigation menu of a web portal. Menu is the one shown here:
The ARIA design patterns provide expected UI behaviour for a range of custom controls http://www.w3.org/TR/wai-aria-practices/#aria_ex use of esc key to close and return to triggering element upon close is standard UI across desktop and web. Try it on any Google docs app (for example).
+Escape key should close an open menu and return focus to the element that opens it.
A possible implementation would be:
HTML structure:
<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>
Roles:
<div>
<ul>
navigation bar container<ul>
containers<li>
menu items (they are not needed in the exposed accessible menubar structure)<a>
menu itemsProperties:
<a>
menu items having a submenu<a>
menu item" for second-level <ul>
containersStates:
<a>
item; aria-selected="false" on the other <a>
items. That is to enforce the concept “selected <==> current page”<ul>
containers<ul>
containers<ul>
navigation bar container. This is an alternative to working with tabindex<a>
item; tabindex=-1 on the other <a>
items. That is in order to first focus on the current page when tabbing to the navigation bar. It is an alternative to working with aria-activedescendantKeyboard:
Aug/2014: aria-selected Vs menuitem
In reply to @Joshua Muheim comment: now I can see from here, as well as from his reference, that aria-selected
attribute is not allowed for menuitem
role.
As I read from this recent SO answer there are some solutions given the current state of things, and there is a new proposed attribute too.
As an FYI, you can get a menu to announce 'X of Y' information by adding aria-posinset and aria-setsize attributes to the elements with role=menuitem. Sincerely, Bryan Garaventa
Escape to close is a standard going way back, it is expected behavior by many users.