Кратко
СкопированоСамостоятельная роль виджета из WAI-ARIA, которая означает содержимое или панель вкладки.
В HTML нет тега, похожего на роль tabpanel
.
Пример
Скопировано<div role="tabpanel" id="tabpanel-1" aria-labelledby="tab-1" tabindex="0"> <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p></div>
<div role="tabpanel" id="tabpanel-1" aria-labelledby="tab-1" tabindex="0" > <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p> </div>
При фокусе на содержимом вкладки скринридер прочтёт его примерно так: «Тапиры. Травоядные животные с коротким хоботом, которые живут в лесу».
Как пишется
СкопированоРоль tabpanel
можно задать любому тегу, но лучше всего подходят нейтральные <div>
и <span>
.
Элемент с ролью tabpanel
добавляют после списка вкладок с ролью tablist
.
<!-- Список вкладок --><div role="tablist" aria-label="Необычные животные"> <!-- Вкладка --></div><!-- Содержимое вкладки--><div role="tabpanel" id="tab-1"> <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p></div>
<!-- Список вкладок --> <div role="tablist" aria-label="Необычные животные" > <!-- Вкладка --> </div> <!-- Содержимое вкладки--> <div role="tabpanel" id="tab-1" > <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p> </div>
Обязательно свяжите содержимое tabpanel
с нужной вкладкой tab
. Для этого используйте атрибут aria
для tab
и добавьте id
с таким же значением к tabpanel
.
<button role="tab" aria-controls="tabpanel-1"> Тапиры</button><div role="tabpanel" id="tabpanel-1"> <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p></div>
<button role="tab" aria-controls="tabpanel-1" > Тапиры </button> <div role="tabpanel" id="tabpanel-1" > <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p> </div>
Другой способ связать tabpanel
с tab
— использовать атрибут aria
для содержимого вкладки.
<button role="tab" id="tab-1"> Тапиры</button><div role="tabpanel" aria-labelledby="tab-1"> <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p></div>
<button role="tab" id="tab-1" > Тапиры </button> <div role="tabpanel" aria-labelledby="tab-1" > <p>Травоядные животные с коротким хоботом, которые живут в лесу.</p> </div>
У aria
пока плохая поддержка, так что часто для надёжности этот атрибут совмещают с aria
.
Элементам с ролью tabpanel
можно также задавать все остальные глобальные ARIA-атрибуты и некоторые атрибуты виджетов.
Содержимое вкладки тоже должно получать фокус с клавиатуры, как сама вкладка. Поэтому задайте tabpanel
атрибут tabindex
со значением 0
. В этом случае пользователь попадёт на связанное содержимое активной вкладки, если нажмёт на Tab.
Когда вкладка неактивна, то нужно скрыть связанное с ней содержимое tabpanel
. Это можно сделать с помощью атрибута hidden
или CSS-свойств display
и visibility
. Важно выбрать способ, который точно скроет содержимое вкладки не только визуально, но и от скринридера. Больше узнать об этом можно из «Как скрыть содержимое от скринридеров».
Внутри tabpanel
можно размещать любое содержимое, не только текст.
Поддержка клавиатуры
СкопированоКогда пользователь перешёл к tablist
с помощью Tab, в фокусе должна оказаться первая активная вкладка с ролью tab
. При повторном нажатии Tab в фокусе оказывается содержимое вкладки.
Между горизонтальными вкладками перемещаемся стрелками влево и вправо, а вертикальными — вверх и вниз. Когда на вкладке сделан фокус, она может раскрываться либо автоматически, либо после нажатия на Enter или пробел.
Если со вкладкой связано выпадающее меню, то рекомендуют поддерживать для его открытия сочетание клавиш Shift + F10.
Дополнительно, но не обязательно, можно добавить поддержку Home для возврата к первой вкладке, End для перехода к последней вкладке, Delete для закрытия текущей вкладки и перехода к следующей или предыдущей в зависимости от количества вкладок.
Как понять
СкопированоВкладки — это популярный паттерн в вебе и десктопных программах. Когда нажимаешь на название вкладки, открывается новая область с её содержимым или целая страница, как в браузерах.
Устройство вкладок в виде схемы: