FloatingFocusManager — это утилита библиотеки Floating
UI для управления фокусом внутри всплывающих элементов, таких как
модальные окна, тултипы, поповеры и дропдауны. Она обеспечивает
доступность интерфейсов и предотвращает потерю фокуса при взаимодействии
с элементами на странице.
Трабл с фокусом в модальных и всплывающих
элементах В стандартном HTML при открытии всплывающего окна
фокус может остаться на элементе, который находится за ним, что нарушает
UX и стандарты доступности (WCAG). FloatingFocusManager
перехватывает фокус и ограничивает его область действия внутри
всплывающего контейнера.
Обеспечение логической навигации При использовании клавиши Tab фокус перемещается только по интерактивным элементам внутри всплывающего окна. Shift+Tab работает аналогично в обратном направлении, предотвращая уход фокуса за пределы контейнера.
Возврат фокуса после закрытия После закрытия всплывающего окна фокус автоматически возвращается на элемент, с которого оно было вызвано, что улучшает взаимодействие с пользователем и поддерживает логическую последовательность действий.
FloatingFocusManager реализуется как компонент-обёртка
или функция, принимающая несколько ключевых параметров:
useFloating) для привязки всплывающего окна к целевому
элементу.true фокус полностью
ограничивается внутри окна.'content-first' (сначала контент,
затем кнопки закрытия) или 'initial-focus-first'.import { useFloating, FloatingFocusManager } from '@floating-ui/react';
function Popover({ isOpen, onClose }) {
const { floating, reference } = useFloating();
return (
<>
<button ref={reference}>Открыть поповер</button>
{isOpen && (
<FloatingFocusManager
context={{ floating, reference }}
initialFocus={() => document.getElementById('input')}
returnFocus={true}
modal={true}
>
<div ref={floating} role="dialog" aria-modal="true">
<input id="input" placeholder="Введите текст" />
<button onCl ick={onClose}>Закрыть</button>
</div>
</FloatingFocusManager>
)}
</>
);
}
Объяснение:
context связывает всплывающее окно с
кнопкой-источником.initialFocus устанавливает фокус на input при
открытии.returnFocus гарантирует, что после закрытия кнопка
снова получит фокус.modal={true} блокирует взаимодействие с другими
элементами страницы до закрытия.Модальный (modal=true)
Немодальный (modal=false)
FloatingFocusManager корректно работает с элементами,
добавленными динамически после рендера. Например, если внутри модального
окна появляются новые кнопки, они автоматически учитываются при
навигации с помощью Tab и Shift+Tab.
Для соблюдения стандартов доступности важно:
role="dialog" для модальных окон.aria-modal="true" при модальном
режиме.aria-labelledby и
aria-describedby для описания диалога.FloatingFocusManager не добавляет эти атрибуты
автоматически, но обеспечивает правильное управление фокусом в рамках
ARIA-стандартов.
initialFocus, чтобы фокус попадал на
интерактивный элемент.returnFocus для улучшения
навигации.FloatingFocusManager и FloatingOverlay для
полной блокировки взаимодействия с фоном.FloatingFocusManager является ключевым инструментом для
создания доступных и удобных всплывающих элементов в интерфейсах на базе
Floating UI, обеспечивая строгий контроль над фокусом и корректную
работу клавиатурной навигации.