В библиотеке React Aria управление фокусом является ключевым аспектом создания доступных пользовательских интерфейсов. Компонент FocusScope позволяет изолировать фокус внутри определённого участка интерфейса, гарантируя правильное поведение клавиатурной навигации и улучшая взаимодействие с ассистивными технологиями.
FocusScope обеспечивает следующие возможности:
Использование FocusScope критически важно для модальных окон, выпадающих меню, панели и других компонентов, где важно удерживать пользователя внутри интерфейсного блока.
Для использования FocusScope необходимо импортировать соответствующие хуки из React Aria:
import { FocusScope } from "@react-aria/focus";
Простейший пример:
function Modal({ isOpen, onClose }) {
if (!isOpen) return null;
return (
<FocusScope contain restoreFocus autoFocus>
<div role="dialog" aria-modal="true">
<button onCl ick={onClose}>Закрыть</button>
<input type="text" placeholder="Имя" />
<button>Отправить</button>
</div>
</FocusScope>
);
}
Разбор параметров FocusScope:
contain — включает изоляцию фокуса, предотвращая выход
за пределы блока.restoreFocus — возвращает фокус к элементу, активному
до открытия области.autoFocus — автоматически ставит фокус на первый
фокусируемый элемент внутри блока при монтировании.FocusScope корректно работает с динамическими элементами и вложенными областями:
<FocusScope contain restoreFocus autoFocus>
<div>
<button>Первый</button>
<FocusScope contain>
<div>
<input placeholder="Вложенный ввод" />
<button>Вложенный</button>
</div>
</FocusScope>
<button>Последний</button>
</div>
</FocusScope>
Вложенные FocusScope позволяют создавать многоуровневые интерфейсы, где каждая подобласть может изолировать фокус локально. При этом внешний FocusScope продолжает корректно управлять фокусом после закрытия внутреннего.
React Aria предоставляет гибкий контроль над тем, какой элемент
получает фокус. Параметр autoFocus может принимать:
Пример использования селектора:
<FocusScope autoFocus="[data-autofocus]">
<input data-autofocus placeholder="Фокус сюда" />
<input placeholder="Следующий" />
</FocusScope>
Параметр restoreFocus обеспечивает корректный возврат
фокуса после закрытия модального окна или панели. Это критично для
пользователей, работающих с экранными читалками или клавиатурой:
function Dropdown({ isOpen }) {
const buttonRef = React.useRef();
return (
<>
<button ref={buttonRef}>Открыть меню</button>
{isOpen && (
<FocusScope contain restoreFocus autoFocus>
<ul role="menu">
<li role="menuitem">Элемент 1</li>
<li role="menuitem">Элемент 2</li>
</ul>
</FocusScope>
)}
</>
);
}
При закрытии меню фокус возвращается на кнопку, что делает взаимодействие предсказуемым и доступным.
FocusScope корректно обрабатывает:
Это позволяет создавать сложные интерактивные компоненты без дополнительного ручного контроля за фокусом.
autoFocus для первого важного
интерактивного элемента.restoreFocus, чтобы пользователи не
теряли контекст.role="dialog", aria-modal) для полной
доступности.FocusScope часто используется совместно с:
Такое сочетание обеспечивает комплексное управление доступностью и фокусом без лишнего кода.