ARIA-Rolle ohne passendes Elternelement (aria-required-parent)

Die Regel aria-required-parent meldet ein Element, dessen ARIA-Rolle nur in einem bestimmten Container existiert – ein tab, eine option, ein menuitem, ein listitem –, das aber nicht darin steht. Hilfstechnik sagt dann einen Eintrag von nichts an: keine Anzahl, keine Position, kein Weg zu den Geschwistern. Die Lösung: die Einträge in die Container-Rolle packen, zu der sie gehören, oder ihre Rollen weglassen.

Was die Regel bedeutet

WAI-ARIA legt für manche Rollen einen „required context role“ fest: den Container, in dem sie stehen müssen. Häufige Paare:

  • tab → in einer tablist
  • option → in einer listbox (oder einer group darin)
  • menuitem, menuitemcheckbox, menuitemradio → in menu, menubar oder einer group darin
  • listitem → in einer list (oder einem nativen <ul> / <ol>)
  • row → in table, grid, treegrid oder einer rowgroup

Die Regel schlägt an, wenn der nächste Vorfahr mit einer Rolle keiner der erlaubten Container ist. Elemente ohne Rolle dazwischen – einfache <div>s – werden übersprungen. Der Container kann den Eintrag auch über aria-owns an sich binden.

Wen es betrifft

Screenreader-Nutzende. Eine Option in einer listbox wird mit ihrer Position angesagt („2 von 5“) und ist mit den Pfeiltasten erreichbar; eine Option allein ist eine Option von nichts, und die Pfeiltasten-Navigation, die die Rolle verspricht, gibt es nicht. Das ganze Widget wirkt kaputt.

Warum die Prüfung anschlägt

  • Rollen auf die Einträge kopiert, während der Container keine hat – ein <ul> mit role="menuitem"-Links, aber ohne role="menu".
  • Eine Hülle mit eigener Rolle zwischen Container und Einträgen, etwa eine benannte <section> oder role="region".
  • Einträge in einem Portal – die Optionen eines Dropdowns werden ans Ende des <body> gehängt, weit weg von ihrer listbox.
  • Vermischte Muster: role="tab" für eine Gruppe von Buttons, die gar keine Tabs sind.
  • Vorlagen, in denen der Container bedingt ausgegeben wird, die Einträge aber immer.

So beheben Sie es

Setzen Sie die Einträge in die Container-Rolle, die sie brauchen.

<!-- Vorher: Optionen ohne listbox drumherum -->
<div class="dropdown">
  <div role="option" aria-selected="true">Standardversand</div>
  <div role="option" aria-selected="false">Expressversand</div>
</div>
<!-- Nachher: die listbox, die den Optionen ihre Bedeutung gibt -->
<div class="dropdown" role="listbox" aria-label="Versandart">
  <div role="option" aria-selected="true">Standardversand</div>
  <div role="option" aria-selected="false">Expressversand</div>
</div>

Eine listbox braucht außerdem Tastaturbedienung: Fokus auf der listbox oder ihrer aktiven Option, Pfeiltasten zum Wechseln und ein aria-selected, das mitgeführt wird. Für eine einfache Auswahl liefern ein natives <select> oder Radiobuttons all das ohne ARIA.

So prüfen Sie es von Hand

  1. Wählen Sie in den Entwicklertools den Eintrag im Barrierefreiheitsbaum aus und prüfen Sie die Rolle seines Elternelements.
  2. Gehen Sie mit einem Screenreader auf einen Eintrag. Sagt er seine Position in der Gruppe an?
  3. Nutzen Sie die Pfeiltasten. Kommen Sie von Eintrag zu Eintrag, wie das Muster es verspricht?
  4. Öffnen Sie Dropdowns und Menüs, die ihre Einträge an anderer Stelle der Seite ausgeben, und prüfen Sie sie im geöffneten Zustand.

Zugehöriges WCAG-Kriterium

1.3.1 Info und Beziehungen, Stufe A. Verwandt: 4.1.2 Name, Rolle, Wert, weil eine Rolle, die an ihrer Stelle nicht funktionieren kann, Hilfstechnik etwas Falsches mitteilt.

So meldet Reviseberg diese Regel

Reviseberg führt aria-required-parent auf jeder gecrawlten Seite aus. In der Befundliste steht die Regel mit Schweregrad, WCAG 1.3.1, der Zahl der betroffenen Elemente und Seiten und den Punkten, die ein Fix zurückbringt; im Detail sehen Sie Selektor und HTML-Ausschnitt jedes Eintrags. Mehrere Einträge eines Widgets stammen meist aus einer Komponente – ein Fix dort behebt sie gemeinsam. Optionen, die erst beim Öffnen eines Dropdowns gerendert werden, stehen nicht auf der Seite, die axe prüft: Sie werden weder gefunden noch als bestanden gezählt. Öffnen Sie sie und prüfen Sie von Hand.

Verwandte Regeln

  • undefined – umgekehrt: ein Container ohne seine Einträge.
  • undefined – ein natives <li> außerhalb einer Liste.
  • undefined – Attribute, die die Rolle nicht unterstützt.

Widgets prüfen – kostenloser Scan

Häufige Fragen

Darf zwischen listbox und Optionen ein <div> stehen?

Ja, solange es keine eigene Rolle hat. Die Regel schaut auf den nächsten Vorfahren mit einer Rolle.

Mein Dropdown gibt seine Optionen am Ende des <body> aus. Was nun?

Binden Sie sie mit aria-owns an die listbox oder rendern Sie sie in der listbox. Beides stellt die Beziehung wieder her.

Ist role="listitem" in einem <ul> in Ordnung?

Ja. Eine native Liste zählt als list-Container, auch wenn <li> die Rolle schon mitbringt.

Quellen

  1. W3C, Understanding SC 1.3.1 Info and Relationships – https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships
  2. Deque University, axe-core 4.13 Regel aria-required-parent – https://dequeuniversity.com/rules/axe/4.13/aria-required-parent
  3. W3C, WAI-ARIA 1.2: Required Context Role – https://www.w3.org/TR/wai-aria-1.2/#scope
  4. W3C, ARIA Authoring Practices Guide: Listbox Pattern – https://www.w3.org/WAI/ARIA/apg/patterns/listbox/

Sehen Sie, was ein Scan auf Ihrer Website findet

Eine Seite in rund 30 Sekunden, ohne E-Mail. Der vollständige Bericht umfasst bis zu 100 Seiten und einen Tastatur-Durchlauf.