tabbable — это специализированная библиотека для
определения элементов на странице, которые могут получать фокус через
клавишу Tab. Она играет ключевую роль при создании
доступных интерфейсов, управлении модальными окнами, меню и кастомными
компонентами. Библиотека учитывает атрибуты tabindex,
видимость элемента, а также его состояние (disabled,
hidden).
Подключение библиотеки в проект:
import { tabbable } from 'tabbable';
// Получение всех табулируемых элементов внутри контейнера
const container = document.querySelector('#my-container');
const focusableElements = tabbable(container);
console.log(focusableElements);
tabbable() принимает один аргумент — контейнер,
в пределах которого будет выполняться поиск.document.body.tabindex и
его влияниеtabindex контролирует порядок фокусировки:
tabindex="0" — элемент фокусируется в естественном
порядке документа.tabindex="-1" — элемент фокусируется только программно,
tabbable его не включит.tabindex с положительным значением — приоритет
фокусировки выше, чем у элементов с 0.tabbable учитывает эти значения при формировании списка
элементов. Элементы с отрицательным tabindex исключаются из
итогового массива.
Библиотека проверяет:
display: none или visibility: hidden —
элементы исключаются.display: none также делает
дочерние элементы недоступными для табуляции.disabled на элементах
формы.const focusable = tabbable(container).filter(el => !el.disabled && el.offsetParent !== null);
includeContainer)Ключевая опция includeContainer позволяет включить сам
контейнер в список табулируемых элементов, если он удовлетворяет
условиям фокусировки:
import { tabbable } from 'tabbable';
const container = document.querySelector('#modal');
const focusableElements = tabbable(container, { includeContainer: true });
console.log(focusableElements);
includeContainer: true — если
контейнер сам может быть фокусирован, он будет добавлен в начало
массива.includeContainer: false (по умолчанию) проверка
распространяется только на дочерние элементы.Пример сценария: модальное окно с фокусируемым контейнером
const modal = document.querySelector('#modal');
const elements = tabbable(modal, { includeContainer: true });
console.log(elements); // ['#modal', кнопка 'Сохранить', кнопка 'Отмена']
В интерактивных виджетах часто требуется точный контроль фокуса.
Использование includeContainer позволяет:
При больших деревьях DOM важно учитывать:
includeContainer только там, где это
реально необходимо.tabbable() без изменений
структуры DOM.const modalElements = tabbable(modal, { includeContainer: true });
// кэширование элементов для повторного использования
includeContainerdisabled и видимости
обеспечивает полное соответствие стандартам доступности.