Библиотека Focus-trap является инструментом для управления фокусом внутри определённых элементов DOM, что особенно важно при реализации модальных окон, дропдаунов и интерактивных виджетов. Установка возможна через npm:
npm install focus-trap
Для подключения через ES-модули используется следующий синтаксис:
import { createFocusTrap } from 'focus-trap';
Для CommonJS:
const { createFocusTrap } = require('focus-trap');
После подключения можно создавать и настраивать отдельные ловушки фокуса.
Основной метод — createFocusTrap(container, options),
где container — это DOM-элемент, внутри которого нужно
ограничить фокус.
Пример базовой конфигурации:
const modal = document.getElementById('modal');
const focusTrap = createFocusTrap(modal, {
onActivate: () => modal.style.display = 'block',
onDeactivate: () => modal.style.display = 'none',
});
Методы активации и деактивации:
focusTrap.activate(); // Включение ловушки фокуса
focusTrap.deactivate(); // Выключение ловушки фокуса
initialFocus — элемент, который получит
фокус при активации ловушки. Может быть:
'#input-name'document.querySelector('#input-name')const focusTrap = createFocusTrap(modal, {
initialFocus: '#username'
});
fallbackFocus — элемент, который
получит фокус, если initialFocus не найден или
недоступен:
fallbackFocus: '#modal-close'
escapeDeactivates — разрешает или
запрещает закрытие ловушки по нажатию клавиши Esc. Значения:
true (по умолчанию), false или функция.
escapeDeactivates: false
clickOutsideDeactivates — отключение
ловушки при клике вне контейнера. Может быть true,
false или функция с логикой проверки.
clickOutsideDeactivates: (event) => !modal.contains(event.target)
returnFocusOnDeactivate — возвращает
фокус на элемент, активировавший ловушку, после деактивации. По
умолчанию true.
const modal = document.getElementById('modal');
const focusTrap = createFocusTrap(modal, {
initialFocus: '#email-input',
fallbackFocus: '#modal',
escapeDeactivates: true,
clickOutsideDeactivates: true,
returnFocusOnDeactivate: true,
});
const focusTrap = createFocusTrap(modal, {
escapeDeactivates: false
});
onActivate — вызывается при активации
ловушки. Часто используется для отображения модального окна или
изменения стилей:
onActivate: () => modal.classList.add('active')
onDeactivate — вызывается при
деактивации. Можно скрывать окно или очищать поля формы:
onDeactivate: () => {
modal.classList.remove('active');
modal.querySelector('form').reset();
}
checkCanFocusTrap — асинхронная
функция, позволяющая задерживать активацию ловушки, пока не будет готов
фокусируемый элемент:
checkCanFocusTrap: (trap) => {
return new Promise(resolve => {
setTimeout(() => resolve(true), 100);
});
}
Можно создавать несколько независимых ловушек и активировать их по событию:
const trap1 = createFocusTrap(modal1);
const trap2 = createFocusTrap(modal2);
document.getElementById('open1').addEventListener('click', () => trap1.activate());
document.getElementById('open2').addEventListener('click', () => trap2.activate());
Ловушки можно деактивировать независимо или переключать между ними.
returnFocusOnDeactivate.checkCanFocusTrap
позволяет корректно обрабатывать динамически подгружаемый контент.initialFocus или
fallbackFocus, чтобы избежать потери фокуса.onActivate и onDeactivate для
управления видимостью элементов.escapeDeactivates и
clickOutsideDeactivates полезно для обязательных действий
пользователя (например, подтверждение формы).Базовая конфигурация Focus-trap обеспечивает надежный контроль фокуса, предотвращает потерю интерактивности и улучшает доступность интерфейсов.