В HTML атрибут tabindex управляет порядком фокусировки
элементов при навигации с клавиатуры. Значение 0 играет
особую роль: оно делает элемент доступным для фокусировки через
клавиатуру, но не задаёт конкретный порядок в
последовательности табуляции. Элементы с tabindex="0"
следуют естественному порядку документа.
<button>, <a href="">,
<input>), остаются фокусируемыми и без
tabindex.tabindex="0" позволяет сделать
фокусируемым элемент, который обычно фокус не принимает
(например, <div> или <span>).<div tabindex="0">Фокусируемый блок</div>
<span tabindex="0">Ещё один фокусируемый элемент</span>
В этом примере оба элемента можно достичь с помощью клавиши Tab в том порядке, в котором они находятся в документе.
tabindex="1",
"2" и т.д.) создают явный порядок
табуляции, который опережает элементы с
tabindex="0".tabindex="-1")
делает элемент невидимым для последовательной
навигации, но фокусируемым программно через
JavaScript (element.focus()).tabindex="0" находится между этими двумя
подходами: элемент участвует в естественном порядке, но не
нарушает привычную табуляцию.
Библиотека Tabbable предоставляет функции для определения, какие
элементы на странице доступны для фокуса. Она учитывает
все атрибуты tabindex, включая 0.
Основные моменты:
tabbable(container) возвращает массив всех
элементов внутри container, которые можно достичь с
клавиатуры.tabindex="0" включаются
автоматически, так как они соответствуют стандартам
фокусируемости.tabindex отрицательным (-1)
не попадают в этот список, если явно не использовать
методы для поиска всех фокусируемых элементов
(focusable()).Пример использования Tabbable:
import { tabbable } from 'tabbable';
const container = document.getElementById('form-container');
const focusableElements = tabbable(container);
focusableElements.forEach(el => {
console.log(el.tagName, el.tabIndex);
});
Вывод покажет все элементы, включая
<div tabindex="0"> и стандартные элементы формы, но
исключит те с tabindex="-1".
Добавление интерактивности к блокам
tabindex="0" часто используют для элементов
<div> или <span> с кастомными
интерактивными компонентами, такими как кнопки, вкладки или
аккордеоны.
Сохранение естественного порядка табуляции Использование нулевого значения позволяет не вмешиваться в порядок стандартных элементов формы, сохраняя предсказуемость для пользователей клавиатуры.
Совместимость с ARIA Для элементов с
role="button" или role="tab" атрибут
tabindex="0" обеспечивает корректную фокусируемость без
нарушения семантики.
<div role="button" tabindex="0">Пользовательская кнопка</div>
tabindex Положительные значения
усложняют поддержку и могут вызвать неожиданные прыжки фокуса.
tabindex="0" является безопасной альтернативой для
большинства случаев.tabindex="0"Использование нулевого значения tabindex является
лучшей практикой для создания доступных и управляемых
интерфейсов без нарушения стандартной логики табуляции.