tabpanel
Oznacza panel treści powiązany z kartą. Każdy tabpanel jest etykietowany przez swój tab przez aria-labelledby; tab wskazuje panel przez aria-controls. Wyświetlaj jeden panel jednocześnie; pozostałe ukrywaj atrybutem hidden.
Kiedy używać
Na kontenerze przechowującym treść dla karty. Powiąż każdy tabpanel z jego kartą przez aria-labelledby (wskazujące na identyfikator karty). Karta z kolei wskazuje panel przez aria-controls. Ukrywaj nieaktywne panele atrybutem hidden — nie tylko przez display: none w CSS — aby drzewo dostępności odzwierciedlało stan wizualny.
Jeśli panel zawiera interaktywną treść (formularz, listę łączy), możesz uczynić panel fokusowanym przez tabindex="0". Dzięki temu po aktywacji karty kolejne naciśnięcie Tab trafia do panelu.
Jeśli panel zawiera jeden duży nagłówek z treścią, tabindex="0" na panelu wystarczy. Jeśli panel jest pełen kontrolek interaktywnych, użytkownik dotrze do nich przez Tab bezpośrednio i tabindex jest opcjonalny.
Typowe błędy
- Tabpanel ukryty przez CSS, ale bez atrybutu
hidden. Czytniki ekranu mogą nadal ujawniać jego treść. - Tabpanel bez
aria-labelledby— ogłaszany tylko jako „panel kart” bez nazwy. - Karta wskazuje tabpanel przez
aria-controls, ale panel nie wskazuje z powrotem przezaria-labelledby. Powiązanie musi być wzajemne. - Wszystkie tabpanel są w DOM z dynamicznie przełączanym
display: none, ale bez atrybutuhidden. Audytorzy oznaczają tę niespójność. - Umieszczenie
role="tabpanel"na panelu, który NIE jest powiązany zrole="tab"— osierocony tabpanel.
Przykład
<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>