Přístupné navigační menu
Aktualizováno 14. října 2026 · Čtení na 6 min
Hlavní navigaci použije každý návštěvník jako první a v e-shopu se často rozroste v mega menu s kategoriemi, značkami a akcemi. Nejčastější chybou přístupnosti tu není chybějící ARIA, ale špatná ARIA: role="menubar" zkopírovaná z knihovny komponent. Tato stránka vysvětluje, co APG doporučuje místo toho. Je součástí série přístupné vzory UI.
Menu, nebo disclosure? Co říká APG
APG má vzor Menu and Menubar pro aplikační menu — „seznam voleb, například akcí nebo funkcí“, který se chová jako menu v desktopových programech. Jeho příklad navigačního menubaru nese výslovné varování:
„Vzor menubar vyžaduje složité funkce, které pro běžnou navigaci webu nejsou potřeba“ … „Pro běžnou navigaci webu s rozbalovacími skupinami odkazů se lépe hodí vzor Disclosure.“
APG dodává, že vzor disclosure „se lépe hodí pro většinu webů, protože jen málo webů potřebuje dodatečné funkce klávesnice“. Jeho příklad navigace s rozbalovacími tlačítky roli menu nepoužívá, protože „neposkytuje složité funkce, které asistivní technologie očekávají“. role="menu" je slib chování menu jako v desktopových programech; pokud ho web nesplní, je menu hůř použitelné než obyčejné odkazy.
Doporučení: orientační bod nav, vnořené seznamy odkazů a rozbalovací tlačítka pro skupiny.
Související kritéria WCAG
- 2.1.1 Klávesnice (A): každé podmenu se otevře klávesnicí, ne jen najetím myší.
- 1.3.1 Informace a vztahy (A): seznamy a vnoření předávají hierarchii.
- 4.1.2 Název, role, hodnota (A): přepínací tlačítka zpřístupňují
aria-expanded. - 1.4.13 Obsah při najetí myší nebo fokusu (AA): vysouvací panely otevřené najetím myší jde zavřít (Escape) a lze na ně najet ukazatelem.
- 2.4.1 Přeskočení bloků (A): skip odkaz nebo orientační body, jak se dostat přes dlouhé menu.
- 2.4.3 Pořadí fokusu (A) a 2.4.7 Viditelný fokus (AA).
- 3.2.3 Konzistentní navigace (AA): stejné pořadí na každé stránce.
- 1.4.10 Přizpůsobení obsahu (AA) a 2.5.8 Velikost cíle (minimum) (AA) pro mobilní menu.
Příklad kódu
<nav aria-label="Hlavní">
<ul>
<li>
<button type="button" aria-expanded="false" aria-controls="nav-women">Ženy</button>
<ul id="nav-women" hidden>
<li><a href="/cs/zeny/saty">Šaty</a></li>
<li><a href="/cs/zeny/boty" aria-current="page">Boty</a></li>
</ul>
</li>
<li><a href="/cs/vyprodej">Výprodej</a></li>
</ul>
</nav>
<script>
document.querySelectorAll('nav button[aria-expanded]').forEach((button) => {
const list = document.getElementById(button.getAttribute('aria-controls'));
button.addEventListener('click', () => {
const open = button.getAttribute('aria-expanded') === 'true';
button.setAttribute('aria-expanded', String(!open));
list.hidden = open;
});
});
</script>
Poznámky:
- Pokud horní položka musí být zároveň odkazem na stránku kategorie, má APG variantu „Disclosure Navigation Menu with Top-Level Links“: odkaz a samostatné přepínací tlačítko stojí vedle sebe. Nedělejte z jednoho prvku zároveň odkaz i přepínač.
- Doplňte Escape: zavře otevřenou skupinu a vrátí fokus na její tlačítko, jak to dělá příklad v APG.
- Na mobilu je tlačítko „hamburger“ tentýž rozbalovací prvek:
aria-expanded, název například „Menu“ a panel následuje hned za ním v DOM.
Ovládání klávesnicí
Podle příkladu navigace s rozbalovacími tlačítky v APG:
| Klávesa | Funkce |
|---|---|
| Tab / Shift + Tab | Prochází tlačítky a odkazy nejvyšší úrovně, a když je skupina otevřená, i jejími odkazy |
| Enter nebo mezerník na tlačítku | Otevře nebo zavře skupinu |
| Enter na odkazu | Přejde na odkaz |
| Escape | Zavře otevřenou skupinu a vrátí fokus na její tlačítko |
| Šipky, Home, End | Volitelně: přesun mezi tlačítky a odkazy; klávesu Tab doplňují, nenahrazují |
Skutečný menubar by naopak vyžadoval šipky pro přesun mezi položkami, Tab pro opuštění celého menubaru a vyhledávání podle prvního písmene — to jsou ty „složité funkce“, o kterých APG mluví.
Časté chyby v e-shopech
- Mega menu, která se otevírají jen najetím myší; uživatelé klávesnice projdou tabulátorem horní odkazy a k podkategoriím se nikdy nedostanou.
role="menubar"arole="menuitem"na obyčejných odkazech, často ze šablony nebo pluginu, bez chování šipek.- Skrytá podmenu, která mohou dál získat fokus: Tab zmizí do neviditelných odkazů (fokus se ztratí za
opacity: 0). - Název kategorie je zároveň odkaz i přepínač, takže uživatelé dotykových obrazovek a klávesnice podmenu neotevřou.
- Chybí
aria-expanded, nebo se nikdy nezmění zfalse. - Několik orientačních bodů
navbez popisku (hlavní, patička, účet), takže je uživatelé čteček obrazovky nerozliší. - Tlačítka hamburger bez názvu a mobilní menu postavená jako překryv přes celou obrazovku, která fokus neudrží uvnitř ani ho nevrátí.
Co najde automatizovaná kontrola a co ruční testování
| Automaticky (pravidlo axe-core) | Co najde |
|---|---|
link-name, button-name |
Odkazy v menu a přepínací tlačítka nebo hamburgery bez názvu |
aria-required-children, aria-required-parent |
menu/menubar bez podřízených menuitem, menuitem mimo menu |
aria-allowed-role |
Role, které se k prvku nehodí (doporučení) |
aria-hidden-focus |
Odkazy uvnitř podmenu s aria-hidden, které mohou dál získat fokus |
list, listitem |
Porušená struktura seznamů v navigaci |
landmark-unique |
Několik navigačních orientačních bodů se stejným názvem nebo bez názvu (doporučení) |
bypass, skip-link |
Žádný způsob, jak menu přeskočit; skip odkaz s nefunkčním cílem |
target-size |
Příliš malé cíle v menu |
Všechna jsou kartami v naší knihovně pravidel. Sken vidí stránku tak, jak se načte, se zavřenými podmenu. Ruční testování: otevřete každou skupinu klávesou Enter nebo mezerníkem, ověřte, že se změní aria-expanded, stiskněte Escape, projděte tabulátorem otevřenou skupinu, ověřte, že zavřené skupiny nemohou získat fokus, a zopakujte to s mobilním menu při šířce 320 CSS pixelů. Rozšíření prohlížeče umí zkontrolovat stránku s otevřenou skupinou.
Spusťte bezplatnou kontrolu jedné stránky na své domovské stránce. Je to automatizovaná kontrola, nikoli úplný audit.
Časté otázky
Má navigace webu používat role="menu" nebo role="menubar"?
Obvykle ne. APG upozorňuje, že vzor menubar vyžaduje složité funkce, které běžná navigace webu nepotřebuje, a pro navigaci s rozbalovacími skupinami odkazů doporučuje vzor disclosure (rozbalovací tlačítka).
Co je navigace s rozbalovacími tlačítky (disclosure)?
Prvek nav se seznamem odkazů, ve kterém má každá skupina s pododkazy tlačítko s aria-expanded, které podseznam zobrazí nebo skryje. Uživatelé jím procházejí klávesami Tab, Enter a mezerníkem, stejně jako zbytkem stránky.
Jak v menu označit aktuální stránku?
Dejte aria-current="page" na odkaz na stránku, na které uživatel je, a označte ji i vizuálně, ne jen barvou.
Musí menu podporovat šipky?
Ve vzoru disclosure ne. Příklad v APG podporuje šipky, Home a End jako volitelný doplněk ke klávese Tab. Skutečný menubar naopak musí implementovat celý model ovládání šipkami.
Dokáže automatizovaná kontrola otestovat navigační menu?
Najde odkazy a tlačítka bez názvu, role menu bez položek menu, duplicitní nepojmenované navigační orientační body a skryté odkazy, které mohou získat fokus. Neotestuje, zda se podmenu otevírají klávesnicí a zda se aktualizuje aria-expanded.
Zdroje
- W3C WAI, APG Navigation Menubar example (varování k navigaci webu): https://www.w3.org/WAI/ARIA/apg/patterns/menubar/examples/menubar-navigation/
- W3C WAI, APG Menu and Menubar pattern: https://www.w3.org/WAI/ARIA/apg/patterns/menubar/
- W3C WAI, APG Disclosure pattern: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/
- W3C WAI, APG Disclosure Navigation Menu example: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/
- W3C WAI, APG Menu Button pattern: https://www.w3.org/WAI/ARIA/apg/patterns/menu-button/