Radix UI предоставляет гибкие и высокоуровневые компоненты для
создания интерфейсов, где управление позиционированием элементов имеет
критическое значение. В частности, при работе с карточками и
всплывающими панелями часто используется компонент Popover
или Tooltip, который позволяет задавать положение
относительно целевого элемента с высокой точностью.
Popover и его структураКомпонент Popover состоит из нескольких основных
элементов:
Popover.Root — контейнер, управляющий состоянием
видимости.Popover.Trigger — элемент, который активирует
отображение карточки.Popover.Content — сам контент карточки, который
необходимо позиционировать.Popover.Arrow — стрелка, указывающая на триггер.Пример базового использования:
<Popover.Root>
<Popover.Trigger>Открыть карточку</Popover.Trigger>
<Popover.Content side="top" align="center">
Содержимое карточки
<Popover.Arrow />
</Popover.Content>
</Popover.Root>
side и alignside определяет, с какой стороны
относительно триггера будет появляться карточка:
top — сверхуbottom — снизуleft — слеваright — справаalign управляет выравниванием карточки
относительно триггера:
start — по левому/верхнему краюcenter — по центруend — по правому/нижнему краюКомбинации этих пропсов позволяют точно настроить положение карточки.
Например, side="right" и align="start"
отобразят карточку справа от триггера и выровняют по верхнему краю.
Radix UI поддерживает автоматическое смещение карточки при нехватке
пространства с помощью пропса sideOffset:
<Popover.Content side="bottom" align="center" sideOffset={8}>
Содержимое карточки
</Popover.Content>
Значение sideOffset задаёт отступ от триггера в
пикселях, обеспечивая визуальное разделение между элементами.
Для предотвращения выхода карточки за границы окна используется проп
collisionBoundary и библиотека
@radix-ui/react-primitive:
<Popover.Content collisionBoundary={document.body} sideOffset={10}>
Контент
</Popover.Content>
Это гарантирует, что при появлении карточка останется в видимой области экрана.
Radix UI позволяет применять анимации при появлении карточки через CSS-переходы. Например:
[data-state="open"] {
opacity: 1;
transform: translateY(0);
transition: opacity 200ms ease, transform 200ms ease;
}
[data-state="closed"] {
opacity: 0;
transform: translateY(-10px);
}
Поддержка состояний open и closed позволяет
плавно интегрировать анимации в интерфейс.
Popover.Arrow) и её позиционированиеPopover.Arrow позиционируется автоматически, но её
смещение можно корректировать с помощью пропса offset:
<Popover.Arrow offset={5} />
Значение offset задаёт расстояние стрелки от края
карточки, позволяя точнее выровнять указатель на триггер.
Radix UI использует управляемое и неуправляемое состояние:
defaultOpen — начальное состояние видимости.open + onOpenChange — управляемое
состояние.<Popover.Root open={isOpen} onOpenCha nge={setIsOpen}>
<Popover.Trigger>Кнопка</Popover.Trigger>
<Popover.Content>Контент карточки</Popover.Content>
</Popover.Root>
Это особенно полезно при необходимости синхронизации видимости с внешними событиями или состояниями приложения.
sideOffset и align
для точного размещения — часто стандартного выравнивания
недостаточно для адаптивных интерфейсов.collisionBoundary — предотвращает обрезку карточки
на маленьких экранах.max-width и
min-width — карточки остаются читаемыми независимо
от размера окна.Эти возможности делают Radix UI мощным инструментом для построения динамических, точно позиционируемых интерфейсных элементов, обеспечивая как удобство разработки, так и высокое качество пользовательского опыта.