Библиотека Focus-trap предназначена для управления
фокусом внутри модальных окон, всплывающих панелей и других
интерактивных областей. Она предотвращает уход фокуса за пределы
контейнера, обеспечивая доступность и удобство взаимодействия с
интерфейсом. Одним из ключевых параметров при инициализации фокус-трапа
является preventScroll.
preventScrollПараметр preventScroll управляет
поведением браузера при перемещении фокуса на элемент внутри контейнера.
По умолчанию, при программном переводе фокуса на элемент браузер
автоматически прокручивает страницу, чтобы элемент стал видимым. В
некоторых случаях это нежелательно, например:
Установка preventScroll: true предотвращает
автоматическую прокрутку при активации фокуса, позволяя полностью
контролировать визуальную позицию элемента.
import { createFocusTrap } from 'focus-trap';
const modal = document.getElementById('modal');
const focusTrap = createFocusTrap(modal, {
initialFocus: '#inputField',
escapeDeactivates: true,
preventScroll: true
});
focusTrap.activate();
В этом примере:
initialFocus указывает на элемент, который получит
фокус при активации трапа;escapeDeactivates: true разрешает деактивацию трапа
клавишей Esc;preventScroll: true отключает автоматическую прокрутку
браузера при установке фокуса.false (по умолчанию)Если preventScroll не установлен или
имеет значение false, фокусировка на элементе может
вызвать:
Таким образом, стандартное поведение браузера может конфликтовать с дизайнерскими решениями интерфейса.
Для элементов, которые добавляются в DOM динамически (например,
контент модального окна подгружается через AJAX),
preventScroll гарантирует корректную
установку фокуса без смещения страницы:
function openModal() {
const modal = document.createElement('div');
modal.id = 'dynamicModal';
modal.innerHTML = '<input id="dynamicInput" type="text">';
document.body.appendChild(modal);
const trap = createFocusTrap(modal, {
initialFocus: '#dynamicInput',
preventScroll: true
});
trap.activate();
}
Даже если #dynamicInput находится за пределами видимой
области при добавлении, страница останется неподвижной, а фокус будет
установлен.
preventScroll работает в связке с другими опциями
Focus-trap:
initialFocus — предотвращает смещение
при установке начального фокуса;fallbackFocus — используется, если
указанный элемент недоступен; предотвращает нежелательную
прокрутку;clickOutsideDeactivates — при
деактивации трапа кликом вне контейнера, preventScroll не
влияет на прокрутку, так как фокус может вернуться к предыдущему
элементу документа.Параметр preventScroll использует стандартный API DOM
focus() с опцией { preventScroll: true }.
Поддержка современных браузеров:
В старых браузерах preventScroll может игнорироваться,
поэтому в критических интерфейсах рекомендуется предусматривать
fallback-логики для управления прокруткой вручную.
preventScroll: true;preventScroll при необходимости
автоматического прокручивания к элементу (например, при навигации по
списку элементов).Параметр preventScroll обеспечивает
контроль над визуальным поведением страницы при установке фокуса,
предотвращает нежелательные прокрутки и улучшает пользовательский опыт
на модальных и динамических интерфейсах. Его грамотное применение
критично для доступности и предсказуемости работы фокус-трапа.