В библиотеке Radix UI компонент Thumb является
ключевым элементом для создания пользовательских ползунков
(Slider), диапазонов (RangeSlider) и других
элементов управления, где требуется интерактивная ручка для изменения
значения. Thumb представляет собой визуальный индикатор, который можно
перемещать, а также полностью настраивать под дизайн приложения.
Thumb в Radix UI всегда является дочерним элементом компонента Slider. Его базовая структура выглядит следующим образом:
import * as Slider from '@radix-ui/react-slider';
<Slider.Root defaultValue={[50]} max={100} step={1}>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
</Slider.Root>
Основной способ изменить внешний вид Thumb — использование CSS. Radix UI не накладывает строгих ограничений на стили, что позволяет полностью контролировать его визуализацию.
.slider-thumb {
width: 24px;
height: 24px;
background-color: #4f46e5;
border-radius: 50%;
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
cursor: pointer;
transition: transform 0.2s ease;
}
.slider-thumb:hover {
transform: scale(1.1);
}
.slider-thumb:focus {
outline: 2px solid #6366f1;
outline-offset: 2px;
}
<Slider.Thumb className="slider-thumb" />
Ключевые моменты кастомизации:
Thumb автоматически поддерживает клавиатурное управление
(ArrowLeft, ArrowRight, ArrowUp,
ArrowDown) и фокус, что делает его доступным для
пользователей с клавиатурой. Для улучшения UX можно добавлять
собственные визуальные индикаторы фокуса:
.slider-thumb:focus-visible {
box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.3);
}
Radix UI позволяет заменять стандартный элемент Thumb на собственный компонент, включая иконки или SVG:
<Slider.Thumb>
<svg width="24" height="24" viewBox="0 0 24 24">
<circle cx="12" cy="12" r="10" fill="#4f46e5" />
</svg>
</Slider.Thumb>
Для интеграции с библиотеками вроде styled-components
или @stitches/react Thumb можно оформить как полностью
стилизованный компонент:
import { styled } from '@stitches/react';
import * as Slider from '@radix-ui/react-slider';
const StyledThumb = styled(Slider.Thumb, {
width: 20,
height: 20,
borderRadius: '50%',
backgroundColor: '#4f46e5',
boxShadow: '0 2px 10px rgba(0,0,0,0.2)',
'&:hover': { transform: 'scale(1.1)' },
'&:focus': { outline: '2px solid #6366f1' },
});
<Slider.Root defaultValue={[50]} max={100}>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<StyledThumb />
</Slider.Root>
Thumb может изменять стиль в зависимости от состояния слайдера. Например, цвет может отражать текущее значение:
<Slider.Thumb
style={{
backgroundColor: value > 50 ? '#10b981' : '#ef4444',
}}
/>
Это позволяет создавать интерактивные индикаторы прогресса или состояния, визуально отражающие значения.
Компонент Slider может содержать несколько Thumb для создания диапазонов:
<Slider.Root defaultValue={[20, 80]} max={100} step={1}>
<Slider.Track>
<Slider.Range />
</Slider.Track>
<Slider.Thumb />
<Slider.Thumb />
</Slider.Root>
Для плавных эффектов перемещения можно подключать библиотеки
анимации, например framer-motion:
import { motion } from 'framer-motion';
<Slider.Thumb asChild>
<motion.div
style={{ width: 24, height: 24, borderRadius: '50%', backgroundColor: '#4f46e5' }}
whileHover={{ scale: 1.2 }}
whileTap={{ scale: 0.9 }}
/>
</Slider.Thumb>
Thumb в Radix UI — это гибкий строительный блок, который сочетает простоту управления и возможность полной визуальной кастомизации, что делает его идеальным для сложных и современных интерфейсов.