Библиотека Tabbable предназначена для определения элементов на веб-странице, которые могут получать фокус при навигации с помощью клавиши Tab. Она является инструментом для улучшения доступности интерфейсов, позволяя разработчикам корректно управлять порядком фокусировки элементов.
Элемент считается фокусируемым, если он удовлетворяет следующим условиям:
display: none или visibility: hidden, и его
размер не должен быть равен нулю.tabindex или природной интерактивности
(<input>, <button>,
<select>, <textarea>,
<a href="">).disabled, так как это делает его недоступным для
фокуса.tabbableБиблиотека предоставляет метод tabbable(node, options),
который возвращает массив элементов, доступных для фокуса.
Пример базового использования:
import { tabbable } from 'tabbable';
const container = document.getElementById('form-container');
const focusableElements = tabbable(container);
console.log(focusableElements);
node — родительский элемент, внутри которого
выполняется поиск фокусируемых элементов.
options — объект с дополнительными настройками
поиска, например:
includeContainer (boolean) — учитывать сам контейнер
как потенциальный фокусируемый элемент.getShadowRoot (function) — для работы с теневыми
DOM.tabindexАтрибут tabindex играет ключевую роль в определении
фокусируемости:
tabindex="0" — элемент становится доступным для
табуляции в естественном порядке.tabindex="-1" — элемент доступен для фокуса программно,
но не включается в порядок табуляции.tabindex > 0 — элемент получает приоритет при
табуляции (но использование положительных значений не рекомендуется
из-за нарушений порядка фокуса).Tabbable учитывает эти значения и возвращает элементы в порядке, соответствующем реальному поведению браузера.
Некоторые элементы, даже при видимости и правильных атрибутах, могут быть исключены из табуляции:
overflow: hidden и недоступными для
визуального взаимодействия.<a> без href, если не задан
tabindex.display: none родителя или скрытые
через aria-hidden="true".Для элементов внутри shadow DOM библиотека поддерживает настройку:
const focusableShadowElements = tabbable(container, {
getShadowRoot: el => el.shadowRoot
});
Это позволяет корректно обрабатывать компоненты веб-компонентов и искать фокусируемые элементы глубоко в теневых корнях.
Tabbable возвращает элементы в естественном порядке табуляции:
tabindex,
отсортированные по возрастанию.tabindex="0" или без атрибута, в
порядке появления в DOM.tabindex="-1" для обычной
табуляции.Это позволяет точно моделировать поведение браузера при навигации клавишей Tab.
Иногда требуется проверить конкретный элемент:
import { isFocusable } from 'tabbable';
const button = document.querySelector('button.submit');
if (isFocusable(button)) {
button.focus();
}
Функция isFocusable учитывает все условия: видимость,
атрибуты, состояние disabled и CSS.
Библиотека Tabbable позволяет разработчикам создавать предсказуемую и доступную навигацию по элементам страницы, обеспечивая точное определение фокусируемости и упрощая интеграцию с интерактивными компонентами.