Библиотека Tabbable предназначена для определения
элементов на веб-странице, которые могут получать фокус с помощью
клавиши Tab. Она анализирует DOM и возвращает массив
элементов, готовых к табуляции, учитывая их видимость, атрибуты и стили.
Ключевое преимущество — точное управление фокусом, особенно в сложных
интерфейсах с модальными окнами, кастомными компонентами и динамическим
контентом.
В контексте клиппинга и overflow важно понимать, что не все видимые элементы автоматически доступны для фокуса. Tabbable учитывает визуальную доступность и CSS-свойства, влияющие на отображение и интерактивность.
overflow на табуляциюЭлемент с overflow: hidden, scroll или auto может
визуально обрезать дочерние элементы. Если элемент находится внутри
контейнера с ограниченной областью видимости, то даже при наличии
стандартных атрибутов tabindex или disabled,
Tabbable проверяет, виден ли элемент для пользователя,
и исключает полностью скрытые или обрезанные элементы.
Примеры:
.container {
width: 200px;
height: 100px;
overflow: hidden;
}
<div class="container">
<button>Кнопка 1</button>
<button style="margin-top: 120px;">Кнопка 2</button>
</div>
В этом случае Кнопка 2 окажется вне видимой области контейнера. Tabbable её не будет включать в список tabbable-элементов, потому что элемент полностью скрыт пользователю визуально.
Клиппинг — это процесс обрезки содержимого элемента,
выходящего за пределы его контейнера. Библиотека
Tabbable учитывает bounding client
rect элементов и проверяет, пересекается ли видимая часть
элемента с областью просмотра. Элементы, полностью спрятанные за
границами родителя с overflow: hidden, считаются
невидимыми для фокуса.
Пример Jav * aScript:
import tabbable from "tabbable";
const container = document.querySelector(".container");
const focusableElements = tabbable(container);
console.log(focusableElements);
Если один из элементов полностью скрыт клиппингом, он не попадет в
массив focusableElements. Это особенно важно при работе с
модальными окнами, всплывающими панелями и элементами с динамическим
позиционированием.
Элементы с position: absolute или
position: fixed могут визуально выходить за границы
родительских контейнеров с ограничением overflow.
Tabbable анализирует их видимость:
overflow: hidden исключаются.position: fixed) проверяются
относительно окна браузера, а не родителя.Пример:
<div class="container" style="overflow: hidden; height: 100px;">
<button style="position: absolute; top: 120px;">Кнопка</button>
</div>
Такой элемент будет проигнорирован библиотекой при вычислении tabbable-элементов.
clip-path и
visibilityCSS-свойства, такие как clip-path,
visibility: hidden и opacity: 0, также влияют
на результат работы Tabbable:
clip-path вне видимой области считается
недоступным для табуляции.visibility: hidden полностью исключает элемент.opacity: 0 не исключает элемент автоматически —
требуется дополнительная проверка с pointer-events или
родительскими стилями.При изменении размеров, позиций или overflow контейнеров
важно пересчитывать tabbable-элементы. Например, при
открытии раскрывающегося списка:
function updateTabbable(container) {
const elements = tabbable(container);
elements.forEach(el => console.log(el));
}
Если элементы становятся видимыми после изменения
overflow или clip-path, они автоматически
включаются в новый массив tabbable-элементов.
tabindex только для элементов,
которые могут быть реально доступны пользователю.focus-trap, если
необходимо замкнуть фокус внутри модального окна или панели.Использование Tabbable совместно с учетом клиппинга и overflow обеспечивает точное управление фокусом и предотвращает попадание клавиатурного фокуса на элементы, которые пользователь физически не видит.