Библиотека Tabbable предназначена для определения
элементов страницы, на которые можно попасть с помощью клавиши Tab. Её
ключевая функция — tabbable(), которая
возвращает массив элементов, доступных для фокусировки. Одной из важных
возможностей является ограничение области поиска, что
позволяет работать только с частью DOM, а не со всей страницей.
Функция tabbable() принимает первым аргументом
контейнер DOM, внутри которого будет происходить поиск.
Если контейнер не указан, поиск выполняется по всему документу.
import { tabbable } from 'tabbable';
const container = document.getElementById('form-section');
const focusableElements = tabbable(container);
console.log(focusableElements);
// выведет только элементы внутри #form-section, доступные для Tab
Ключевой момент: элементы за пределами указанного контейнера игнорируются, что особенно важно для сложных интерфейсов с модальными окнами или виджетами.
Библиотека позволяет использовать селекторы CSS совместно с контейнерами для более точного контроля. Например, можно исключить элементы с определённым классом:
const focusableInputs = tabbable(container).filter(el => !el.matches('.disabled'));
Таким образом, поиск становится гибким и может учитывать динамические состояния элементов: скрытые, отключённые или замороженные элементы будут исключены.
Tabbable по умолчанию выполняет рекурсивный поиск по всем потомкам контейнера. Это означает, что даже если элемент находится в глубоко вложенном списке или секции, он будет найден, если удовлетворяет условиям фокусируемости.
const modalElements = tabbable(document.getElementById('modal'));
// Включает и
Важно: если внутри контейнера есть скрытые блоки
(display: none, visibility: hidden), они
автоматически исключаются из поиска.
Кроме фильтрации через CSS, библиотека поддерживает
исключения через атрибуты. Например, можно пометить
элементы атрибутом tabindex="-1" для их игнорирования:
const visibleElements = tabbable(container);
// input с tabindex=-1 не попадет в массив
Аналогично можно динамически изменять tabindex, чтобы
контролировать доступность элементов в зависимости от состояния
интерфейса.
Для сложных интерфейсов часто используют сочетание контейнеров, фильтров и атрибутов:
const formContainer = document.getElementById('form');
const focusable = tabbable(formContainer)
.filter(el => !el.disabled && !el.closest('.hidden-section'));
console.log(focusable);
tabbable(formContainer) ограничивает область
поиска..filter(el => !el.disabled) исключает отключённые
элементы..closest('.hidden-section') позволяет исключить целые
скрытые секции.Такой подход гарантирует точный контроль над навигацией по клавише Tab.
tabbable(container).Ограничение области поиска является фундаментом для
управления последовательностью фокуса. В сочетании с
методами focus() и focusFirst() из библиотек,
основанных на tabbable, можно создавать полностью управляемые
пользовательские интерфейсы, где навигация клавишами Tab предсказуема и
безопасна.