Radix UI предоставляет мощный и гибкий механизм для позиционирования всплывающих элементов, таких как Popover, Dropdown Menu, Tooltip и других компонентов, которые должны быть привязаны к определённому элементу — триггеру. Правильное позиционирование критично для UX: оно гарантирует, что интерактивные элементы не перекрывают важный контент, корректно отображаются на любых разрешениях экрана и учитывают динамическое изменение размеров окна.
В Radix UI позиционирование реализуется через свойства side, align, sideOffset и alignOffset, которые управляют расположением контентного блока относительно триггера.
side — указывает сторону, на которой должен появляться контент. Допустимые значения:
top — над триггеромbottom — под триггеромleft — слева от триггераright — справа от триггераalign — определяет выравнивание контента по выбранной стороне:
start — выравнивание по началу (левый край для
top/bottom, верхний край для left/right)center — выравнивание по центруend — выравнивание по концу (правый край для
top/bottom, нижний край для left/right)sideOffset — смещение от триггера по выбранной стороне. Положительное значение отдаляет контент от триггера, отрицательное — приближает.
alignOffset — смещение вдоль оси выравнивания. Позволяет точно подгонять контент по горизонтали или вертикали относительно триггера.
Пример использования с Popover:
<Popover.Root>
<Popover.Trigger>Открыть</Popover.Trigger>
<Popover.Content side="bottom" align="start" sideOffset={10} alignOffset={5}>
Контент поповера
</Popover.Content>
</Popover.Root>
В этом примере поповер появится под триггером, с небольшим отступом и смещением по горизонтали.
Radix UI использует библиотеку @radix-ui/popper под капотом, что позволяет автоматически корректировать позицию при недостатке места на экране. Для этого применяются свойства:
<Popover.Content side="bottom" fallbackSides={['top', 'right', 'left']} sideOffset={8}>
Контент с fallback
</Popover.Content>
Для визуальной плавности перемещения контента применяется transform-origin, который автоматически подстраивается под выбранное положение:
side="top" origin находится внизу контента.side="left" origin справа и т.д.Это позволяет создавать анимации появления, которые выглядят
естественно, например, scale или fade.
[data-state='open'] {
animation: fadeIn 200ms ease-out, scaleIn 200ms ease-out;
}
@keyframes scaleIn {
0% { transform: scale(0.95); }
100% { transform: scale(1); }
}
Для компонентов, которые должны оставаться привязанными к триггеру даже при прокрутке, Radix поддерживает свойство sticky:
body, что помогает избежать обрезки родительскими
контейнерами с overflow: hidden.<Popover.Content side="right" sticky sideOffset={12} portalled>
Контент, остающийся видимым при прокрутке
</Popover.Content>
При использовании вложенных триггеров, например в Dropdown Menu, важно учитывать иерархию:
overflow
и скроллом.transform-origin, чтобы движение
контента выглядело естественно, не “выстреливало” от центра окна.Понимание и грамотное применение этих принципов позволяет создавать интерфейсы с интерактивными компонентами, которые интуитивно понятны пользователю и устойчивы к различным условиям отображения, минимизируя баги с позиционированием и наложением.