Библиотека Tabbable предназначена для определения
элементов на веб-странице, которые могут быть достигнуты с помощью
клавиши Tab. Она учитывает не только стандартные интерактивные элементы
(<input>, <button>,
<a> с href), но и элементы с атрибутом
tabindex. Работа библиотеки строится на проверке видимости
элемента, его состояния и возможностей для фокусировки.
Tabbable использует комплексную проверку видимости, чтобы исключить элементы, которые не должны быть доступны через Tab:
CSS-свойство display Элементы с
display: none автоматически игнорируются, так как они
полностью скрыты из визуального потока документа.
CSS-свойство visibility Элементы с
visibility: hidden или visibility: collapse
считаются невидимыми и исключаются из списка табуляции.
Размер элемента Элементы с нулевой шириной или
высотой (offsetWidth и offsetHeight равны 0)
также не включаются, даже если видимость явно не отключена.
Скрытые родительские элементы Если родительский
элемент невидим (например, имеет display: none), дочерний
элемент тоже не считается доступным для табуляции.
tabindexTabindex определяет порядок фокусировки и возможность попадания элемента в таб-циклирование.
tabindex="0" — элемент доступен для Tab и следует
естественному порядку DOM.tabindex="-1" — элемент фокусируемый программно, но
недоступен через Tab.tabindex > 0 — задаёт явный приоритет в таб-цикле.
Редко используется, так как усложняет естественный порядок.Tabbable учитывает tabindex, но игнорирует элементы с
отрицательным значением при построении списка для стандартного
Tab-перехода.
Библиотека различает несколько типов элементов:
Отключённые элементы (disabled)
Кнопки, поля ввода и другие элементы с disabled исключаются
из табуляции. Даже при наличии tabindex="0" такие элементы
не доступны через Tab.
Скрытые элементы (hidden атрибут или
CSS) Элементы с атрибутом hidden полностью
игнорируются. CSS-свойства display: none или
visibility: hidden также исключают их.
Невидимые при наложении Элементы, расположенные
вне видимой области (overflow: hidden или абсолютное
позиционирование за пределами контейнера), остаются в DOM, но часто
игнорируются в логике видимости библиотеки.
Основные функции предоставляют гибкий доступ к элементам страницы:
tabbable(container) Возвращает
массив всех элементов, доступных для Tab в указанном контейнере.
Учитывает видимость, tabindex и состояние
disabled.
isTabbable(element) Проверяет,
является ли конкретный элемент доступным для табуляции. Возвращает
true или false.
focusable(container) Возвращает
элементы, которые могут быть сфокусированы программно (включая элементы
с tabindex="-1"). Полезно для работы с модальными окнами и
кастомными интерфейсными компонентами.
Фильтрация скрытых элементов
import { tabbable } from 'tabbable';
const container = document.querySelector('.form-section');
const visibleElements = tabbable(container);
console.log(visibleElements);
Этот код вернёт только видимые и активные элементы для Tab.
Проверка конкретного элемента
import { isTabbable } from 'tabbable';
const button = document.querySelector('#submit');
if (isTabbable(button)) {
console.log('Элемент доступен через Tab');
}Работа с модальными окнами Для управления
фокусом внутри модального окна удобно использовать комбинацию
tabbable() и focusable(), чтобы обеспечить
циклический Tab и исключить невидимые элементы.
Элементы внутри iframe Tabbable не
автоматически обрабатывает содержимое iframe. Для этого
нужно отдельно применять библиотеку внутри каждого фрейма.
Анимации и динамическая смена видимости Если
элемент появляется через анимацию (opacity,
transform) без изменения display или
visibility, Tabbable может считать его доступным. Для
корректной работы нужно учитывать окончательное состояние DOM.
Сложные компоненты UI Компоненты типа выпадающих
списков, табов или аккордеонов должны управлять tabindex и
состоянием disabled, чтобы библиотека правильно фильтровала
элементы.
Библиотека Tabbable делает упор на корректную фильтрацию элементов по видимости и доступности, что позволяет строить удобные и предсказуемые интерфейсы. Понимание того, какие элементы считаются доступными для Tab, а какие нет, позволяет избежать ошибок с фокусом и улучшить навигацию с клавиатуры, особенно в сложных веб-приложениях с динамическим контентом.