tab
Обозначава елемент като един таб в интерфейс с табове. Табът ТРЯБВА да е вътре в tablist и ТРЯБВА да реферира асоциирания tabpanel чрез aria-controls. Няма нативен HTML елемент за таб — таб шаблонът е изцяло базиран на ARIA.
Кога да се използва
За един таб в хоризонтално или вертикално наредена лента с табове. Табът ТРЯБВА да е пряк дъщерен елемент на role="tablist" (или да е обхванат чрез aria-owns). Всеки таб ТРЯБВА да сочи към асоциирания си панел с aria-controls="<tabpanel-id>". Реципрочният aria-labelledby се поставя на панела и сочи обратно към таба.
Таб шаблонът е приложен шаблон. Ако „табовете” всъщност са навигация между отделни страници, използвайте <nav> с <a> връзки — промяната на URL прави таб шаблона неподходящ.
Самият таб обикновено е <button>. Семантиката на бутона се съчетава добре с role="tab", а обработката на фокуса и активирането се получава безплатно.
Договор за клавиатура и фокус
Съгласно APG шаблона за табове:
- Tab премества фокуса в tablist — върху активния таб. Tab премества фокуса ИЗВЪН към следващия фокусируем елемент (обикновено в tabpanel, ако има
tabindex="0"). - Клавишите Наляво/Надясно (или Нагоре/Надолу при вертикални tablists) преместват фокуса между табовете.
- Home / End прескачат към първия / последния таб.
- Активирането може да е автоматично (фокус = избор) или ръчно (Space/Enter за избор). Изберете ръчно, когато активирането на таб задейства ресурсоемка операция.
Използвайте роуминг tabindex: само избраният таб има tabindex="0".
Чести грешки
- Всички табове с
tabindex="0"— Tab обхожда всеки таб вместо панела. - Липсващ
aria-controls, свързващ таба с tabpanel. aria-selected="true"на повече от един таб.- Табове, реализирани с
<a href="#section">— URL фрагментът се променя, бутонът „назад” вече навигира между табове и шаблонът се разпада. - Липса на управление на фокуса при активиране: кликването върху таб актуализира панела, но следващото натискане на Tab връща фокуса в заглавието на страницата вместо в панела.
Пример
<div role="tablist" aria-label="Account settings">
<button role="tab" id="t-profile" aria-selected="true" aria-controls="p-profile" tabindex="0">Profile</button>
<button role="tab" id="t-billing" aria-selected="false" aria-controls="p-billing" tabindex="-1">Billing</button>
<button role="tab" id="t-security" aria-selected="false" aria-controls="p-security" tabindex="-1">Security</button>
</div>
<section role="tabpanel" id="p-profile" aria-labelledby="t-profile" tabindex="0">…</section>
<section role="tabpanel" id="p-billing" aria-labelledby="t-billing" hidden>…</section>
<section role="tabpanel" id="p-security" aria-labelledby="t-security" hidden>…</section>