Библиотека Tabbable предназначена для определения
элементов страницы, которые могут получать фокус с помощью клавиши
Tab. Она обеспечивает точное соответствие стандартам
HTML и учитывает различные атрибуты, такие как tabindex,
disabled, hidden и CSS-свойства, влияющие на
видимость и доступность элементов.
Главный принцип работы — фильтрация элементов DOM по их способности быть фокусируемыми через клавиатуру. Это позволяет строить доступные интерфейсы и управлять порядком навигации по элементам.
Основной экспорт библиотеки — функция tabbable(),
которая принимает контейнер DOM и возвращает массив элементов, доступных
для табуляции. Сигнатура:
tabbable(container: HTMLElement, options?: {includeContainer?: boolean, displayCheck?: "full" | "non-zero" | "none"}): HTMLElement[]
container — элемент, внутри которого производится поиск табулируемых элементов.
options.includeContainer — если
true, контейнер будет проверяться на фокусируемость наряду
с дочерними элементами.
options.displayCheck — определяет метод проверки видимости элементов:
"full" — элементы полностью видимы (стандартная
проверка);"non-zero" — элементы с ненулевым размером;"none" — отключает проверку видимости.Возвращается массив элементов, отсортированных в порядке их естественной табуляции.
Для проверки конкретного элемента на возможность получения фокуса
используется функция isTabbable():
isTabbable(element: HTMLElement, options?: {displayCheck?: "full" | "non-zero" | "none"}): boolean
tabbable(), управляет проверкой видимости.true, если элемент может быть включен в
последовательность табуляции, иначе false.Пример использования:
const button = document.querySelector('button#submit');
if (isTabbable(button)) {
console.log("Кнопка доступна для табуляции");
}
Особенности проверки:
disabled всегда исключаются.tabindex="-1" игнорируются.display: none или
visibility: hidden, исключаются при проверке
"full" и "non-zero".opacity: 0 включаются, если только
используется "full" проверка, которая учитывает видимость
через CSS.tabindex и
его влияниеtabindex="0" — элемент включается в
естественный порядок табуляции.tabindex>0 — элемент перемещается
на соответствующую позицию в порядке табуляции. Элементы с положительным
tabindex появляются до элементов с
tabindex=0.tabindex="-1" — элемент исключен из
последовательности табуляции, но остаётся фокусируемым программно
(element.focus()).Tabbable учитывает все эти значения при вычислении списка табулируемых элементов и при проверке конкретного элемента.
Для точной проверки фокусируемости библиотека анализирует компьютед стили:
display: none и visibility: hidden
исключают элемент.display: none делает недоступными все
дочерние элементы.position: fixed или absolute
остаются фокусируемыми, если видимы.overflow: hidden не влияет на проверку табуляции.Использование опции displayCheck: "none" позволяет
игнорировать визуальную видимость и проверять только атрибуты и
tabindex.
const modal = document.getElementById('modal');
const submitButton = modal.querySelector('button.submit');
if (isTabbable(submitButton)) {
submitButton.focus();
}
const form = document.querySelector('form#registration');
const tabbableFields = tabbable(form);
tabbableFields.forEach((field, index) => {
console.log(index, field.tagName, field.id);
});
includeContainerconst container = document.getElementById('container');
const tabbableElements = tabbable(container, {includeContainer: true});
console.log(tabbableElements.includes(container)); // true, если контейнер фокусируем
<div role="button">) важно правильно выставлять
tabindex и проверять доступность через
isTabbable().display требуют повторной
проверки после изменения DOM или стилей.isTabbable() — точный инструмент для определения, может
ли элемент получать фокус с клавиатуры.tabbable() позволяет строить
корректные и доступные интерфейсы с управляемой навигацией
клавиатурой.Эти функции становятся основой при создании форм, модальных окон и сложных компонентов, где правильная табуляция критична для доступности.