Интерфейсы современных веб-приложений требуют не только функциональных элементов управления, но и визуальных компонентов, обеспечивающих читаемость, иерархию и структурирование контента. В библиотеке Radix UI такие задачи решаются при помощи небольших, но важнейших примитивов — декоративных компонентов.
К декоративным элементам относятся:
Эти компоненты не содержат сложной логики управления состоянием, однако играют критически важную роль в построении интерфейсов. Они позволяют стандартизировать визуальную структуру приложения и избавиться от повторяющихся CSS-решений.
Основные свойства декоративных компонентов Radix UI:
Separator — это визуальный разделитель, используемый для логического разделения элементов интерфейса.
Типичные сценарии применения:
Separator является не просто линией. Компонент обеспечивает корректную семантику и доступность, что особенно важно для пользователей экранных читалок.
Radix UI распространяется в виде независимых пакетов. Для использования Separator устанавливается отдельный модуль:
npm install @radix-ui/react-separator
Простейший пример горизонтального разделителя.
import * as Separator from "@radix-ui/react-separator";
function Example() {
return (
<div>
<div>Profile</div>
<Separator.Root />
<div>Settings</div>
</div>
);
}
По умолчанию компонент:
divseparatorВизуальный вид задаётся через CSS.
Radix UI не содержит встроенного дизайна. Визуальные свойства задаются самостоятельно.
.Separator {
background-color: #e5e7eb;
}
.Separator[data-orientation="horizontal"] {
height: 1px;
width: 100%;
}
.Separator[data-orientation="vertical"] {
width: 1px;
height: 100%;
}
Использование:
<Separator.Root className="Separator" />
Radix автоматически добавляет атрибут:
data-orientation
что позволяет легко применять разные стили.
Для вертикального разделения используется свойство
orientation.
<Separator.Root
orientation="vertical"
className="Separator"
/>
Пример панели инструментов:
function Toolbar() {
return (
<div className="Toolbar">
<button>Undo</button>
<button>Redo</button>
<Separator.Root orientation="vertical" className="Separator" />
<button>Bold</button>
<button>Italic</button>
</div>
);
}
CSS:
.Toolbar {
display: flex;
align-items: center;
gap: 12px;
}
Иногда разделитель используется исключительно визуально, без смысловой нагрузки.
Для таких случаев предусмотрено свойство:
decorative
<Separator.Root decorative className="Separator" />
В этом режиме:
separatorЭто важно для предотвращения избыточной информации в accessibility-дереве.
Separator часто применяется в комбинации с другими компонентами Radix UI.
<DropdownMenu.Content>
<DropdownMenu.Item>
Profile
</DropdownMenu.Item>
<Separator.Root className="Separator" />
<DropdownMenu.Item>
Logout
</DropdownMenu.Item>
</DropdownMenu.Content>
<section>
<h3>Account</h3>
<AccountSettings />
<Separator.Root className="Separator" />
<h3>Security</h3>
<SecuritySettings />
</section>
1. Семантическая корректность
Экранные читалки распознают элемент как разделитель.
2. Управление ориентацией
Горизонтальное и вертикальное использование.
3. Минимальный DOM
Компонент рендерит простой элемент без лишних обёрток.
4. Универсальная стилизация
Все визуальные свойства контролируются разработчиком.
Aspect Ratio — компонент для сохранения фиксированного соотношения сторон элемента.
Он решает распространённую проблему адаптивной верстки: необходимость поддерживать пропорции изображений, видео и медиа-контента.
Типичные случаи применения:
npm install @radix-ui/react-aspect-ratio
import * as AspectRatio from "@radix-ui/react-aspect-ratio";
function Example() {
return (
<AspectRatio.Root ratio={16 / 9}>
<img src="/image.jpg" alt="Preview" />
</AspectRatio.Root>
);
}
Компонент гарантирует, что контейнер всегда сохраняет пропорции 16:9, независимо от ширины.
Aspect Ratio использует известную технику CSS:
padding-bottom hack
Контейнер вычисляет высоту на основе ширины и заданного коэффициента.
Формула:
height = width / ratio
Таким образом:
| Соотношение | Значение ratio |
|---|---|
| 16:9 | 16/9 |
| 4:3 | 4/3 |
| 1:1 | 1 |
| 3:2 | 3/2 |
Пример карточки с адаптивным изображением.
function Card() {
return (
<div className="Card">
<AspectRatio.Root ratio={16 / 9}>
<img
src="/cover.jpg"
alt="Cover"
className="CardImage"
/>
</AspectRatio.Root>
<div className="CardContent">
Article title
</div>
</div>
);
}
CSS:
.CardImage {
width: 100%;
height: 100%;
object-fit: cover;
}
Использование object-fit позволяет изображению корректно
заполнять контейнер.
Aspect Ratio часто используется для встраивания видео.
<AspectRatio.Root ratio={16 / 9}>
<iframe
src="https://www.youtube.com/embed/example"
title="Video"
allowFullScreen
/>
</AspectRatio.Root>
Это обеспечивает корректную адаптивность без сложных CSS-расчётов.
function GalleryItem({ src }) {
return (
<AspectRatio.Root ratio={1}>
<img src={src} alt="" />
</AspectRatio.Root>
);
}
Использование ratio={1} создаёт идеальные
квадратные элементы, что часто используется в сетках
галерей.
function Grid() {
return (
<div className="Grid">
<Card />
<Card />
<Card />
</div>
);
}
CSS:
.Grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
Aspect Ratio гарантирует одинаковую высоту карточек.
Внутри Aspect Ratio можно размещать любые элементы:
Пример:
<AspectRatio.Root ratio={4 / 3}>
<canvas />
</AspectRatio.Root>
Компонент принимает className.
<AspectRatio.Root
ratio={16 / 9}
className="VideoContainer"
>
<video />
</AspectRatio.Root>
CSS:
.VideoContainer {
border-radius: 8px;
overflow: hidden;
}
Aspect Ratio помогает избежать layout shift — скачков макета при загрузке изображений.
Без фиксированных пропорций браузер не знает будущую высоту изображения, что вызывает перерасчет layout.
Использование Aspect Ratio решает проблему:
Это улучшает показатели Core Web Vitals.
aspect-ratioСовременный CSS содержит свойство:
aspect-ratio
Пример:
.container {
aspect-ratio: 16 / 9;
}
Однако Radix Aspect Ratio имеет преимущества:
1. Совместимость
Работает в старых браузерах без поддержки
aspect-ratio.
2. Консистентность
Одинаковое поведение во всех проектах.
3. Компонентная архитектура
Удобная интеграция с React.
Aspect Ratio часто используется внутри:
Separator, в свою очередь, применяется в:
Эти небольшие декоративные компоненты обеспечивают структурную целостность интерфейса и являются фундаментальными строительными блоками для сложных UI-систем.