Skip to main content

Navigation

Accessibility

To implement an accessible PatternFly navigation component:

  • Provide an accessible name for the navigation via the aria-label attribute
  • For grouped or expandable nav, add a title to each section to distinguish them for users. If title is not used, an aria-label must be used on the NavGroup or NavExpandable component.

Testing

At a minimum, a navigation component should meet the following criteria:

  • This will differentiate each navigation when announced to users of assistive technologies when navigating through a page or a screen reader's rotor menu.
  • Tab navigates to the next focusable element, and Shift + Tab navigates to the previous focusable element. Expandable items can be opened with Enter or Space. When the navigation is collapsed, you should not be able to navigate to any of the elements.
  • This will differentiate each navigation when announced to users of assistive technologies when navigating through a page or a screen reader's rotor menu.

React customization

The following React props have been provided for more fine-tuned control over accessibility.

PropApplied toReason
aria-label="[text that labels the nav component]"NavAdds an accessible label for the nav when there are multiple navs on the page
ariaLeftScroll="[text that labels the left scroll button]"NavListAdds an aria-label for the left scroll button
ariaRightScroll="[text that labels the right scroll button]"NavListAdds an aria-label for the right scroll button
idNavGroupUsed as an identifier to use when there is an aria-labelledby on a section element
title="[text label for an expandable nav]"NavGroupAdds a title shown for the group
isActiveNavItemWill add the aria-current attribute on a nav item when active
isExpandedNavExpandableAdds the aria-expanded attribute when is expanded and hidden attribute when collapsed
titleNavExpandableAdds a title shown for the expandable list
buttonProps={[an object containing button props]}NavExpandableAdds any additional props added to the NavExpandable <button>
srText="[text describing an expandable nav]"NavExpandableIf defined, screen readers will read this text instead of the list title

Expandable toggle props

When a navigation has expandable content, buttonProps must be passed into the NavExpandable sub-component with an object as its value. This object should usually be passed in with a structure similar to the following:

  buttonProps=({
id: ‘buttonId’,
‘aria-label’: 'Toggle label',
‘aria-labelledby’: 'titleId buttonId',
‘aria-expanded’: this.state.isExpanded
)}

HTML/CSS customization

The following HTML attributes and PatternFly classes can be used for more fine-tuned control over accessibility.

Attribute or classApplied toReason
aria-label="[text that labels the nav component]".pf-v5-c-navDescribes <nav> landmark.
aria-label="[text that labels a nav section]".pf-v5-c-nav__sectionDescribes a nav <section>, where a .pf-v5-c-nav__section-title is not present.
aria-labelledby="[id of the element that labels the subnav]".pf-v5-c-nav__subnavGives the subnav <section> landmark an accessible name by referring to the element that provides the subnav <section> landmark title. The aria-labelledby attribute should be passed in with a value of the label's id attribute.
aria-expanded="false".pf-v5-c-nav__linkIndicates that subnav section is hidden.
aria-expanded="true".pf-v5-c-nav__linkIndicates that subnav section is visible.
hidden.pf-v5-c-nav__subnavIndicates that the subnav section is hidden so that it isn't visible in the UI and isn't accessed by assistive technologies.
disabled.pf-v5-c-nav__scroll-buttonIndicates that a scroll button is disabled, when at the first or last item of a list. Required when disabled
aria-current="page".pf-v5-c-nav__linkIndicates the current page link. Can only occur once on page.
aria-haspopup="true".pf-v5-c-nav__linkDeclares that a nav item has a submenu.

Additional considerations

Consumers must ensure they take any additional considerations when customizing a navigation component, using it in a way not described or recommended by PatternFly, or in various other specific use-cases not outlined elsewhere on this page.

Flyout Variation

The Flyout navigation will use slightly different keyboard interactions compared to other navigation variations. Users will need to open a flyout using Space or right arrow, and Flyout menu items use arrow keys to navigate between flyout menu items. Pressing Escape or left arrow should close a flyout. It's important to remember that while keyboard users will prefer to use arrow keys to open a flyout since it will match the visual representation, screen reader users will likely still rely on Space or Enter since they tend to rely on click events. Remember that every interactive element should only be associated with one action. For example, you should not have a link on a button that is also a flyout. The action of selecting should only be associated with either opening the menu or taking an action but not both.