Библиотека Tabbable в JavaScript предназначена для управления и определения элементов веб-страницы, на которые можно перейти с помощью клавиши Tab. Она позволяет создавать доступные интерфейсы, управлять порядком навигации и корректно обрабатывать фокусировку элементов.
Tabbable элементы — это элементы, на которые пользователь может перемещаться с помощью клавиши Tab. К ним относятся:
<a> с атрибутом href<button><input> (кроме type="hidden")<select><textarea>tabindex="0" или положительным значением
tabindexЭлементы с tabindex="-1" исключаются из порядка
табуляции, хотя на них можно программно установить фокус.
Ключевой момент: Tabbable учитывает как стандартные
интерактивные элементы, так и кастомные элементы с корректным
tabindex.
tabbable(container)Возвращает массив всех tabbable элементов внутри указанного контейнера, в порядке их табуляции. Пример использования:
import tabbable from 'tabbable';
const container = document.querySelector('#form');
const tabbableElements = tabbable(container);
console.log(tabbableElements);
Особенности:
display: none,
visibility: hidden).disabled не включаются.tabindex="-1" исключаются.isTabbable(element)Проверяет, является ли конкретный элемент tabbable. Возвращает
true или false.
import { isTabbable } from 'tabbable';
const button = document.querySelector('button');
console.log(isTabbable(button)); // true
Примечание: Эта функция полезна для динамически создаваемых элементов и условной проверки доступности элементов.
focusable(element)Функция focusable определяет, может ли элемент получить
фокус вообще, независимо от порядка табуляции. Отличие от
isTabbable заключается в том, что элементы с
tabindex="-1" считаются фокусируемыми.
import { focusable } from 'tabbable';
const div = document.querySelector('#custom');
console.log(focusable(div)); // true, если div с tabindex="-1"
Вывод: focusable используется для
настройки фокуса на элементы, которые не участвуют в обычной навигации
клавишей Tab.
При открытии модальных окон важно ограничивать фокус только
элементами внутри окна. Использование tabbable
позволяет:
const modal = document.querySelector('.modal');
const elements = tabbable(modal);
elements[0].focus(); // устанавливаем фокус на первый элемент
Совет: При закрытии модального окна фокус возвращается к элементу, который его открыл.
Компоненты с нестандартной структурой (например, кастомные селекты или списки) часто требуют программного управления фокусом:
tabindex="0" для элементов, которые
должны быть в порядке табуляции.tabindex="-1" можно фокусировать
программно.isTabbable перед установкой фокуса
предотвращает ошибки.tabindex разумно: положительные значения
изменяют естественный порядок табуляции и могут привести к
непредсказуемому поведению.tabbable от нативного
document.activeElementdocument.activeElement показывает элемент, который
сейчас в фокусе, но не предоставляет информацию о порядке табуляции или
возможности получения фокуса. Библиотека Tabbable решает
эту задачу, возвращая полный список элементов, доступных для перемещения
по Tab, и позволяет создавать интерфейсы с предсказуемой навигацией.
Tabbable учитывает CSS-свойства, влияющие на видимость:
display: none — элемент не tabbablevisibility: hidden — элемент не tabbableopacity: 0 — элемент может быть tabbable, если он видим
для скринридеровpointer-events: none — не влияет на tabbable, но
блокирует взаимодействие мышьюЭто позволяет точно контролировать, какие элементы должны участвовать в навигации клавишей Tab.
В современных фреймворках (React, Vue, Angular) Tabbable
применяется для:
Использование библиотеки совместимо с виртуальными DOM, так как методы работают с реальными DOM-элементами после их рендеринга.
tabbable(container),
isTabbable(element), focusable(element).