Библиотека Tabbable в JavaScript предназначена для
определения элементов на странице, которые могут быть достигнуты с
помощью клавиши Tab. Она широко применяется при создании
доступных интерфейсов, управлении фокусом и тестировании
пользовательских интерфейсов. Основная цель — выявление элементов,
доступных для табуляции, с учётом всех стандартов доступности.
Tabbable работает по принципу обхода DOM и фильтрации элементов на основе их видимости, атрибутов и семантики. Она возвращает массив элементов, отсортированных в порядке их естественного табулируемого следования.
tabbable(element, options) — главный метод
библиотеки. Возвращает массив элементов, которые можно выбрать с помощью
Tab. Параметры:
element — родительский DOM-узел, внутри которого
проводится поиск. Если не указан, поиск выполняется по всему
документу.
options — объект с настройками, например:
includeContainer — включает ли корневой элемент в
проверку.getShadowRoot — функция для работы с shadow DOM.isTabbable(element, options) — проверяет,
является ли конкретный элемент табулируемым. Возвращает
true или false.
focusable(element, options) — определяет, можно ли элемент сфокусировать программно. Отличие от tabbable: элемент может быть фокусируемым, но не обязательно входить в порядок табуляции.
Tabbable использует несколько ключевых критериев для определения табулируемых элементов:
Видимость элемента
display не
none, visibility не hidden,
opacity > 0).Атрибуты и семантика
<input>, <button>,
<select>, <textarea> табулируемы
по умолчанию.tabindex="0" также входит в порядок
табуляции.tabindex="-1" исключаются из естественного
порядка, но остаются фокусируемыми программно.Состояние disabled
disabled не попадают в список
tabbable.<fieldset disabled> отключаются все вложенные
элементы, кроме элементов с атрибутом disabled=false.Shadow DOM
getShadowRoot.Порядок табуляции определяется атрибутом
tabindex. Значения:
0 — элемент доступен в естественном порядке DOM.tabindex="0". Использование больших чисел усложняет
управление порядком и не рекомендуется.-1 — элемент исключён из табуляции, но может быть
сфокусирован программно через focus().Динамическое изменение tabindex позволяет
управлять доступностью элементов без удаления их из DOM. Например,
модальные окна часто устанавливают tabindex="-1" для
элементов вне окна, чтобы ограничить фокус внутри.
Tabbable удобно использовать для проверки доступности форм:
Автоматическая навигация по формам
Tab.Сброс и управление фокусом
После ошибки валидации фокус можно программно устанавливать на первый невалидный элемент:
const invalidFields = tabbable(form).filter(el => !el.validity.valid);
if (invalidFields.length > 0) {
invalidFields[0].focus();
}Динамическое отображение ошибок
Для компонентов, созданных с использованием div/span, нужно явно
задавать tabindex:
tabindex не попадёт в массив tabbable.tabindex="0".tabbable() и
focus().Пример:
const modal = document.querySelector('#modal');
const focusableElements = tabbable(modal, { includeContainer: true });
focusableElements.forEach(el => console.log(el));
Tabbable — это не просто инструмент для обхода DOM. Он предоставляет структурированный и предсказуемый способ управления фокусом и доступностью, делая формы и интерфейсы более надёжными и удобными для пользователей с клавиатурой и вспомогательными технологиями.