tabpanel
Markiert den Inhaltsbereich, der einem Tab zugeordnet ist. Jedes tabpanel wird über aria-labelledby von seinem Tab beschriftet; der Tab verweist über aria-controls auf das Panel. Es wird jeweils ein Panel angezeigt; die übrigen werden mit dem hidden-Attribut ausgeblendet.
Verwendung
Auf dem Behälter, der den Inhalt eines Tabs enthält. Jedes tabpanel wird mit aria-labelledby (auf die ID des Tabs zeigend) mit seinem Tab verknüpft. Der Tab verweist seinerseits mit aria-controls auf das Panel. Inaktive Panels werden mit dem hidden-Attribut ausgeblendet — nicht nur über display: none per CSS — damit der Accessibility-Baum den visuellen Zustand widerspiegelt.
Enthält das Panel interaktive Inhalte (ein Formular, eine Linkliste), kann das Panel mit tabindex="0" fokussierbar gemacht werden. Auf diese Weise landet der nächste Tab-Tastendruck nach dem Aktivieren eines Reiters innerhalb des Panels.
Enthält das Panel nur einen einzigen fokussierbaren Bereich — beispielsweise eine große Überschrift gefolgt von Inhalt — genügt tabindex="0" auf dem Panel. Ist das Panel mit fokussierbaren Steuerelementen gefüllt, navigieren Nutzer direkt per Tab dorthin, und das tabindex-Attribut ist optional.
Häufige Fehler
- tabpanel per CSS ausgeblendet, aber ohne
hidden-Attribut. Screenreader legen möglicherweise seinen Inhalt dennoch offen. - tabpanel ohne
aria-labelledby— wird lediglich als „Tab-Panel“ ohne Namen angesagt. - Der Tab verweist per
aria-controlsauf eine tabpanel-ID, aber das Panel verweist nicht peraria-labelledbyzurück. Die Verknüpfung muss wechselseitig sein. - Alle tabpanels befinden sich im DOM mit dynamisch umgeschaltetem
display: none, aber ohnehidden-Attribut. Auditoren bemängeln die Inkonsistenz. role="tabpanel"auf einem Panel, das NICHT mit einemrole="tab"verknüpft ist — verwaistes tabpanel.
Beispiel
<div role="tablist" aria-label="Settings">
<button role="tab" id="t-account" aria-selected="true" aria-controls="p-account" tabindex="0">Account</button>
<button role="tab" id="t-billing" aria-selected="false" aria-controls="p-billing" tabindex="-1">Billing</button>
</div>
<section role="tabpanel" id="p-account" aria-labelledby="t-account" tabindex="0">
<h2>Account</h2>
<p>…</p>
</section>
<section role="tabpanel" id="p-billing" aria-labelledby="t-billing" tabindex="0" hidden>
<h2>Billing</h2>
<p>…</p>
</section>