Библиотека Focus-trap предназначена для управления
фокусом в веб-приложениях, обеспечивая его ограничение внутри
определённой области DOM, такой как модальные окна, всплывающие панели
или кастомные диалоговые компоненты. Один из ключевых параметров
конфигурации — fallbackFocus, который играет важную роль в
случаях, когда фокус не может быть установлен на элементы внутри
контейнера.
fallbackFocusПараметр fallbackFocus используется как резервный
вариант установки фокуса. Он применяется, когда:
disabled
или tabindex="-1".fallbackFocus гарантирует, что фокус всегда будет
установлен на элемент DOM, предотвращая потерю управления клавиатурной
навигацией.
fallbackFocus может принимать несколько типов
значений:
CSS-селектор Позволяет указать элемент внутри контейнера, на который будет установлен фокус, если стандартные элементы фокусировки недоступны. Например:
const trap = focusTrap(container, {
fallbackFocus: '#default-button'
});
В этом примере, если внутри контейнера нет фокусируемых элементов,
фокус будет перенесён на элемент с
id="default-button".
Функция Функция должна возвращать DOM-элемент, на который будет установлен фокус. Это удобно, когда элемент выбирается динамически или зависит от состояния приложения:
const trap = focusTrap(container, {
fallbackFocus: () => document.querySelector('.modal-footer button')
});
Использование функции позволяет вычислять элемент в момент активации focus-trap, обеспечивая актуальность выбора.
DOM-элемент Можно передать конкретный элемент напрямую:
const defaultButton = document.getElementById('close-modal');
const trap = focusTrap(container, {
fallbackFocus: defaultButton
});
Такой способ гарантирует, что фокус будет точно на нужном элементе без вычислений.
При вызове метода activate():
Focus-trap проверяет наличие фокусируемых элементов внутри контейнера.
Если подходящие элементы отсутствуют, библиотека проверяет
наличие fallbackFocus.
В зависимости от типа значения параметра, устанавливается фокус:
querySelector.Если fallbackFocus не задан и фокусировать не на что,
фокус остаётся на текущем документе, что может привести к нарушению
клавиатурной навигации и потенциальным проблемам доступности.
fallbackFocus тесно связан с другими конфигурационными
опциями:
initialFocus — задаёт элемент для
установки фокуса при активации. Если initialFocus не найден
или недоступен, срабатывает fallbackFocus.allowOutsideClick — при клике вне
контейнера фокус может перемещаться на элемент вне trap;
fallbackFocus не используется в таких случаях.escapeDeactivates — при деактивации
focus-trap через Escape, fallbackFocus не активируется
автоматически, если используется для установки фокуса после
активации.Модальные окна без кнопок внутри
const modalTrap = focusTrap(document.querySelector('.modal'), {
fallbackFocus: '.modal-close'
});
modalTrap.activate();
Даже если внутри модального окна нет интерактивных элементов, фокус гарантированно будет установлен на кнопку закрытия.
Динамически создаваемый контент
const dynamicTrap = focusTrap(document.querySelector('.dynamic-panel'), {
fallbackFocus: () => document.querySelector('.dynamic-panel .first-focusable')
});
dynamicTrap.activate();
Это полезно, когда элементы появляются только после асинхронной загрузки данных.
fallbackFocus для модальных и
интерактивных компонентов, чтобы поддерживать доступность.fallbackFocus,
действительно фокусируемый (tabindex ≥ 0, не
disabled, видимый на странице).fallbackFocus не инициирует событие
focusin на элементе, если он уже имеет фокус.fallbackFocus указывает на несуществующий элемент,
библиотека выбрасывает предупреждение в консоль (в режиме разработки),
но не ломает работу страницы.Использование fallbackFocus делает работу с
Focus-trap предсказуемой, повышает стабильность
клавиатурной навигации и обеспечивает соблюдение стандартов доступности.
Этот параметр особенно важен в сложных интерфейсах с динамическими и
условными элементами фокусировки.