В Radix UI механизм отображения и скрытия компонентов часто требует точной настройки задержек для создания плавного пользовательского опыта. Особенно это актуально для компонентов вроде Tooltip, Popover, Dropdown Menu и Hover Card, где мгновенное появление или исчезновение элемента может выглядеть резким или раздражающим.
Radix UI предоставляет два ключевых свойства для управления временем появления и исчезновения компонентов:
delayDuration – задаёт общую задержку
до появления компонента после срабатывания события (например, наведения
мыши).disableDelay – отключает любые
встроенные задержки, заставляя компонент реагировать мгновенно.Например, в компоненте Tooltip:
import * as Tooltip from '@radix-ui/react-tooltip';
<Tooltip.Provider delayDuration={300}>
<Tooltip.Root>
<Tooltip.Trigger>Наведи на меня</Tooltip.Trigger>
<Tooltip.Content>
Подсказка появится через 300 мс
</Tooltip.Content>
</Tooltip.Root>
</Tooltip.Provider>
Здесь 300 мс – стандартная задержка перед появлением
подсказки. Если требуется мгновенная реакция, можно использовать
delayDuration={0} или disableDelay.
Некоторые компоненты, например Popover или Hover Card, поддерживают раздельную настройку задержек для показа и скрытия. Это достигается через свойства:
openDelay – задержка перед открытием
компонента.closeDelay – задержка перед закрытием
компонента.Пример для Hover Card:
import * as HoverCard from '@radix-ui/react-hover-card';
<HoverCard.Root openDelay={400} closeDelay={200}>
<HoverCard.Trigger>Наведи на меня</HoverCard.Trigger>
<HoverCard.Content>
Контент появится через 400 мс и исчезнет через 200 мс
</HoverCard.Content>
</HoverCard.Root>
Такая гибкая настройка позволяет создавать интерфейсы, где элемент открывается медленно для предотвращения случайных срабатываний, но закрывается быстрее для минимизации задержки при уходе курсора.
Задержки показа тесно связаны с анимациями. Radix UI
использует свойство motion и поддерживает подключение
CSS-переходов через классы. Если анимация появления длится дольше, чем
задержка открытия, компонент может визуально появляться “резко”. Чтобы
избежать этого:
openDelay с CSS-анимацией, учитывая её
длительность.onOpenChange для
контроля времени начала анимации.Пример с CSS-переходом:
.tooltip-content {
opacity: 0;
transition: opacity 200ms ease-in-out;
}
.tooltip-content[data-state='open'] {
opacity: 1;
}
<Tooltip.Root delayDuration={200}>
<Tooltip.Trigger>Наведи</Tooltip.Trigger>
<Tooltip.Content className="tooltip-content">
Появление с плавной анимацией
</Tooltip.Content>
</Tooltip.Root>
Radix UI позволяет изменять задержки динамически, что полезно для адаптивного UX. Например, на мобильных устройствах задержку показа можно уменьшить, чтобы избежать лишней паузы при касании:
const isMobile = window.innerWidth < 768;
const delay = isMobile ? 50 : 300;
<Tooltip.Provider delayDuration={delay}>
...
</Tooltip.Provider>
Если курсор быстро перемещается по элементам с подсказками, Radix UI аккуратно сбрасывает таймер задержки. Это предотвращает накопление нескольких одновременных таймеров, что могло бы привести к неожиданному поведению компонента.
openDelay.disableDelay полностью отключает такую логику,
делая реакции мгновенными.Provider vs локальные свойстваTooltip.Provider или
Popover.Provider задаёт глобальную
задержку для всех вложенных компонентов.<Tooltip.Provider delayDuration={300}>
<Tooltip.Root delayDuration={100}>
<Tooltip.Trigger>Локальная задержка</Tooltip.Trigger>
<Tooltip.Content>Только для этого Tooltip 100 мс</Tooltip.Content>
</Tooltip.Root>
</Tooltip.Provider>
openDelay и closeDelay.disableDelay
для мгновенного отображения.Знание тонкостей задержек показа позволяет создавать интерфейсы Radix UI, где поведение элементов ощущается естественно, избегая резких и неожиданных всплытий или исчезновений контента.