Библиотека Tabbable предназначена для определения элементов страницы, которые могут получать фокус с помощью клавиши Tab. Понимание её совместимости с различными браузерами критично для разработки универсальных веб-приложений и библиотек пользовательских интерфейсов.
Фокус в браузере управляется внутренними механизмами движка рендеринга, и разные браузеры могут по-разному трактовать стандарт HTML и спецификации WAI-ARIA:
<input>, <button>,
<select>, <textarea>,
<a href=""> по умолчанию считаются tabbable.tabindex позволяет вручную задавать порядок
фокуса.display: none или
visibility: hidden исключаются из цепочки табуляции во всех
современных браузерах.tabindex="-1" делает элемент фокусируемым
программно, но исключает его из табуляции.Библиотека Tabbable учитывает эти особенности и предоставляет единый API, который корректно определяет tabbable-элементы вне зависимости от браузера.
Tabbable полностью совместима с последними версиями:
В этих браузерах библиотека корректно обрабатывает:
role="button", role="link").opacity: 0 — они остаются tabbable,
если не исключены другими CSS-свойствами.Для браузеров предыдущих поколений поддержка ограничена:
contenteditable могут не распознаваться.tabindex с отрицательными значениями
иногда игнорируется при вычислении последовательности табуляции.tabindex >= 0, но порядок фокуса может не совпадать с
настольной версией.Табуляция через iframe Tabbable не автоматически обрабатывает элементы внутри iframe с другим доменом из-за ограничений CORS. Для этого требуется отдельная инициализация внутри iframe.
Shadow DOM Элементы внутри закрытого shadow DOM
(mode: closed) недоступны для библиотеки, так как
стандартные методы DOM не позволяют получить их содержимое.
SVG и нестандартные элементы Не все
интерактивные SVG-элементы одинаково поддерживаются в старых версиях
браузеров. <foreignObject> может создавать
непредсказуемое поведение.
Стили и CSS-свойства Свойства
pointer-events: none и visibility: hidden
исключают элемент из tabbable-цепочки, но opacity: 0 — не
исключает. Разработчик должен учитывать это при построении
интерфейса.
tabindex для управления порядком фокуса
только при необходимости, полагаясь на дефолтную табуляцию для
стандартных элементов.Библиотека предоставляет метод tabbable(el) для
получения массива всех tabbable-элементов внутри указанного контейнера.
Рекомендуется использовать его для проверки:
import { tabbable } from 'tabbable';
const container = document.getElementById('app');
const elements = tabbable(container);
console.log(elements); // вывод всех элементов, доступных для Tab
При отладке важно проверять:
tabindex="-1".display, visibility,
pointer-events) на tabbable.Совместимость с браузерами — одна из ключевых причин использовать Tabbable вместо собственных скриптов для навигации по фокусируемым элементам. Она обеспечивает единое поведение во всех современных и многих старых браузерах, минимизируя неожиданные ошибки при управлении фокусом и поддерживая доступность интерфейсов.