Библиотека Tabbable в JavaScript предназначена для
определения элементов на странице, которые могут быть доступны
через клавишу Tab. Это важно для обеспечения корректной
навигации по интерфейсу с клавиатуры и повышения доступности
веб-приложений. Основная цель библиотеки — выделить элементы, на которые
пользователь может перейти с помощью табуляции, учитывая их видимость и
интерактивность.
Tabbable использует строгий набор правил для определения
доступности элемента:
HTML-теги и интерактивность
<input>, <select>,
<textarea>, <button>,
<a> с атрибутом href автоматически
считаются потенциально tabbable.tabindex ≥ 0 также включаются в
список, даже если они не стандартные интерактивные элементы.Атрибут tabindex
tabindex="0" — элемент доступен для табуляции в обычном
порядке документа.tabindex="-1" — элемент исключен из последовательности
табуляции, но доступен через программный фокус
(element.focus()).tabindex > 0 — элемент получает приоритет в
последовательности табуляции, но использование положительных значений не
рекомендуется, так как нарушает естественный порядок документа.Скрытые или неактивные элементы
display: none или
visibility: hidden исключаются.<fieldset disabled> также не
tabbable.disabled игнорируются, независимо
от их типа.Проверка видимости Tabbable
учитывает не только CSS-свойства самого элемента, но и всех его предков.
Если любой из родительских элементов скрыт, вложенный элемент также
считается недоступным для табуляции.
Библиотека предоставляет несколько ключевых функций для работы с tabbable-элементами:
tabbable(container) — возвращает
массив элементов, доступных для табуляции внутри указанного
контейнера.isTabbable(element) — возвращает
булево значение, указывающее, может ли конкретный элемент быть
tabbable.focusable(element) — проверяет, может
ли элемент быть доступен для фокуса, независимо от порядка
табуляции.Пример использования:
import { tabbable, isTabbable } from 'tabbable';
const container = document.querySelector('#form');
const elements = tabbable(container);
elements.forEach(el => {
if (isTabbable(el)) {
console.log('Элемент доступен для табуляции:', el);
}
});
Для динамически создаваемых элементов библиотека проверяет актуальные
стили и атрибуты на момент вызова. Это означает, что при добавлении
элементов через JavaScript необходимо повторно вызывать
tabbable(container) для корректного определения
последовательности табуляции.
Даже если элемент с tabindex="-1" не участвует в
естественной последовательности табуляции, его можно сделать
фокусируемым программно:
const hiddenButton = document.querySelector('#hidden-btn');
if (hiddenButton) {
hiddenButton.focus();
}
Tabbable корректно обрабатывает вложенные
интерактивные элементы, исключая те, которые находятся в
скрытых контейнерах или имеют запрещенные атрибуты. Это особенно важно
для модальных окон, раскрывающихся списков и сложных форм, где требуется
точное управление последовательностью фокуса.
Библиотека допускает расширение логики через кастомные функции проверки видимости или включения специфичных элементов. Например, можно добавить проверку нестандартных видимых компонентов:
function customFocusable(element) {
return element.hasAttribute('data-custom-focus');
}
const customTabbable = tabbable(document.body).filter(customFocusable);
tabindex только при необходимости, избегая
положительных значений.tabbable для ловли фокуса внутри
контейнера, предотвращая уход фокуса за пределы модального
окна.Логика определения доступности для табуляции в Tabbable
основана на комбинации HTML-типов, атрибутов, CSS-свойств и
контекста документа. Это обеспечивает точное управление
фокусом, делает интерфейсы доступными и предсказуемыми для пользователей
с клавиатурой.
Основная ценность библиотеки заключается в том, что она освобождает разработчика от ручной проверки фокусируемых элементов и гарантирует соблюдение правил доступности.