Библиотека Tabbable в JavaScript предназначена для работы с элементами интерфейса, доступными для навигации с помощью клавиши Tab. Она обеспечивает точное определение, какие элементы страницы можно фокусировать, что особенно важно при создании сложных пользовательских интерфейсов и при реализации доступности (accessibility, a11y). Основная цель Tabbable — предоставить разработчику инструмент для вычисления наборов фокусируемых элементов, включая поддержу современных стандартов HTML и ARIA.
Идентификация фокусируемых элементов Tabbable
обходит DOM и формирует список элементов, на которые можно переместить
фокус с помощью клавиши Tab. В отличие от простого использования
document.querySelectorAll('input, button, a, select, textarea'),
библиотека учитывает:
tabindex (включая отрицательные
значения);display: none,
visibility: hidden);<details> и
<template>;aria-hidden).Порядок фокусировки Tabbable сортирует элементы по порядку табуляции, который может отличаться от порядка их расположения в DOM:
tabindex="0" следуют после естественных
элементов формы.tabindex получают приоритет и
располагаются в порядке возрастания значения tabindex.Фильтрация неактивных элементов В список не включаются:
disabled;tabindex="-1" (если не требуется
фокусировать программно);Хотя названия схожи, современная библиотека Tabbable имеет ряд ключевых отличий:
| Характеристика | tabbable (классическая) | Tabbable (современная) |
|---|---|---|
| Поддержка ES Modules | Нет | Есть |
| Работа с Shadow DOM | Ограничена | Полностью поддерживается |
| Современные ARIA-атрибуты | Частично | Полностью |
Порядок табуляции по tabindex |
Простая сортировка | Корректная сортировка по стандарту HTML |
| Размер и модульность | Больший, монолитный | Меньший, модульный |
| Типичные зависимости | Часто зависит от других библиотек | Минимальные зависимости |
Современная Tabbable ориентирована на современные веб-приложения, где используются динамические интерфейсы, компоненты внутри Shadow DOM, виртуальные списки и сложные формы. Она позволяет не только вычислять текущий порядок табуляции, но и корректно реагировать на динамические изменения DOM, что критично для SPA и React-приложений.
Импорт и базовый вызов:
import { tabbable } from 'tabbable';
const container = document.querySelector('#form');
const focusableElements = tabbable(container);
console.log(focusableElements);
tabbable(container, options) возвращает массив
фокусируемых элементов внутри container.
Опции позволяют настроить фильтры:
includeContainer — включать сам контейнер, если он
фокусируемый.getShadowRoot — функция для обработки Shadow DOM.displayCheck — проверка видимости элементов
('full', 'non-zero').Пример использования с фильтрацией элементов по ARIA:
const visibleFocusable = tabbable(container, {
displayCheck: 'full'
}).filter(el => !el.hasAttribute('aria-hidden'));
Tabbable — это современный, модульный инструмент для работы с
фокусируемыми элементами, предоставляющий точный контроль над порядком
табуляции и совместимость с современными веб-стандартами. Его отличия от
классического tabbable заключаются в расширенной поддержке Shadow DOM,
ARIA, корректной сортировке по tabindex и минимальных
зависимостях, что делает его предпочтительным выбором для современных
веб-приложений.