В библиотеке Radix UI компоненты создаются с учётом полной контролируемости их поведения и внешнего вида. Одним из ключевых аспектов интерфейсного дизайна является сохранение пропорций элементов при изменении размеров контейнера, окна браузера или динамическом изменении содержимого. Radix UI предоставляет гибкие инструменты для управления размерами и пропорциями, которые можно комбинировать с CSS и JavaScript.
Radix UI не ограничивает стилизацию компонентов. Основной подход для сохранения пропорций — использование контейнеров с относительными размерами:
import * as Tooltip from '@radix-ui/react-tooltip';
function ProportionalTooltip() {
return (
<Tooltip.Root>
<Tooltip.Trigger style={{ width: '50%', aspectRatio: '16/9' }}>
Наведи курсор
</Tooltip.Trigger>
<Tooltip.Content>
Это содержимое тултипа с сохранением пропорций
</Tooltip.Content>
</Tooltip.Root>
);
}
width: '50%' задаёт ширину относительно родителя.aspectRatio: '16/9' гарантирует, что высота
автоматически подстроится под ширину, сохраняя пропорции.Использование aspect-ratio является современным и
простым способом контроля пропорций, поддерживаемым в большинстве
браузеров.
Для динамических интерфейсов часто используют CSS Grid или Flexbox:
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(3, 1fr)', gap: '16px' }}>
<Tooltip.Root>
<Tooltip.Trigger style={{ aspectRatio: '1/1' }}>Кнопка 1</Tooltip.Trigger>
<Tooltip.Content>Содержимое 1</Tooltip.Content>
</Tooltip.Root>
<Tooltip.Root>
<Tooltip.Trigger style={{ aspectRatio: '1/1' }}>Кнопка 2</Tooltip.Trigger>
<Tooltip.Content>Содержимое 2</Tooltip.Content>
</Tooltip.Root>
</div>
1fr.aspectRatio: '1/1' обеспечивает квадратную форму
независимо от ширины колонки.Такой подход подходит для сеток кнопок, карточек и других интерактивных элементов Radix UI.
В некоторых случаях требуется менять пропорции элементов программно. Radix UI совместим с управляемыми состояниями:
import { useState } from 'react';
function ResizableCard() {
const [width, setWidth] = useState(200);
const height = width * 0.75; // соотношение 4:3
return (
<div style={{ width, height, background: '#e0e0e0' }}>
<input
type="range"
min="100"
max="500"
value={width}
onCha nge={(e) => setWidth(parseInt(e.target.value))}
/>
Контент с фиксированным соотношением
</div>
);
}
Radix UI предоставляет Dialog и Popover с полной контролируемостью размеров:
import * as Dialog from '@radix-ui/react-dialog';
function ProportionalDialog() {
return (
<Dialog.Root>
<Dialog.Trigger>Открыть диалог</Dialog.Trigger>
<Dialog.Content style={{ width: '80%', maxWidth: '600px', aspectRatio: '16/9' }}>
Контент диалога с сохранением пропорций
</Dialog.Content>
</Dialog.Root>
);
}
maxWidth ограничивает расширение диалога.aspectRatio поддерживает визуальную гармонию независимо
от ширины экрана.Для адаптивного дизайна Radix UI полностью совместим с медиазапросами CSS:
@media (max-width: 768px) {
.tooltip-trigger {
width: 100%;
aspect-ratio: 4/3;
}
}
@media (min-width: 769px) {
.tooltip-trigger {
width: 50%;
aspect-ratio: 16/9;
}
}
aspect-ratio для простого сохранения
пропорций.maxWidth и
maxHeight для модальных компонентов.Соблюдение этих подходов обеспечивает визуальную консистентность и гибкость интерфейсов, построенных на Radix UI, независимо от типа компонента и сценария использования.