Slider
用于在连续区间内选择数值或数值范围的滑块组件
Slider 用于在连续范围中选择一个值或一段范围。组件基于 Radix Slider 封装,支持受控值、范围值、方向、尺寸、主题色和内部 slot 样式覆盖。
import {
Slider,
SliderRange,
SliderRoot,
SliderThumb,
SliderTrack
} from '@skyroc/web-ui';何时使用
- 需要在连续范围中选择数值,例如音量、亮度、百分比或价格范围。
- 用户更关注相对大小,而不是精确输入。
- 需要范围选择时,可以通过两个值渲染双 thumb。
- 需要精确输入或键盘录入时,优先使用 NumberInput。
基础用法
通过 defaultValue 设置非受控初始值。Slider 会根据 defaultValue 或 value 数组渲染对应数量的 thumb。
<Slider
defaultValue={[40]}
max={100}
step={1}
/>受控模式
使用 value 和 onValueChange 控制当前值。value 始终是数组,即使只有一个 thumb。
const [value, setValue] = useState([35]);
<Slider
value={value}
onValueChange={setValue}
/>范围选择
传入两个数值会渲染两个 thumb,用于选择范围。可以通过 minStepsBetweenThumbs 控制两个 thumb 的最小间距。
<Slider
defaultValue={[25, 75]}
max={100}
minStepsBetweenThumbs={1}
step={5}
/>颜色
通过 color 设置轨道、已选范围和 thumb 的主题色。
| 颜色 | 语义 | 适用场景 |
|---|---|---|
primary | 主要操作 | 默认滑块、主设置项 |
destructive | 危险状态 | 风险阈值、危险范围 |
success | 成功状态 | 正向范围、推荐值 |
warning | 警告状态 | 临界值、需要注意的范围 |
info | 信息状态 | 中性信息调节 |
carbon | 中性深色 | 无语义调节 |
secondary | 次级状态 | 辅助设置 |
accent | 强调状态 | 需要视觉强调的调节项 |
方向
通过 orientation="vertical" 使用纵向滑块。纵向滑块需要外层容器提供明确高度。
<div className="h-40">
<Slider
defaultValue={[10, 60]}
orientation="vertical"
/>
</div>尺寸
通过 size 调整轨道厚度和 thumb 大小,从 xs 到 2xl 共 6 个尺寸。
| 尺寸 | 适用场景 |
|---|---|
xs | 紧凑筛选器、表格项 |
sm | 小型表单 |
md | 常规场景(默认) |
lg | 设置页 |
xl | 强调调节项 |
2xl | 大尺寸展示或触控区 |
自定义样式
通过 classNames 覆盖内部 slot。常用 slot 包括 root、track、range 和 thumb。
<Slider
classNames={{
track: 'bg-carbon/15',
range: 'bg-carbon',
thumb: 'border-carbon'
}}
defaultValue={[55]}
/>API
Slider
主组件组合 Root、Track、Range 和 Thumb。defaultValue / value 的数组长度决定 thumb 数量。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| defaultValue | 非受控模式下的默认值数组 | number[] | - |
| value | 受控模式下的当前值数组 | number[] | - |
| onValueChange | 拖动过程中值变化时触发 | (value: number[]) => void | - |
| onValueCommit | 拖动结束提交值时触发 | (value: number[]) => void | - |
| min | 最小值 | number | 0 |
| max | 最大值 | number | 100 |
| step | 步长 | number | 1 |
| minStepsBetweenThumbs | 多个 thumb 之间的最小步数间距 | number | - |
| orientation | 滑块方向 | 'horizontal' | 'vertical' | 'horizontal' |
| dir | 文本方向,透传给 Radix Slider Root | 'ltr' | 'rtl' | - |
| inverted | 是否反转取值方向 | boolean | - |
| disabled | 是否禁用滑块 | boolean | - |
| color | 主题颜色,影响 range、track 和 thumb | 'primary' | 'destructive' | 'success' | 'warning' | 'info' | 'carbon' | 'secondary' | 'accent' | 'primary' |
| size | 尺寸,影响轨道厚度和 thumb 大小 | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 'md' |
| className | 根容器 class | ClassValue | - |
| classNames | 各 slot 的自定义 class | SliderClassNames | - |
| trackProps | 传递给 SliderTrack 的额外 props | SliderTrackProps | - |
| rangeProps | 传递给 SliderRange 的额外 props | SliderRangeProps | - |
| thumbProps | 传递给每个 SliderThumb 的额外 props | SliderThumbProps | - |
结构组件
需要完全控制结构时,可以手动组合 Root、Track、Range 和 Thumb。
| 属性 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| SliderRoot | 滑块根容器,基于 Radix Slider Root | SliderRootProps | - |
| SliderTrack | 轨道容器 | SliderTrackProps | - |
| SliderRange | 已选范围 | SliderRangeProps | - |
| SliderThumb | 可拖动手柄 | SliderThumbProps | - |
类型
SliderProps
Slider 主组件属性。继承 SliderRootProps,并增加主题色、slot class 和结构组件 props。
| 字段 | 类型 | 说明 |
|---|---|---|
| defaultValue | number[] | 默认值数组。 |
| value | number[] | 受控值数组。 |
| onValueChange | (value: number[]) => void | 值变化回调。 |
| onValueCommit | (value: number[]) => void | 值提交回调。 |
| min | number | 最小值。 |
| max | number | 最大值。 |
| step | number | 步长。 |
| minStepsBetweenThumbs | number | 多个 thumb 的最小步数间距。 |
| orientation | 'horizontal' | 'vertical' | 滑块方向。 |
| dir | 'ltr' | 'rtl' | 文本方向。 |
| inverted | boolean | 是否反转取值方向。 |
| disabled | boolean | 是否禁用。 |
| color | 'primary' | 'destructive' | 'success' | 'warning' | 'info' | 'carbon' | 'secondary' | 'accent' | 主题颜色。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 组件尺寸。 |
| className | ClassValue | 根容器 class。 |
| classNames | SliderClassNames | slot class 配置。 |
| trackProps | SliderTrackProps | 轨道属性。 |
| rangeProps | SliderRangeProps | 范围属性。 |
| thumbProps | SliderThumbProps | 手柄属性。 |
SliderClassNames
Slider 各 slot 的自定义 class。
| 字段 | 类型 | 说明 |
|---|---|---|
| root | ClassValue | 根容器 class。 |
| track | ClassValue | 轨道 class。 |
| range | ClassValue | 已选范围 class。 |
| thumb | ClassValue | 手柄 class。 |
SliderRootProps
根容器属性,基于 Radix Slider Root。
| 字段 | 类型 | 说明 |
|---|---|---|
| defaultValue | number[] | 默认值数组。 |
| value | number[] | 受控值数组。 |
| onValueChange | (value: number[]) => void | 值变化回调。 |
| onValueCommit | (value: number[]) => void | 值提交回调。 |
| orientation | 'horizontal' | 'vertical' | 滑块方向。 |
| disabled | boolean | 是否禁用。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 根容器尺寸。 |
| className | ClassValue | 根容器 class。 |
SliderTrackProps
轨道属性,基于 Radix Slider Track,并增加主题色和尺寸。
| 字段 | 类型 | 说明 |
|---|---|---|
| children | ReactNode | 通常放置 SliderRange。 |
| color | 'primary' | 'destructive' | 'success' | 'warning' | 'info' | 'carbon' | 'secondary' | 'accent' | 主题颜色。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 轨道尺寸。 |
| className | ClassValue | 轨道 class。 |
SliderRangeProps
已选范围属性,基于 Radix Slider Range,并增加主题色。
| 字段 | 类型 | 说明 |
|---|---|---|
| color | 'primary' | 'destructive' | 'success' | 'warning' | 'info' | 'carbon' | 'secondary' | 'accent' | 主题颜色。 |
| className | ClassValue | 范围 class。 |
SliderThumbProps
手柄属性,基于 Radix Slider Thumb,并增加主题色和尺寸。
| 字段 | 类型 | 说明 |
|---|---|---|
| color | 'primary' | 'destructive' | 'success' | 'warning' | 'info' | 'carbon' | 'secondary' | 'accent' | 主题颜色。 |
| size | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | 手柄尺寸。 |
| className | ClassValue | 手柄 class。 |