Библиотека Tabbable предназначена для определения всех элементов на странице, которые могут получать фокус с помощью клавиши Tab. Основное предназначение возвращаемых значений — предоставить разработчику список элементов в порядке их естественной табуляции, чтобы можно было управлять фокусом или строить собственные системы навигации.
Методы библиотеки возвращают массивы DOM-элементов, которые удовлетворяют критериям табуляции. Важно понимать, что это живые массивы, отражающие текущую структуру DOM на момент вызова функции. Изменения в DOM после получения массива не обновляют его автоматически.
tabbable()import { tabbable } from 'tabbable';
const elements = tabbable(container);
HTMLElement.href, элементы формы, элементы с
tabindex >= 0.display: none, visibility: hidden,
disabled, tabindex="-1".tabbable и focusableБиблиотека предоставляет отдельный метод
focusable(), возвращающий элементы,
которые могут быть сфокусированы, но не обязательно доступны через
Tab:
import { focusable } from 'tabbable';
const focusableElements = focusable(container);
HTMLElement.tabindex (например, tabindex="-1"), что
позволяет программно устанавливать фокус.Ключевой момент: все элементы, возвращаемые
tabbable(), гарантированно можно достичь с помощью Tab,
тогда как focusable() возвращает элементы, которые могут
быть сфокусированы вручную через JavaScript.
tabindextabindex влияет на возвращаемые значения следующим
образом:
tabindex="-1" — элемент исключается из списка
tabbable().tabindex="0" — элемент включается, позиция определяется
естественным порядком документа.tabindex положительное (1 и выше) —
элемент включается и перемещается в начало последовательности, в порядке
возрастания значения.Пример:
<button>Button 1</button>
<button tabindex="2">Button 2</button>
<button tabindex="1">Button 3</button>
const elements = tabbable(document.body);
// Порядок: Button 3, Button 2, Button 1
Методы библиотеки допускают передачу опций для фильтрации элементов:
const elements = tabbable(container, { includeContainer: true });
includeContainer — если
true, сам контейнер проверяется на tabbable и может быть
включён в результат.getShadowRoot — функция для поддержки
веб-компонентов с Shadow DOM, позволяет рекурсивно собирать
tabbable-элементы внутри Shadow DOM.Пример с пользовательской фильтрацией:
const elements = tabbable(container, {
includeContainer: false,
filter: el => el.tagName !== 'INPUT'
});
Возвращаемый массив исключит все элементы
<input>.
Возвращаемый массив не является живым списком —
изменения в DOM после вызова функции не обновляют массив
автоматически. Если структура страницы изменяется (добавление
или удаление элементов, изменение tabindex), нужно заново
вызвать метод tabbable() для актуального списка.
display: none,
visibility: hidden, disabled и
tabindex="-1".tabbable() и focusable()
различаются по критериям включения элементов с отрицательным
tabindex.Эта система возвращаемых значений позволяет строить гибкую навигацию по клавиатуре, создавать модальные окна с управлением фокусом и управлять доступностью интерфейсов в сложных веб-приложениях.