Range Slider
通过拖动手势或键盘步进,在轨道上调整数值。
适用场景
- 当界面需要以下行为时使用 Range Slider:通过拖动手势或键盘步进,在轨道上调整数值。
安装
选择安装方式,用法示例将同步更新导入路径。
$ bunx --bun shadcn-vue@2.8.2 add https://orvui.efu.me/r/range-slider.json https://orvui.efu.me/r/range-slider-inline.json https://orvui.efu.me/r/range-slider-fluid.json https://orvui.efu.me/r/range-slider-wave.json https://orvui.efu.me/r/range-slider-bubble.json https://orvui.efu.me/r/range-slider-ruler.json
首次使用时,将安装的 src/components/orvui/styles.css 导入项目样式入口。
示例
内联
inline.vue把标签和数值放在轨道内部,附近刻度为手柄让出空间。
packages/vue/src/motion/range-slider/examples/inline.vue
<script setup lang="ts">
import { InlineSlider } from "@/components/orvui/motion/range-slider";
const spokenPixels = (value: number) => `${value} pixels`;
</script>
<template><div class="w-full max-w-sm"><InlineSlider :default-value="48" :min="8" :max="128" :step="8" label="Icon size" aria-label="Icon size" :format-value-text="spokenPixels" /></div></template>
packages/vue/src/motion/range-slider/src/InlineSlider.vue
Range Slider
stepped.vue让窄手柄在标记步进之间吸附,并强调每次落定。
Drag the handle40
packages/vue/src/motion/range-slider/examples/stepped.vue
<script setup lang="ts">
import { ref } from "vue";
import { RangeSlider } from "@/components/orvui/motion/range-slider";
const amount = ref(40);
</script>
<template><div class="flex w-full max-w-sm flex-col gap-3"><div class="flex items-center justify-between text-sm text-muted-foreground"><span>Drag the handle</span><span class="tabular-nums text-foreground">{{ amount }}</span></div><RangeSlider v-model="amount" :step="5" aria-label="Value" /></div></template>
packages/vue/src/motion/range-slider/src/RangeSlider.vue
Fluid Slider
fluid.vue使用圆润的移动填充表示数值,替代独立手柄。
Brightness35%
Brightness35%
packages/vue/src/motion/range-slider/examples/fluid.vue
<script setup lang="ts">
import { ref } from "vue";
import { FluidSlider } from "@/components/orvui/motion/range-slider";
const brightness = ref(35);
</script>
<template><div class="w-full max-w-sm"><FluidSlider v-model="brightness" label="Brightness" aria-label="Brightness" /></div></template>
packages/vue/src/motion/range-slider/src/FluidSlider.vue
波形
wave.vue抬高手柄附近的竖条,形成随位置移动的波形。
Gain45
packages/vue/src/motion/range-slider/examples/wave.vue
<script setup lang="ts">
import { ref } from "vue";
import { WaveSlider } from "@/components/orvui/motion/range-slider";
const gain = ref(45);
</script>
<template><div class="flex w-full max-w-md flex-col gap-2"><div class="flex items-center justify-between text-sm text-muted-foreground"><span>Gain</span><span class="tabular-nums text-foreground">{{ gain }}</span></div><WaveSlider v-model="gain" aria-label="Gain" /></div></template>
packages/vue/src/motion/range-slider/src/WaveSlider.vue
气泡
bubble.vue拖动时抬起数值气泡,让其倾斜随移动变化。
Drag fast and the bubble leans
packages/vue/src/motion/range-slider/examples/bubble.vue
<script setup lang="ts">
import { ref } from "vue";
import { BubbleSlider } from "@/components/orvui/motion/range-slider";
const amount = ref(28);
</script>
<template><div class="flex w-full max-w-sm flex-col gap-1"><span class="text-sm text-muted-foreground">Drag fast and the bubble leans</span><BubbleSlider v-model="amount" aria-label="Value" /></div></template>
packages/vue/src/motion/range-slider/src/BubbleSlider.vue
标尺
ruler.vue指针固定在原位,带刻度的标尺在其下方移动。
72.5kg
404550556065707580859095100105110115120
packages/vue/src/motion/range-slider/examples/ruler.vue
<script setup lang="ts">
import { ref } from "vue";
import { RulerSlider } from "@/components/orvui/motion/range-slider";
const weight = ref(72.5);
</script>
<template><div class="w-full max-w-sm"><RulerSlider v-model="weight" :min="40" :max="120" :step=".5" :gap="12" :major-every="10" unit="kg" aria-label="Weight" /></div></template>
packages/vue/src/motion/range-slider/src/RulerSlider.vue
状态与事件
需要由表单、路由或父组件管理时,绑定下列状态并接收对应更新。v-model 是属性与 update 事件的简写;值的类型应与 API 一致。
| 组件 | Vue 绑定 | 更新事件 |
|---|---|---|
RangeSlider | v-modelnumber | update:modelValue |
InlineSlider | v-modelnumber | update:modelValue |
FluidSlider | v-modelnumber | update:modelValue |
WaveSlider | v-modelnumber | update:modelValue |
BubbleSlider | v-modelnumber | update:modelValue |
RulerSlider | v-modelnumber | update:modelValue |
可选受控属性未传入时,按组件文档的默认行为工作;不要用固定的 false 或空值代替未传入。异步请求和持久化在应用中处理,再把结果传回组件。
API 参考
内联
modelValue?number—defaultValue?number—min?number—max?number—step?number1disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string—labelstring—format?(v: number) => stringStringshowTicks?booleantrue事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommitRange Slider
modelValue?number—defaultValue?number0min?number0max?number100step?number—disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string—showTicks?booleantruename?string—事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommitFluid Slider
modelValue?number—defaultValue?number0min?number0max?number100step?number—disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string—label?string—format?(v: number) => string(v: number) => `${v}%`事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommit波形
modelValue?number—defaultValue?number0min?number0max?number100step?number—disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string—bars?number32事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommit气泡
modelValue?number—defaultValue?number0min?number0max?number100step?number—disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string—format?(v: number) => string—事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommit标尺
modelValue?number—defaultValue?number—min?number—max?number—step?number1disabled?booleanfalseariaLabel?string—formatValueText?(value: number) => string(props.unit ? (value: number) => `${value.toFixed(decimals.value)} ${props.unit}` : undefined)gap?number14majorEvery?number5unit?string—事件
update:modelValue—@update:modelValuechange—@changevalueCommit—@valueCommit无障碍
为交互控件提供明确的无障碍名称。保留文档中的键盘路径、可见焦点与减少动态效果状态;自定义插槽应继续保留所替代部件的语义。
常见问题
- 如何配置 Range Slider?
- 通过 modelValue 与 update:modelValue 控制数值;defaultValue 只初始化非受控滑块。
- 如何连接到应用状态?
- 监听 update:modelValue、change、valueCommit,将组件连接到应用状态。
- 可以在服务端渲染吗?
- 可以在 Vue SSR 应用中正常渲染。服务端与客户端的初始 props 应保持一致;浏览器测量与交互资源在挂载后启动。
更新于
来源与许可 ↗MIT · 0.1.1