Метод deactivate() используется для отключения активной
ловушки фокуса. После вызова этого метода библиотека прекращает
перехватывать навигацию по элементам интерфейса и возвращает поведение
фокуса к стандартной логике браузера.
Focus Trap применяет механизм ограничения фокуса внутри заданного контейнера: пользователь может перемещаться между интерактивными элементами только внутри этой области. Такое поведение часто используется в модальных окнах, диалогах, выпадающих панелях и других элементах интерфейса, которые должны временно изолировать взаимодействие.
deactivate() завершает этот режим.
Во время активации ловушки фокуса библиотека выполняет несколько действий:
Tab,
Shift + Tab);focusin);Метод deactivate() отменяет эти механизмы:
Таким образом интерфейс возвращается в обычное состояние.
trap.deactivate();
Где trap — экземпляр ловушки фокуса, созданный функцией
createFocusTrap.
Пример создания и деактивации:
import { createFocusTrap } from 'focus-trap';
const modal = document.querySelector('#modal');
const trap = createFocusTrap(modal);
trap.activate();
// позже
trap.deactivate();
После выполнения deactivate() пользователь снова может
перемещать фокус по всей странице.
Одной из ключевых возможностей метода является автоматическое возвращение фокуса на элемент, который был активен до запуска ловушки.
Это важно для доступности интерфейса, поскольку помогает пользователю продолжить работу с того же места.
Типичный сценарий:
deactivate();Пример:
const button = document.querySelector('#open-modal');
const modal = document.querySelector('#modal');
const trap = createFocusTrap(modal);
button.addEventListener('click', () => {
trap.activate();
});
document.querySelector('#close').addEventListener('click', () => {
trap.deactivate();
});
После закрытия окна фокус снова окажется на
#open-modal.
Метод deactivate() может принимать объект
параметров:
trap.deactivate(options);
Основные параметры:
| Параметр | Назначение |
|---|---|
returnFocus |
управляет возвратом фокуса |
checkCanReturnFocus |
асинхронная проверка перед возвратом |
onDeactivate |
колбэк при деактивации |
returnFocusОпределяет, нужно ли возвращать фокус на предыдущий элемент.
trap.deactivate({
returnFocus: false
});
Если значение false, библиотека не будет восстанавливать
фокус. Это полезно в случаях, когда:
checkCanReturnFocusЭтот параметр используется, если возвращение фокуса должно произойти после выполнения асинхронной операции.
trap.deactivate({
checkCanReturnFocus: (trigger) => {
return new Promise((resolve) => {
setTimeout(resolve, 300);
});
}
});
Аргумент trigger содержит элемент, который имел фокус до
активации ловушки.
Частые сценарии использования:
onDeactivateПозволяет выполнить произвольный код в момент отключения ловушки.
trap.deactivate({
onDeactivate: () => {
console.log('Focus trap отключена');
}
});
Этот колбэк вызывается сразу после завершения деактивации.
Применяется для:
Во время активации Focus Trap регистрирует несколько слушателей:
keydownfocusinmousedowntouchstartclickМетод deactivate() удаляет все эти обработчики. Это
предотвращает:
Tab;После деактивации поведение страницы становится полностью стандартным.
В сложных интерфейсах возможно существование нескольких ловушек фокуса. Например:
Когда активируется новая ловушка, предыдущая может быть автоматически приостановлена.
При вызове deactivate() происходит одно из двух
действий:
Пример:
modalTrap.activate();
nestedDialogTrap.activate();
nestedDialogTrap.deactivate();
После деактивации вложенного диалога фокус снова будет ограничен модальным окном.
Чаще всего deactivate() применяется при закрытии
интерфейсных компонентов.
const trap = createFocusTrap('#modal');
function openModal() {
modal.classList.add('open');
trap.activate();
}
function closeModal() {
modal.classList.remove('open');
trap.deactivate();
}
document.addEventListener('keydown', (event) => {
if (event.key === 'Escape') {
trap.deactivate();
}
});
document.addEventListener('click', (event) => {
if (!modal.contains(event.target)) {
trap.deactivate();
}
});
Корректная деактивация ловушки фокуса играет важную роль в обеспечении доступности:
Если ловушка не деактивируется корректно, могут возникнуть проблемы:
Поэтому deactivate() должен вызываться всегда при
закрытии компонентов, использующих Focus Trap.
Процесс деактивации включает несколько этапов:
Схематически:
activate()
↓
focus trapping
↓
deactivate()
↓
remove listeners
restore focus
Такой механизм обеспечивает безопасное завершение работы ловушки без конфликтов с другими компонентами интерфейса.
Если элемент, который должен получить фокус после деактивации, удалён из DOM, библиотека пытается:
document.body.Поэтому при динамических интерфейсах иногда отключают автоматическое возвращение фокуса:
trap.deactivate({
returnFocus: false
});
После этого фокус назначается вручную.
Метод deactivate() работает совместно с несколькими
ключевыми методами Focus Trap.
activate() Запускает ловушку
фокуса.
pause() Временно приостанавливает
ловушку без полного отключения.
unpause() Возобновляет работу после
паузы.
Разница между ними:
| Метод | Эффект |
|---|---|
pause() |
временная остановка |
unpause() |
восстановление |
deactivate() |
полное завершение |
deactivate() используется, когда ловушка больше не
требуется.
Синхронизация с анимациями
Часто модальные окна закрываются с анимацией. В таких случаях деактивацию выполняют после завершения анимации:
modal.addEventListener('animationend', () => {
trap.deactivate();
});
Проверка существования элемента
Перед возвратом фокуса важно убедиться, что исходный элемент не был удалён.
Единая точка управления
В крупных приложениях логика открытия и закрытия интерфейсов
централизуется в одном модуле, который отвечает за вызовы
activate() и deactivate().
Метод deactivate() является ключевым элементом
жизненного цикла Focus Trap. Он завершает изоляцию фокуса,
восстанавливает стандартную навигацию и обеспечивает корректное
взаимодействие пользователя с остальной частью интерфейса.