Элемент с атрибутом tabindex="-1" не включается
в естественную последовательность табуляции, создаваемую
браузером. Это значит, что при навигации с помощью клавиши
Tab такой элемент будет пропущен, но при этом на него можно
программно установить фокус через JavaScript с помощью метода
element.focus(). Такой подход используется для управления
фокусом в интерфейсах, где необходимо динамически переводить внимание
пользователя на определённый элемент без изменения естественного порядка
навигации.
Библиотека Tabbable предназначена для определения
всех фокусируемых элементов внутри контейнера. Она анализирует DOM и
возвращает элементы, которые могут быть достигнуты через клавиатурную
навигацию. Важное свойство элементов с tabindex="-1":
tabindex="-1" исключает их из естественного
порядка табуляции.focusable внутри библиотеки. То есть, если нужно программно
установить фокус, библиотека корректно определит, что элемент можно
сфокусировать.Пример:
import tabbable from 'tabbable';
const container = document.querySelector('#form');
const allFocusable = tabbable(container, { includeContainer: false });
console.log(allFocusable);
В этом случае элементы с tabindex="-1" не будут
выведены в массиве, так как массив allFocusable
содержит только элементы, доступные через клавишу Tab.
tabindex="-1"Хотя элемент не включается в последовательность табуляции, библиотека
или собственный код могут использовать метод focus():
const hiddenButton = document.querySelector('#hidden-button');
hiddenButton.focus();
Это позволяет:
disabled и скрытыми элементамиЭлементы с tabindex="-1" не должны быть
disabled и не должны иметь display: none
или visibility: hidden, иначе фокусировка через
focus() не сработает. Библиотека Tabbable учитывает эти
ограничения при фильтрации элементов:
tabbable() исключает элементы, которые
невидимы.tabindex="-1" работает только с
элементами, реально присутствующими в визуальном потоке документа.Элементы с tabindex="-1" часто применяются в
динамических интерфейсах:
tabindex="-1", чтобы программно перевести фокус
при открытии.Пример динамической фокусировки:
function openModal(modal) {
modal.style.display = 'block';
const firstFocusable = modal.querySelector('[tabindex="-1"]');
if (firstFocusable) {
firstFocusable.focus();
}
}
Использование tabindex="-1" не изменяет порядок
табуляции остальных элементов. Это позволяет:
tabindex="-1"При вызове функции tabbable() можно использовать опцию
includeContainer, но специальной опции для включения
tabindex="-1" нет, так как библиотека ориентирована на
естественный порядок табуляции. Для получения всех фокусируемых
элементов, включая tabindex="-1", можно использовать
дополнительную проверку:
const allFocusableIncludingTabindexMinusOne = [
...tabbable(container),
...container.querySelectorAll('[tabindex="-1"]')
];
Это позволяет комбинировать автоматическое определение tabbable элементов с программным контролем фокуса на элементах, исключённых из таб-индекса.
tabindex="-1" для элементов,
которые должны быть доступны программно, но не через
Tab.tabindex="-1" на интерактивные элементы,
которые должны быть частью стандартной навигации.aria-hidden, role) и динамическим управлением
фокусом.Элементы с tabindex="-1" являются инструментом тонкого
управления фокусом и играют ключевую роль при построении доступных
динамических интерфейсов, где Tabbable помогает различать элементы,
доступные через клавиатуру, и те, на которые фокус может быть установлен
программно.