Verschachtelte Bedienelemente (nested-interactive)

Die Regel nested-interactive meldet ein Bedienelement, das ein weiteres fokussierbares Bedienelement enthält – einen Link in einem Button, einen Button in einem Element mit role="button". Hilfstechnik behandelt das äußere Element als eine Einheit und sieht nicht hinein, also wird das innere falsch oder gar nicht angesagt. Die Lösung: die Bedienelemente nebeneinander statt ineinander setzen.

Was die Regel bedeutet

Manche Rollen – button, link, checkbox, tab, menuitem, option und weitere – haben in WAI-ARIA „presentational children“: Alles darin wird zu ihrem Namen plattgedrückt. Ein Link in einem Button ist für einen Screenreader daher kein Link. Sein Text wird Teil des Button-Namens, und der Link selbst lässt sich beim Lesen weder erreichen noch auslösen. Tastatur-Nutzende landen per Tab vielleicht trotzdem darauf – und hören etwas, das keinen Sinn ergibt.

HTML sagt dasselbe von der anderen Seite: Ein <button> oder <a> darf keine interaktiven Inhalte enthalten. Browser reparieren solches Markup unterschiedlich, deshalb ist das Ergebnis unvorhersehbar.

Wen es betrifft

Screenreader-Nutzende, die ein Bedienelement hören, wo zwei sind, und das innere nicht erreichen. Menschen mit Sprachsteuerung, die den sichtbaren Linktext sagen und den Button drumherum auslösen. Tastatur-Nutzende, die auf zwei Tab-Halte treffen, die dasselbe tun – oder Verschiedenes, ohne dass man es unterscheiden kann.

Warum die Prüfung anschlägt

  • Klickbare Karten als <div role="button"> oder <a> mit einem „Mehr“-Link oder „Merken“-Button darin.
  • Buttons mit Icon-Links, etwa ein „Herunterladen“-Button um ein <a href>.
  • Akkordeon-Köpfe mit role="button", die einen Hilfe-Link enthalten.
  • Tabellenzeilen oder Listeneinträge, die zu Bedienelementen gemacht wurden, obwohl sie Links enthalten.
  • Komponentenbibliotheken, die in einen Button-Slot alles hineinlassen.

So beheben Sie es

Machen Sie ein Element zum Bedienelement und setzen Sie andere daneben, nicht hinein.

<!-- Vorher: ein Merken-Button in einer klickbaren Karte -->
<div class="produkt-karte" role="button" tabindex="0">
  <h2>Schreibtischlampe</h2>
  <p>49,00 €</p>
  <button type="button" aria-label="Schreibtischlampe merken">♡</button>
</div>
<!-- Nachher: Der Titel ist der Link, der Merken-Button steht daneben -->
<div class="produkt-karte">
  <h2><a href="/produkte/schreibtischlampe/">Schreibtischlampe</a></h2>
  <p>49,00 €</p>
  <button type="button" aria-label="Schreibtischlampe merken">♡</button>
</div>

Soll die ganze Karte klickbar bleiben, ziehen Sie den Link mit einem positionierten ::after über die Karte und heben den Button mit position: relative; z-index: 1 darüber. Die Karte sieht gleich aus und klickt sich gleich – nur das Markup ist nicht mehr verschachtelt.

So prüfen Sie es von Hand

  1. Gehen Sie mit Tab durch die Komponente. Treffen Sie auf zwei Halte für ein sichtbares Element oder auf einen Halt innerhalb eines anderen?
  2. Lesen Sie die Komponente mit einem Screenreader und den Pfeiltasten. Lässt sich das innere Element allein erreichen und auslösen?
  3. Sehen Sie in den Barrierefreiheitsbaum: Enthält der Name des äußeren Elements den Text des inneren, ist das das typische Zeichen.
  4. Klicken Sie jeden Teil der Karte mit der Maus an und prüfen Sie, ob er tut, was er verspricht.

Zugehöriges WCAG-Kriterium

4.1.2 Name, Rolle, Wert, Stufe A. Verwandt: 2.1.1 Tastatur, weil das innere Element unerreichbar sein kann, und 2.5.3 Beschriftung im Namen für Sprachsteuerung.

So meldet Reviseberg diese Regel

Reviseberg führt nested-interactive auf jeder gecrawlten Seite aus. In der Befundliste steht die Regel mit Schweregrad, WCAG 4.1.2, der Zahl der betroffenen Elemente und Seiten und den Punkten, die ein Fix zurückbringt; im Detail sehen Sie Selektor und HTML-Ausschnitt des äußeren Elements. Karten und Teaser wiederholen sich auf Übersichtsseiten, daher ist die Zahl der Vorkommen oft hoch – und ein Fix an der Komponente behebt sie alle.

Verwandte Regeln

Karten und Teaser prüfen – kostenloser Scan

Häufige Fragen

Wie mache ich eine ganze Karte klickbar, ohne zu verschachteln?

Setzen Sie einen echten Link auf den Titel und ziehen Sie ihn per Pseudo-Element über die Karte. Weitere Buttons in der Karte liegen darüber.

Ist ein Link in einem <label> ein verschachteltes Bedienelement?

Nein, <label> ist in diesem Sinn kein Bedienelement. Ein Link zu den AGB im Label einer Checkbox ist erlaubt – ein Link hinter dem Label ist aber leichter zu bedienen.

Hilft tabindex="-1" am inneren Element?

Es versteckt das Problem vor Tastatur-Nutzenden und lässt es für alle anderen bestehen. Verschieben Sie das Element stattdessen nach außen.

Quellen

  1. W3C, Understanding SC 4.1.2 Name, Role, Value – https://www.w3.org/WAI/WCAG22/Understanding/name-role-value
  2. Deque University, axe-core 4.13 Regel nested-interactive – https://dequeuniversity.com/rules/axe/4.13/nested-interactive
  3. W3C, WAI-ARIA 1.2: Children Presentational – https://www.w3.org/TR/wai-aria-1.2/#childrenArePresentational
  4. WHATWG, HTML Standard: the button element – https://html.spec.whatwg.org/multipage/form-elements.html#the-button-element

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.