Элементы подменю (Submenu) в Radix UI представляют собой расширение стандартных меню, позволяющее создавать вложенные уровни навигации и взаимодействия. Подменю полезны для организации сложной структуры интерфейса, где требуется сгруппировать похожие элементы или предложить пользователю дополнительные опции без перегрузки основного меню.
Radix UI реализует подменю через отдельные компоненты, сохраняя при этом единый API и подход к доступности, включая управление фокусом и клавиатурную навигацию.
Submenu Контейнер для вложенных
элементов меню. Определяет область, в которой будет открываться
подменю.
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
<DropdownMenu.Root>
<DropdownMenu.Trigger>Меню</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item>Элемент 1</DropdownMenu.Item>
<DropdownMenu.Sub>
<DropdownMenu.SubTrigger>Подменю</DropdownMenu.SubTrigger>
<DropdownMenu.SubContent>
<DropdownMenu.Item>Подэлемент 1</DropdownMenu.Item>
<DropdownMenu.Item>Подэлемент 2</DropdownMenu.Item>
</DropdownMenu.SubContent>
</DropdownMenu.Sub>
<DropdownMenu.Item>Элемент 2</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>SubTrigger Элемент, который
инициирует открытие подменю. Может реагировать на наведение мыши, клик
или фокус с клавиатуры.
Особенности:
hover, focus и
active обрабатываются автоматически.SubContent Контент подменю, который
отображается при активации SubTrigger. Ключевые
параметры:
sideOffset — отступ от родительского элемента.align — выравнивание подменю относительно триггера
(start, end, center).collisionPadding — минимальное расстояние до края
экрана для автоматической коррекции позиции.Radix UI подменю обеспечивает поддержку ARIA-атрибутов:
aria-haspopup="menu" для триггеров подменю.aria-expanded в зависимости от
состояния.Встроенные функции управления фокусом:
Escape возвращает фокус к
SubTrigger.SubContent можно анимировать с помощью CSS-переходов или
библиотек типа framer-motion. Radix UI предоставляет
возможность:
open,
closed.className и style для
индивидуальной стилизации.<DropdownMenu.SubContent
sideOffset={5}
align="start"
className="submenu-content"
>
...
</DropdownMenu.SubContent>
CSS для анимации:
.submenu-content {
opacity: 0;
transform: translateX(-10px);
transition: opacity 0.2s, transform 0.2s;
}
[data-state="open"].submenu-content {
opacity: 1;
transform: translateX(0);
}
Radix UI поддерживает неограниченное количество уровней вложенности.
Для создания вложенного подменю внутри подменю используется та же
структура Sub → SubTrigger →
SubContent.
Рекомендации по дизайну:
collisionPadding.Подменю поддерживают все стандартные события Radix UI:
onOpenChange — реагирует на открытие/закрытие
подменю.onSelect — срабатывает при выборе элемента.onPointerEnter / onPointerLeave — для
кастомной навигации при наведении.Эти события позволяют интегрировать подменю с глобальным состоянием приложения или внешними библиотеками управления состоянием, такими как Redux или Zustand.
SubTrigger с явными индикаторами наличия
подменю (стрелка, иконка).Элементы подменю Radix UI позволяют создавать мощные, доступные и легко управляемые интерфейсы с множеством уровней вложенности, полностью совместимые с современными стандартами веб-доступности и практиками UX.