Компонент Modal в библиотеке Radix UI предназначен для создания диалоговых окон и всплывающих элементов, которые требуют внимания пользователя и блокируют взаимодействие с остальной частью интерфейса до закрытия. В Radix UI этот компонент реализован с акцентом на доступность и контроль над состоянием.
Modal в Radix UI строится из нескольких ключевых компонентов:
Dialog — контейнер, управляющий
состоянием модального окна.DialogTrigger — элемент, который
открывает модальное окно при взаимодействии. Обычно это кнопка или
ссылка.DialogPortal — компонент, который
позволяет рендерить модальное окно вне текущего DOM-дерева для избежания
проблем с z-index и позиционированием.DialogOverlay — затемнённый фон за
модальным окном, который предотвращает взаимодействие с остальной
страницей.DialogContent — основная область
содержимого модального окна. Содержит заголовки, текст, формы и
кнопки.DialogTitle — заголовок окна, важный
для доступности.DialogDescription — описание окна,
предоставляющее дополнительный контекст для пользователя.DialogClose — кнопка для закрытия
окна, интегрированная с внутренним управлением состоянием.import * as Dialog from '@radix-ui/react-dialog';
<Dialog.Root>
<Dialog.Trigger>Открыть окно</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Overlay className="overlay"/>
<Dialog.Content className="content">
<Dialog.Title>Заголовок окна</Dialog.Title>
<Dialog.Description>Описание контента окна</Dialog.Description>
<button>Действие</button>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
Dialog.Root использует контролируемое и
неконтролируемое состояние. По умолчанию состояние
неконтролируемое, и окно открывается через DialogTrigger.
Для контролируемого состояния используется проп open:
const [isOpen, setIsOpen] = useState(false);
<Dialog.Root open={isOpen} onOpenCha nge={setIsOpen}>
<Dialog.Trigger>Открыть окно</Dialog.Trigger>
<Dialog.Portal>
<Dialog.Overlay />
<Dialog.Content>
<Dialog.Title>Контролируемый Modal</Dialog.Title>
<Dialog.Close>Закрыть</Dialog.Close>
</Dialog.Content>
</Dialog.Portal>
</Dialog.Root>
Использование контролируемого состояния позволяет синхронизировать открытие модального окна с внешними событиями и логикой приложения.
Radix UI предоставляет базовую структуру и классы для элементов, но визуальная часть определяется самостоятельно. Наиболее часто используется CSS-модули, Tailwind или Styled Components.
Пример стилизации с CSS:
.overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.5);
}
.content {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 2rem;
border-radius: 8px;
max-width: 500px;
width: 90%;
}
Для анимаций удобно использовать свойства opacity и
transform, управляемые через классы при
монтировании/размонтировании модального окна.
Radix UI обеспечивает встроенную доступность:
DialogContent при
открытии окна.aria-labelledby и
aria-describedby добавляются автоматически на основе
DialogTitle и DialogDescription.DialogOverlay.DialogTrigger можно
использовать с любым элементом, включая кастомные кнопки и иконки.DialogPortal можно
рендерить в конкретный контейнер, если требуется сложная структура
DOM.DialogClose) и поддерживать клавишу Escape.DialogContent, чтобы не ломать
позиционирование.Radix UI Modal сочетает строгую доступность и гибкость, позволяя создавать масштабируемые диалоговые интерфейсы с полным контролем над состоянием и внешним видом.