treeitem
Oznacza element jako węzeł wewnątrz drzewa. treeitem może być rozwijalny (rodzic kolejnych węzłów) lub końcowy (liść). Stosuj wyłącznie przy budowie hierarchicznego nawigatora — eksploratora plików, schematu organizacyjnego, zagnieżdżonych kategorii — z nawigacją strzałkami i jednym punktem tabulacji.
Kiedy stosować
Wewnątrz role="tree" — dla każdego widocznego węzła. Jeśli węzeł ma dzieci, ustaw aria-expanded="true" lub "false" i umieść (lub powiąż) role="group" zawierający podrzędne treeitemy. Jeśli węzeł jest liściem, całkowicie pomiń aria-expanded (NIE ustawiaj go na "false" — oznajmiałoby to „zwinięty”, mimo że nie ma nic do rozwinięcia).
Ustaw aria-level (głębokość liczona od 1), aria-posinset (pozycja wśród rodzeństwa, od 1) i aria-setsize (łączna liczba rodzeństwa) dla każdego treeitemu, gdy wizualne zagnieżdżenie nie wynika wprost ze struktury DOM.
Jeśli chodzi wyłącznie o „listę linków z zagnieżdżonymi podlinkami”, lepszym wyborem jest <nav> z zagnieżdżonymi <ul> i <a>. Widok drzewa stosuj tylko wtedy, gdy doświadczenie stanowi hierarchiczny przeglądacz z jednym punktem tabulacji.
Kontrakt klawiaturowy i fokus
Zgodnie z wzorcem APG treeview:
- Tab przenosi fokus do drzewa, na bieżący treeitem; kolejny Tab przenosi fokus poza drzewo.
- Strzałki góra/dół przesuwają fokus między widocznymi węzłami (pomijając zwinięte dzieci).
- Strzałka w prawo: jeśli węzeł jest zwinięty — rozwija go; jeśli rozwinięty — przenosi do pierwszego dziecka.
- Strzałka w lewo: jeśli węzeł jest rozwinięty — zwija go; jeśli zwinięty — przenosi do rodzica.
- Home / End przenosi do pierwszego / ostatniego widocznego węzła.
- Enter lub Spacja aktywuje (zaznacza) bieżący element.
- Podpowiadanie typem: wpisanie litery przenosi fokus do kolejnego pasującego widocznego węzła.
Częste błędy
aria-expanded="false"na węźle-liściu — oznajmia fałszywy stan „zwinięty”.- Każdy treeitem ma
tabindex="0". Wzorzec zakłada jeden punkt tabulacji; tylko aktualnie sfokusowany element niesietabindex="0". - Strzałki prawo/lewo użyte do przechodzenia między rodzeństwem zamiast do rozwijania/zwijania.
- Podrzędne treeitemy umieszczone bezpośrednio w rodzicielskim
<li>bez opakowującegorole="group". Czytniki ekranu nie mogą wtedy ogłosić grupy jako całości. - Brak
aria-levelprzy płaskim DOM (np. gdy drzewo renderowane jest z pozycjonowaniem absolutnym).
Przykład
<ul role="tree" aria-label="Files">
<li role="treeitem" aria-expanded="true" tabindex="0">
Documents
<ul role="group">
<li role="treeitem" tabindex="-1">Resume.pdf</li>
<li role="treeitem" aria-expanded="false" tabindex="-1">
Photos
<ul role="group">
<li role="treeitem" tabindex="-1">2025-summer.jpg</li>
</ul>
</li>
</ul>
</li>
<li role="treeitem" tabindex="-1">Downloads</li>
</ul>