Radix UI предоставляет мощный и гибкий механизм управления фокусом в интерфейсах на основе React. Контроль фокуса критически важен для доступности (accessibility) и пользовательского опыта, особенно при работе с компонентами, которые открываются динамически, такими как модальные окна, всплывающие панели и меню.
Фокус определяет, какой элемент интерфейса активен и готов к взаимодействию с клавиатурой. Radix UI управляет фокусом, исходя из следующих принципов:
Эти механизмы особенно важны для пользователей, которые полагаются на клавиатуру и вспомогательные технологии.
Radix UI предоставляет компонент Dialog с встроенной поддержкой управления фокусом. Основные возможности:
import * as Dialog from '@radix-ui/react-dialog';
<Dialog.Root>
<Dialog.Trigger>Открыть модальное окно</Dialog.Trigger>
<Dialog.Content>
<Dialog.Title>Заголовок</Dialog.Title>
<Dialog.Description>Описание контента</Dialog.Description>
<input type="text" placeholder="Ваше имя" />
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Root>
Dialog.Content фокус автоматически перемещается на первый
интерактивный элемент, в данном примере –
<input>.Dialog.Trigger.Компоненты Menu и DropdownMenu также имеют встроенное управление фокусом:
import * as Menu from '@radix-ui/react-menu';
<Menu.Root>
<Menu.Trigger>Открыть меню</Menu.Trigger>
<Menu.Content>
<Menu.Item>Пункт 1</Menu.Item>
<Menu.Item>Пункт 2</Menu.Item>
<Menu.Item>Пункт 3</Menu.Item>
</Menu.Content>
</Menu.Root>
disabled не получают фокус, пропускаясь при навигации
стрелками.Radix UI позволяет переопределять стандартное поведение фокуса:
FocusScope или Dialog.Content позволяет
указать, какой элемент получать фокус при открытии.Пример использования FocusScope:
import { FocusScope } from '@radix-ui/react-focus-scope';
<FocusScope contain restoreFocus autoFocus>
<button>Элемент 1</button>
<button>Элемент 2</button>
</FocusScope>
FocusScope.Если компонент использует нестандартные HTML-элементы, можно явно указать, какой элемент будет получать фокус:
<FocusScope autoFocus>
<div tabIndex={0}>Фокусируемый div</div>
</FocusScope>
tabIndex={0} становится интерактивным и
доступным для фокусировки.FocusScope.Radix UI обеспечивает соответствие стандартам WAI-ARIA:
aria-modal="true".При вложенных областях фокуса (FocusScope внутри
FocusScope) Radix UI управляет контекстами:
FocusScope получает приоритет при Tab
навигации.restoreFocus работает корректно для каждого уровня
вложенности.<FocusScope restoreFocus>
<button>Главный элемент</button>
<FocusScope contain restoreFocus>
<button>Вложенный элемент 1</button>
<button>Вложенный элемент 2</button>
</FocusScope>
</FocusScope>
FocusScope вокруг модальных окон, диалогов
и кастомных интерактивных областей.restoreFocus для обеспечения
предсказуемого поведения интерфейса.tabIndex и aria-* атрибуты для совместимости с
ассистивными технологиями.Эффективное управление фокусом с Radix UI позволяет создавать интерфейсы, которые безопасно и удобно использовать как с мышью, так и с клавиатурой, обеспечивая доступность и согласованность поведения на всех уровнях приложения.