Библиотека Radix UI предоставляет низкоуровневые компоненты для построения доступных и настраиваемых интерфейсов в React. Два ключевых элемента, которые часто используются вместе в интерактивных контролах, таких как слайдеры и переключатели, — это Root и Thumb. Понимание их структуры и взаимодействия является фундаментом для создания сложных пользовательских интерфейсов.
Root служит корневым контейнером для интерактивного элемента. В случае слайдера это основной трек, на котором перемещается Thumb. Основные характеристики Root:
role="slider" и aria-valuenow, которые
обновляются при изменении значения.Пример базового использования Root в слайдере:
import * as Slider from '@radix-ui/react-slider';
<Slider.Root
defaultValue={[50]}
min={0}
max={100}
step={1}
aria-label="Volume"
>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
</Slider.Root>
Ключевые моменты Root:
defaultValue задаёт начальное положение ползунка.min и max определяют диапазон
значений.step контролирует шаг изменения значения.Thumb представляет собой интерактивную ручку, которую пользователь перетаскивает вдоль трека. Основные особенности:
aria-valuenow, aria-valuemin,
aria-valuemax от Root, что делает ползунок полностью
доступным для экранных читалок.Пример кастомного Thumb:
<Slider.Thumb
className="w-5 h-5 bg-blue-500 rounded-full shadow-md hover:bg-blue-600 focus:outline-none focus:ring-2 focus:ring-blue-400"
/>
Ключевые моменты Thumb:
Root и Thumb тесно связаны через состояние слайдера. Root хранит текущее значение, а Thumb визуально отображает его положение. При изменении значения Root автоматически обновляет координаты Thumb. Этот паттерн обеспечивает консистентность и предсказуемость поведения компонентов.
Root управляет событиями onValueChange и
onValueCommit, которые позволяют синхронизировать состояние
приложения с позицией Thumb:
<Slider.Root
defaultValue={[30]}
min={0}
max={100}
step={5}
onValueCha nge={(value) => console.log('Current value:', value)}
>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
</Slider.Root>
onValueChange вызывается при каждом перемещении
Thumb.onValueCommit срабатывает, когда пользователь завершает
взаимодействие (например, отпускает мышь).Radix UI предоставляет только базовую функциональность. Внешний вид компонентов Root и Thumb полностью настраивается через CSS или CSS-in-JS. Основные подходы:
Пример интеграции с Tailwind:
<Slider.Root className="relative w-full h-2 bg-gray-200 rounded">
<Slider.Track className="absolute h-2 bg-gray-400 rounded">
<Slider.Range className="bg-blue-500 rounded" />
</Slider.Track>
<Slider.Thumb className="w-4 h-4 bg-white border-2 border-blue-500 rounded-full shadow-md focus:ring-2 focus:ring-blue-300" />
</Slider.Root>
Radix UI позволяет использовать несколько Thumb внутри одного Root для создания диапазонных слайдеров. Каждый Thumb управляет своим значением, а Root координирует их позиции и предотвращает пересечение:
<Slider.Root defaultValue={[20, 80]} min={0} max={100} step={1}>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
<Slider.Thumb />
</Slider.Root>
onValueChange для локальных обновлений.Root и Thumb формируют основу любого интерактивного контрола в Radix UI. Понимание их внутренней структуры, передачи событий и кастомизации позволяет создавать полностью доступные, гибкие и визуально настраиваемые слайдеры и другие элементы управления.