Radix UI предоставляет набор высококачественных компонентов для React, ориентированных на доступность, настраиваемость и современный UX. При создании адаптивного интерфейса ключевым моментом является способность компонентов подстраиваться под разные размеры экранов и типы устройств, сохраняя функциональность и визуальную целостность.
Radix UI не предоставляет встроенной CSS-системы, вместо этого компоненты можно интегрировать с любой CSS-библиотекой: Tailwind CSS, Stitches или vanilla-extract. Для адаптивного дизайна особенно важны медиа-запросы и динамическая стилизация через свойства.
Пример использования Stitches для адаптивного меню:
import { styled } from '@stitches/react';
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
const StyledContent = styled(DropdownMenu.Content, {
backgroundColor: 'white',
borderRadius: 6,
padding: 10,
boxShadow: '0 4px 10px rgba(0,0,0,0.1)',
'@media(max-width: 768px)': {
width: '100%',
padding: 8,
},
});
Здесь медиа-запрос
@media(max-width: 768px) позволяет компоненту
DropdownMenu.Content изменять ширину и внутренние отступы
на мобильных устройствах.
Для адаптивного дизайна важно правильно использовать контейнерные
компоненты Radix UI, такие как Popover, Dialog
и Tooltip. Они автоматически подстраиваются под положение и
размеры экрана, но поведение можно дополнительно кастомизировать через
свойства side, align и
sideOffset.
Пример адаптивного Popover:
import * as Popover from '@radix-ui/react-popover';
<Popover.Root>
<Popover.Trigger>Открыть</Popover.Trigger>
<Popover.Content side="bottom" align="center" sideOffset={10}>
Контент поповера
</Popover.Content>
</Popover.Root>
Для мобильных устройств можно изменить поведение с помощью условной логики:
const isMobile = window.innerWidth < 768;
<Popover.Content
side={isMobile ? 'top' : 'bottom'}
align="center"
sideOffset={isMobile ? 5 : 10}
>
Контент поповера
</Popover.Content>
Radix UI предоставляет утилиты для управления видимостью элементов через состояния и анимации. Это особенно полезно для адаптивного интерфейса, когда некоторые компоненты должны скрываться на маленьких экранах.
Пример с Accordion:
import * as Accordion from '@radix-ui/react-accordion';
<Accordion.Root type="single" collapsible>
<Accordion.Item value="item-1">
<Accordion.Header>
<Accordion.Trigger>
Заголовок
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content
style={{
display: window.innerWidth < 768 ? 'none' : 'block',
}}
>
Контент
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>
Компоненты Radix UI поддерживают динамическое
позиционирование и подстройку под размеры окна через свойства
side, align, collisionPadding и
avoidCollisions. Для адаптивного дизайна это позволяет:
Пример использования collisionPadding:
<Popover.Content collisionPadding={isMobile ? 8 : 16}>
Контент
</Popover.Content>
Radix UI поддерживает транзишны и анимации через CSS
и keyframes. Для адаптивного дизайна важно использовать
отдельные анимации для мобильных и десктопных версий,
чтобы они выглядели естественно на разных устройствах.
Пример с анимацией появления поповера:
import { keyframes, styled } from '@stitches/react';
const fadeIn = keyframes({
'0%': { opacity: 0, transform: 'translateY(-10px)' },
'100%': { opacity: 1, transform: 'translateY(0)' },
});
const AnimatedContent = styled(Popover.Content, {
animation: `${fadeIn} 0.2s ease-out`,
'@media(max-width: 768px)': {
animation: 'none', // отключаем анимацию на мобильных для производительности
},
});
Popover, Dialog) под размеры экрана.DropdownMenu + Accordion для компактного
меню на мобильных.Popover + динамическая подстройка side для
контекстного меню на разных экранах.Dialog + медиа-запросы для полноэкранного модального
окна на смартфонах.Radix UI обеспечивает фундамент, на котором можно строить интерфейсы, адаптирующиеся под любое устройство, сочетая доступность, контролируемое позиционирование и гибкую стилизацию.