Библиотека Tabbable предназначена для определения элементов на веб-странице, доступных для навигации с помощью клавиши Tab. Она используется в контексте доступности (Accessibility, a11y) и соответствует требованиям WCAG по обеспечению клавиатурной навигации. Основная задача библиотеки — идентификация элементов, на которые можно перейти фокусом, а также различение фокусируемых и табулируемых элементов.
Ключевые функции:
tabindex.Фокусируемые элементы Fокусу поддаются элементы,
у которых есть естественная фокусируемость:
, ,
, ,
. Кроме того, элементы с атрибутом
tabindex="0" становятся фокусируемыми.
Исключение неактивных элементов Элементы с
атрибутом disabled или aria-hidden="true"
автоматически исключаются из списка табулируемых. Это соответствует
рекомендациям WCAG 2.1 (Success Criterion 2.1.1 —
Keyboard).
Обработка отрицательного tabindex Элементы с
tabindex="-1" считаются фокусируемыми программно, но они не
попадают в последовательность табуляции. Tabbable учитывает этот факт,
что важно для управления фокусом в сложных интерфейсах.
Библиотека предоставляет основной метод
tabbable(container), который возвращает массив
DOM-элементов:
import tabbable from 'tabbable';
const container = document.getElementById('form');
const focusableElements = tabbable(container);
console.log(focusableElements);
Особенности метода:
container — любой элемент DOM, внутри которого
производится поиск.Дополнительно можно использовать isTabbable(element) для
проверки, является ли конкретный элемент табулируемым:
import { isTabbable } from 'tabbable';
const button = document.querySelector('button');
console.log(isTabbable(button)); // true или false
tabindex играет ключевую роль в соблюдении стандартов
WCAG:
tabindex="0" — элемент включается в естественный
порядок табуляции.tabindex="-1" — элемент исключается из
последовательности, но доступен для скриптов.tabindex="n" (положительное число) — явная установка
порядка табуляции, но использование положительных значений не
рекомендуется в современных интерфейсах, так как это усложняет
предсказуемость навигации.Tabbable корректно учитывает эти значения при формировании массива элементов.
Tabbable учитывает спецификации ARIA:
aria-hidden="true" игнорируются.role="presentation" или
role="none" также исключаются.Это позволяет создавать интерфейсы, соответствующие WCAG 2.1, без лишних проверок вручную.
В современном JavaScript интерфейсе элементы могут добавляться или удаляться динамически. Для поддержки этого необходимо:
tabbable(container) при каждом изменении DOM,
где меняется доступность фокуса.MutationObserver, чтобы
автоматически обновлять список фокусируемых элементов:const observer = new MutationObserver(() => {
const focusable = tabbable(container);
console.log(focusable);
});
observer.observe(container, { childList: true, subtree: true });
Модальные окна и диалоги Ограничение табуляции только элементами внутри модального окна предотвращает уход фокуса за пределы диалога. Tabbable помогает определить внутренние элементы и реализовать focus trap.
Формы и сложные панели Автоматическое определение табулируемых полей формы позволяет создавать интерфейсы с правильной навигацией без ручного перечисления всех элементов.
Компоненты с кастомным поведением Dropdown-меню, аккордеоны и интерактивные виджеты могут динамически изменять доступность фокуса. Tabbable обеспечивает корректный порядок и проверку доступности элементов.
Использование Tabbable напрямую связано с несколькими критериями WCAG 2.1:
Эти критерии обеспечиваются за счёт точного определения табулируемых элементов и фильтрации неактивных компонентов.