Focus-trap — это библиотека для управления фокусом
клавиатуры в веб-приложениях. Она особенно полезна при работе с
модальными окнами, выпадающими меню и диалогами, обеспечивая, чтобы
фокус оставался внутри заданной области и предотвращая его случайное
перемещение на элементы вне этой области. Одним из ключевых параметров
конфигурации является delayInitialFocus.
delayInitialFocusПараметр delayInitialFocus контролирует момент установки
начального фокуса на первый доступный элемент внутри фокус-трапа. По
умолчанию, при активации трапа фокус сразу перемещается на первый
элемент, который может принимать фокус (обычно это
<button>, <input>,
<a> с href и др.).
Использование delayInitialFocus позволяет отложить этот
процесс на указанное количество миллисекунд. Это особенно важно в
следующих сценариях:
delayInitialFocus принимает два типа значений:
Булевое значение true
true библиотека автоматически использует
небольшую задержку (~50–100 мс), чтобы DOM успел полностью
отрендериться.Числовое значение (миллисекунды)
delayInitialFocus: 200 означает, что
библиотека установит фокус на первый элемент через 200 миллисекунд после
активации трапа.Пример конфигурации:
import { createFocusTrap } from 'focus-trap';
const modal = document.getElementById('modal');
const trap = createFocusTrap(modal, {
initialFocus: '#modal-input',
delayInitialFocus: 150
});
trap.activate();
В этом примере фокус будет установлен на элемент с
id="modal-input" через 150 миллисекунд после активации.
initialFocus: задаёт элемент, который
будет получать фокус первым. Если delayInitialFocus
установлен, установка фокуса на initialFocus произойдет с
задержкой.onActivate: обратный вызов, который
выполняется при активации трапа. Можно синхронизировать анимацию или
другие действия с задержкой фокуса.allowOutsideClick и
clickOutsideDeactivates: параметры управления
взаимодействием с элементами вне трапа не влияют на работу
delayInitialFocus, однако при использовании сложных
динамических интерфейсов задержка может уменьшить визуальные конфликты
при кликах.delayInitialFocus вместе с анимацией появления модального
окна, чтобы пользователь видел плавное перемещение фокуса.delayInitialFocus с
числовым значением, достаточным для завершения рендера элементов.React,
Vue или Svelte, рекомендуется использовать
задержку 50–200 мс, чтобы избежать ошибок установки фокуса на
несуществующий элемент.delayInitialFocus не используется, фокус
может появиться до того, как элемент станет видимым.initialFocus на
динамическом элементе: без задержки элемент может отсутствовать
в момент активации трапа, и фокус не будет установлен.delayInitialFocus обеспечивает более гибкое и
предсказуемое управление фокусом в интерактивных интерфейсах. Правильная
настройка этого параметра повышает качество UX, предотвращает ошибки с
невидимым фокусом и облегчает интеграцию с асинхронным или анимированным
контентом.
В реальных проектах рекомендуется комбинировать
delayInitialFocus с initialFocus и обратными
вызовами onActivate/onPostActivate, чтобы
добиться максимально плавного и корректного поведения модальных окон и
других фокус-трапов.