В JavaScript-библиотеке Tabbable элементы — это интерактивные узлы
DOM, которые могут получать фокус при навигации с помощью клавиши
Tab. Такие элементы включают ссылки
<a> с атрибутом href, кнопки
<button>, поля ввода <input>, а
также элементы с явно заданным атрибутом tabindex="0" или
положительным значением. Основное назначение Tabbable элементов —
управление порядком фокусировки для обеспечения доступности
интерфейсов.
Отсутствие Tabbable элементов в контейнере означает, что при навигации клавишей Tab пользователь не сможет перемещаться внутрь этого блока, что критично для доступности и пользовательского опыта.
Отсутствие интерактивных элементов Если в DOM
отсутствуют стандартные интерактивные элементы (<a>,
<button>, <input> и другие),
библиотека Tabbable не сможет найти фокусируемые узлы.
Стилизация через CSS Элементы с
display: none, visibility: hidden или
opacity: 0 не считаются Tabbable. Также элементы,
помещённые вне видимой области через position: absolute с
отрицательными координатами, не всегда учитываются, в зависимости от
браузера.
Атрибут tabindex с отрицательным
значением Элемент с tabindex="-1" исключается из
стандартного потока Tab-фокусировки, поэтому Tabbable его
игнорирует.
Деактивация через свойства disabled Кнопки, поля
ввода и другие интерактивные элементы с атрибутом disabled
не попадают в результат функции Tabbable.
Библиотека предоставляет два основных метода:
tabbable(container) — возвращает массив элементов,
доступных для Tab-фокусировки внутри указанного контейнера. Если массив
пуст, значит, tabbable элементы отсутствуют.isTabbable(element) — проверяет конкретный элемент на
возможность получения фокуса через Tab. Возвращает true или
false.Пример использования:
import { tabbable, isTabbable } from 'tabbable';
const container = document.querySelector('#form');
const elements = tabbable(container); // []
const button = document.querySelector('#submit');
console.log(isTabbable(button)); // false, если button disabled
Отсутствие tabbable элементов приводит к нескольким проблемам:
tabindex="0". Это позволит библиотеке Tabbable
учитывать его при навигации:<div id="custom-button" tabindex="0">Нажми меня</div>
Проверка видимости и активности Элементы должны
быть видимыми (display !== none,
visibility !== hidden) и не отключёнными.
Использование семантических элементов
Предпочтительно использовать семантические интерактивные элементы
(<button>, <a>), чтобы избежать
необходимости ручного управления tabindex.
Динамическое управление tabbable элементами В динамических интерфейсах, где контент загружается или меняется, необходимо пересчитывать tabbable элементы после изменения DOM:
const dynamicContainer = document.querySelector('#dynamic');
const tabbables = tabbable(dynamicContainer);
console.log('Найдено tabbable элементов:', tabbables.length);
Для отладки часто используется проверка на пустой массив:
if (tabbable(container).length === 0) {
console.warn('В контейнере отсутствуют tabbable элементы');
}
Это помогает выявить скрытые проблемы в интерфейсе и корректно настроить фокусировку.
Если внутри контейнера есть вложенные блоки с tabbable элементами, Tabbable учитывает их рекурсивно. Однако, если вложенные элементы скрыты или деактивированы, они не будут включены в результат, и контейнер может считаться пустым с точки зрения фокусируемых узлов.
Отсутствие tabbable элементов — это не просто техническая особенность, а фактор, напрямую влияющий на доступность и удобство интерфейсов. Правильное управление tabindex, видимостью и семантикой элементов обеспечивает корректную работу Tabbable и полноценную навигацию для пользователей.