Библиотека Tabbable предназначена для управления
фокусируемыми элементами на веб-странице, обеспечивая точное определение
элементов, которые можно достигнуть с помощью клавиши Tab.
В контексте вложенных контейнеров это особенно важно, поскольку
структура DOM может включать несколько уровней вложенности, и необходимо
корректно обрабатывать фокус внутри таких структур.
Любой DOM-элемент может выступать в роли контейнера для фокусируемых элементов. Фокусируемыми считаются:
<input> и <textarea><button> и <select>tabindex="0" или положительным
значениемcontenteditable="true"Вложенные контейнеры создают иерархию, где фокусируемые элементы одного блока могут быть изолированы от элементов внешнего блока. Tabbable учитывает это и позволяет:
Метод tabbable(container) возвращает массив элементов,
доступных для табуляции внутри переданного контейнера:
import tabbable from 'tabbable';
const container = document.getElementById('parent');
const focusableElements = tabbable(container);
console.log(focusableElements);
При этом, если в контейнере присутствуют вложенные элементы с
собственными интерактивными блоками, Tabbable корректно
их обрабатывает. Элементы с атрибутом tabindex="-1"
исключаются, что позволяет создавать области, недоступные для
табуляции.
Вложенные контейнеры могут содержать элементы с явно заданным
порядком через tabindex. Библиотека учитывает:
tabindex — элементы с меньшим
числом получают приоритет.0 — стандартный порядок в DOM.-1 — элемент исключается из
последовательности табуляции.Пример управления порядком:
<div id="outer">
<input type="text" tabindex="2">
<div id="inner">
<button tabindex="1">Внутренняя кнопка</button>
<input type="text">
</div>
<button>Кнопка внешняя</button>
</div>
const outerContainer = document.getElementById('outer');
const elements = tabbable(outerContainer);
elements.forEach(el => console.log(el.tagName, el.tabIndex));
В результате библиотека вернёт элементы в порядке: кнопка внутри
inner (tabindex=1), текстовое поле внешнего
блока (tabindex=2), остальные элементы с
tabindex=0 в DOM-последовательности.
Особенно важна работа с динамически создаваемыми или модальными контейнерами:
tabbable внутри
модального контейнера, чтобы ограничить фокус только элементами
модалки.tabbable на нужном
уровне.Пример для модального окна:
const modal = document.querySelector('.modal');
const modalElements = tabbable(modal);
// Фокус на первый элемент
modalElements[0].focus();
В сложных интерфейсах с несколькими вкладками или панелями часто
требуется исключить фокус для скрытых контейнеров.
Tabbable позволяет фильтровать элементы с
использованием CSS-свойств display: none или
visibility: hidden. Вложенные элементы таких контейнеров
автоматически исключаются:
const allFocusable = tabbable(document.body, { includeContainer: false });
Опция includeContainer позволяет включить сам контейнер
в список, если он фокусируемый, что полезно для интерактивных
панелей.
Вложенные контейнеры могут включать iframe.
Tabbable может работать с элементами внутри
iframe, если доступ к документу iframe разрешён через тот
же источник. Для этого используется:
const iframeDocument = document.querySelector('iframe').contentDocument;
const iframeFocusable = tabbable(iframeDocument.body);
Таким образом, элементы внутри iframe обрабатываются как
отдельный контейнер без влияния на внешние фокусируемые элементы.
tabindex осознанно, особенно в сложных
вложенных интерфейсах, чтобы управлять естественным порядком
табуляции.tabbable локально и управлять фокусом программно, чтобы
исключить уход фокуса наружу.Вложенные контейнеры в Tabbable обеспечивают гибкое и предсказуемое управление фокусом, позволяя создавать сложные интерфейсы с глубокими иерархиями без нарушения пользовательской навигации с клавиатуры.