@patternfly/patternfly
Version:
Assets, source, tooling, and content for PatternFly 4
481 lines (449 loc) • 22.2 kB
Markdown
---
id: Navigation
section: components
cssPrefix: pf-c-nav
---
import './Navigation.css'
## Examples
### Default
```html
<nav class="pf-c-nav" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Current link</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 3</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 4</a>
</li>
</ul>
</nav>
```
### Grouped nav
```html
<nav class="pf-c-nav" aria-label="Global">
<section class="pf-c-nav__section" aria-labelledby="grouped-title1">
<h2 class="pf-c-nav__section-title" id="grouped-title1">Section title 1</h2>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 3</a>
</li>
</ul>
</section>
<section class="pf-c-nav__section" aria-labelledby="grouped-title2">
<h2 class="pf-c-nav__section-title" id="grouped-title2">Section title 2</h2>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Current link</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 3</a>
</li>
</ul>
</section>
</nav>
```
### Expanded
```html
<nav class="pf-c-nav" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded pf-m-current">
<button class="pf-c-nav__link" id="expandable-example1" aria-expanded="true">Link 1 (current and expanded example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example1">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Current link</a>
</li>
<li class="pf-c-divider" role="separator"></li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Subnav link 3</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded">
<button class="pf-c-nav__link" id="expandable-example2" aria-expanded="true">Link 2 (expanded, but not current example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example2">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable">
<button class="pf-c-nav__link" id="expandable-example3" aria-expanded="false">Link 3
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example3" hidden>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
</ul>
</nav>
```
### Expanded with subnav titles
```html
<nav class="pf-c-nav" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded pf-m-current">
<button class="pf-c-nav__link" aria-expanded="true">Link 1
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="subnav-title1">
<h2 class="pf-c-nav__subnav-title pf-screen-reader" id="subnav-title1">Current and expanded example sub-navigation</h2>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Current link</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Subnav link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 3</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded">
<button class="pf-c-nav__link" aria-expanded="true">Link 2
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="subnav-title2">
<h2 class="pf-c-nav__subnav-title pf-screen-reader" id="subnav-title2">Expanded, but not current example sub-navigation</h2>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
</ul>
</nav>
```
### Mixed
```html
<nav class="pf-c-nav" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 1 (not expandable)</a>
</li>
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded">
<button class="pf-c-nav__link" id="nav-mixed-link2" aria-expanded="true">Link 2 (expanded, but not current example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="nav-mixed-link2">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable pf-m-current">
<button class="pf-c-nav__link" id="nav-mixed-link4" aria-expanded="false">Link 3 (current, but not expanded example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="nav-mixed-link4" hidden>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Subnav link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 3</a>
</li>
</ul>
</section>
</li>
</ul>
</nav>
```
### Horizontal
```html
<nav class="pf-c-nav pf-m-horizontal" aria-label="Global">
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll left">
<i class="fas fa-angle-left" aria-hidden="true"></i>
</button>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Item 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Item 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Item 3</a>
</li>
</ul>
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll right">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</button>
</nav>
```
### Horizontal overflow
```html
<nav class="pf-c-nav pf-m-horizontal pf-m-scrollable" aria-label="Global">
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll left">
<i class="fas fa-angle-left" aria-hidden="true"></i>
</button>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Horizontal nav item 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Horizontal nav item 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Horizontal nav item 3</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Horizontal nav item 4</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Horizontal nav item 5</a>
</li>
</ul>
<button class="pf-c-nav__scroll-button" aria-label="Scroll right">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</button>
</nav>
```
### Tertiary
```html
<nav class="pf-c-nav pf-m-tertiary" aria-label="Local">
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll left">
<i class="fas fa-angle-left" aria-hidden="true"></i>
</button>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Item 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Item 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Item 3</a>
</li>
</ul>
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll right">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</button>
</nav>
```
### Tertiary overflow
```html
<nav class="pf-c-nav pf-m-tertiary pf-m-scrollable" aria-label="Local">
<button class="pf-c-nav__scroll-button" disabled aria-label="Scroll left">
<i class="fas fa-angle-left" aria-hidden="true"></i>
</button>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Tertiary nav item 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Tertiary nav item 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Tertiary nav item 3</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Tertiary nav item 4</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Tertiary nav item 5</a>
</li>
</ul>
<button class="pf-c-nav__scroll-button" aria-label="Scroll right">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</button>
</nav>
```
### Default in light mode
```html
<nav class="pf-c-nav pf-m-light" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Current link</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 3</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Link 4</a>
</li>
</ul>
</nav>
```
### Expanded in light mode
```html
<nav class="pf-c-nav pf-m-light" aria-label="Global">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded pf-m-current">
<button class="pf-c-nav__link" id="expandable-example1" aria-expanded="true">Link 1 (current and expanded example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example1">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Current link</a>
</li>
<li class="pf-c-divider" role="separator"></li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link pf-m-current" aria-current="page">Subnav link 3</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable pf-m-expanded">
<button class="pf-c-nav__link" id="expandable-example2" aria-expanded="true">Link 2 (expanded, but not current example)
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example2">
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
<li class="pf-c-nav__item pf-m-expandable">
<button class="pf-c-nav__link" id="expandable-example3" aria-expanded="false">Link 3
<span class="pf-c-nav__toggle">
<span class="pf-c-nav__toggle-icon">
<i class="fas fa-angle-right" aria-hidden="true"></i>
</span>
</span>
</button>
<section class="pf-c-nav__subnav" aria-labelledby="expandable-example3" hidden>
<ul class="pf-c-nav__list">
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 1</a>
</li>
<li class="pf-c-nav__item">
<a href="#" class="pf-c-nav__link">Subnav link 2</a>
</li>
</ul>
</section>
</li>
</ul>
</nav>
```
## Documentation
### Overview
The navigation system relies on several different sub-components:
- `.pf-c-nav__list` - default navigation list. It is the basis for both default and expandable, vertical navigation.
### Accessibility
| Attribute | Applied to | Outcome |
| -------------------------------------------------------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- |
| `aria-label="[landmark description]"` | `.pf-c-nav` | Describes `<nav>` landmark. |
| `aria-labelledby="[id value of link describing subnav]"` | `.pf-c-nav__subnav` | Gives the subnav `<section>` landmark an accessible name by referring to the element that provides the subnav `<section>` landmark title. |
| `aria-expanded="false"` | `.pf-c-nav__link` | Indicates that subnav section is hidden. |
| `aria-expanded="true"` | `.pf-c-nav__link` | Indicates that subnav section is visible. |
| `hidden` | `.pf-c-nav__subnav` | Indicates that the subnav section is hidden so that it isn't visible in the UI and isn't accessed by assistive technologies. |
| `disabled` | `.pf-c-nav__scroll-button` | Indicates that a scroll button is disabled, when at the first or last item of a list. **Required when disabled** |
| `aria-current="page"` | `.pf-c-nav__link` | Indicates the current page link. Can only occur once on page. |
### Usage
| Class | Applied to | Outcome |
| -------------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `.pf-c-nav` | `<nav>` | Initiates a primary nav element. |
| `.pf-c-nav__subnav` | `<section>` | Initiates a subnav section. |
| `.pf-c-nav__list` | `<ul>` | Initiates nav list. |
| `.pf-c-nav__item` | `<li>` | Initiates nav list item. |
| `.pf-c-nav__link` | `<a>` | Initiates nav list link. |
| `.pf-c-nav__section` | `<section>` | Initiates a nav section element. |
| `.pf-c-nav__section-title` | `<h1>`, `<h2>`, `<h3>`, `<h4>`, `<h5>`, `<h6>` | Initiates a nav section title. |
| `.pf-c-nav__toggle` | `<span>` | Initiates the nav toggle wrapper. |
| `.pf-c-nav__toggle-icon` | `<span>` | Initiates a nav toggle icon wrapper. |
| `.pf-c-nav__scroll-button` | `<button>` | Initiates a nav scroll button. **Required for horizontal navs** |
| `.pf-m-horizontal` | `.pf-c-nav` | Modifies nav for the horizontal variation. |
| `.pf-m-tertiary` | `.pf-c-nav` | Modifies nav for the tertiary variation. |
| `.pf-m-light` | `.pf-c-nav` | Modifies nav for the light variation. **Note: only for use with vertical navs, and requires `.pf-m-light` on the page component's sidebar element (`.pf-c-page__sidebar`)**. |
| `.pf-m-scrollable` | `.pf-c-nav` | Modifies nav for the scrollable state. |
| `.pf-m-expandable` | `.pf-c-nav__item` | Modifies for the expandable state. |
| `.pf-m-expanded` | `.pf-c-nav__item` | Modifies for the expanded state. |
| `.pf-m-current` | `.pf-c-nav__link` | Modifies for the current state. |