Библиотека Tabbable предназначена для определения элементов на странице, которые могут получать фокус через клавишу Tab. Она используется для управления навигацией по интерактивным компонентам, особенно в сложных интерфейсах с динамически создаваемыми элементами. Основной принцип работы библиотеки заключается в фильтрации элементов DOM, основываясь на их видимости, атрибутах и типе элементов.
Методы библиотеки возвращают массив элементов, готовых к фокусировке,
при этом учитываются стандарты доступности (ARIA) и
свойства CSS, такие как display: none и
visibility: hidden.
Каждому элементу, способному получать фокус, присваивается приоритет. Приоритет зависит от нескольких факторов:
Атрибут tabindex
tabindex="1",
tabindex="2" и т.д.) задаёт явный порядок следования при
переходе через Tab.tabindex="0" помещает элемент в естественный поток
табуляции страницы.tabindex="-1") исключают
элемент из последовательности табуляции, но элемент остаётся
фокусируемым программно.Тип элемента
input,
button, a[href], textarea,
select) автоматически имеют приоритет выше, чем обычные
контейнеры.contenteditable="true" рассматриваются как
интерактивные, но с более низким приоритетом, чем кнопки или
ссылки.Состояние видимости
display: none или
visibility: hidden, полностью исключаются из списка
tabbable.opacity: 0 остаются tabbable, если они
физически занимают место на странице.Библиотека создаёт стек элементов, упорядоченных по приоритету и последовательности в DOM. Механизм формирования стека включает:
tabindex: элементы с
положительным tabindex идут первыми, затем элементы с
tabindex="0".Внутренний стек представлен в виде массива DOM-элементов, что позволяет легко интегрировать библиотеку с другими инструментами управления фокусом.
Приоритеты дают возможность реализовать следующие сценарии:
tabindex от 1 и выше используются для установки
нестандартного порядка перехода.Элементы, которые не являются стандартными интерактивными, могут быть
включены в стек с помощью tabindex. Для более точного
управления можно использовать:
Tabbable легко интегрируется с библиотеками для управления фокусом, например, Focus Trap или компонентными библиотеками типа React и Vue. Основные рекомендации:
tabbable(container) для получения текущего
стека элементов внутри контейнера.В крупных приложениях, где DOM может содержать сотни интерактивных элементов, стоит учитывать:
tabbable для больших контейнеров,
вызывая их только при изменении интерактивных компонентов.import tabbable from "tabbable";
const modal = document.getElementById("modal");
const focusableElements = tabbable(modal);
// Переключение фокуса по Tab
focusableElements.forEach((el, index) => {
el.addEventListener("keydown", (event) => {
if (event.key === "Tab") {
const nextIndex = (index + 1) % focusableElements.length;
focusableElements[nextIndex].focus();
event.preventDefault();
}
});
});
// Фильтрация кастомных элементов
const customElements = tabbable(document.body, {
getShadowRoot: true // учитывает элементы внутри Shadow DOM
});
Подход Tabbable позволяет точно контролировать фокусировку, упорядочивать элементы по приоритету и обеспечивать доступность интерфейсов без ручного перебора DOM и сложных проверок. Это особенно важно для современных динамических веб-приложений и интерактивных компонентов.