Библиотека Tabbable предназначена для определения
элементов на веб-странице, доступных для фокусировки с помощью клавиши
Tab. Она обеспечивает точное выявление интерактивных элементов, учитывая
атрибуты tabindex, disabled, CSS-свойства
visibility и display, а также скрытые
контейнеры. Основной задачей является формирование массива элементов,
через которые пользователь может перемещаться последовательно при
навигации с клавиатуры.
Ключевой момент: Tabbable не изменяет DOM и не управляет фокусом самостоятельно. Она служит инструментом анализа структуры страницы, предоставляя разработчику информацию для реализации кастомной логики.
tabbable(container, options)
Возвращает массив элементов, которые доступны для навигации с клавиатуры
внутри указанного контейнера.
container — DOM-узел, в пределах которого
осуществляется поиск.
options — объект настроек:
includeContainer (boolean) — включать ли сам контейнер,
если он фокусируемый.getShadowRoot (function) — функция для обхода shadow
DOM.isTabbable(element, options)
Проверяет, может ли конкретный элемент получать фокус при навигации с
Tab. Возвращает true или false.
focusable(container, options)
Аналог tabbable, но возвращает все элементы, способные
получать фокус, включая те, на которые нельзя перейти Tab, например,
элементы с отрицательным tabindex.
Tabbable учитывает значения tabindex следующим
образом:
tabindex="0" — элемент доступен при стандартной
навигации Tab.tabindex="-1" — элемент может быть сфокусирован
программно (element.focus()), но пропускается при Tab.tabindex с положительным значением — элементы
сортируются по возрастанию числа, чтобы задать пользовательский
порядок.Важно: использование положительных значений
tabindex считается устаревшей практикой и может создавать
трудности с поддержкой, особенно в сложных интерфейсах.
Tabbable игнорирует элементы, скрытые через CSS:
display: nonevisibility: hidden<details> закрыт,
<template>).Также библиотека корректно обрабатывает shadow DOM, если передана
соответствующая функция через getShadowRoot. Это позволяет
учитывать элементы внутри web components.
1. Формы и диалоги: При построении модальных окон или сложных форм важно определить, какие элементы должны быть доступными для клавиатурной навигации. Tabbable позволяет создавать массив фокусируемых элементов и реализовать циклический обход с помощью Tab.
2. Кастомные компоненты: Для элементов вроде кастомных селектов, вкладок или аккордеонов библиотека помогает определить последовательность фокусировки, не полагаясь на браузерную логику по умолчанию.
3. Тестирование доступности: В автоматических тестах Tabbable позволяет проверить, что все интерактивные элементы доступны пользователю, и обнаружить скрытые или неправильно настроенные поля.
В простых интерфейсах и стандартных HTML-формах необходимость в Tabbable минимальна:
<input>,
<button>, <a> и
<textarea> без сложной кастомизации.В таких случаях встроенная логика браузера справляется с фокусировкой полностью, и подключение Tabbable может быть лишним усложнением, увеличивающим размер бандла и добавляющим абстракцию без заметной пользы.
При больших DOM-деревьях вычисление фокусируемых элементов может быть ресурсоёмким. Для оптимизации:
document.includeContainer: false, если контейнер
сам не нуждается в фокусе.Эти меры минимизируют количество обходов дерева и ускоряют работу интерфейса, особенно на страницах с тысячами элементов.
Tabbable легко интегрируется с библиотеками для модальных окон, аккордеонов, кастомных селектов и роутеров. Главный принцип — не управлять фокусом напрямую через Tabbable, а использовать её результаты для построения собственной логики управления фокусом и навигации клавиатуры.