表单

Slider 范围滑杆

用于范围滑杆场景的 MoriUI 组件。

资源

导入

import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

组合方式

Slider 组合 Track、Range 与一个或多个 Thumb;Thumb 数量应与 v-model 数组长度一致。

范围与多控制点

两个值表示范围,更多值创建多个控制点;minStepsBetweenThumbs 可约束相邻值间距。

垂直方向

orientation="vertical" 切换布局与上下方向键,控件仍使用同一 Track/Range/Thumb 组合。

受控与禁用

v-model 实时同步 number[];valueCommit 只在一次拖动或键盘操作结束后触发,disabled 阻止交互。

RTL

水平 Slider 的方向键与值增长方向遵循 dir,垂直方向不受文字流影响。

示例

概览

单控制点选择 0 到 100 的值。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const value = shallowRef([75])
</script>

<template>
  <Slider
    v-model="value"
    :max="100"
    :step="1"
    aria-label="音量"
    class="mx-auto w-full max-w-xs"
  >
    <SliderTrack><SliderRange /></SliderTrack><SliderThumb />
  </Slider>
</template>

范围

两个 Thumb 选择起点与终点。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const range = shallowRef([25, 50])
</script>

<template>
  <Slider
    v-model="range"
    :max="100"
    :step="5"
    class="mx-auto w-full max-w-xs"
  >
    <SliderTrack><SliderRange /></SliderTrack>
    <SliderThumb aria-label="范围起点" /><SliderThumb aria-label="范围终点" />
  </Slider>
</template>

多个控制点

三个值创建三个可独立操作的 Thumb。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const values = shallowRef([10, 20, 70])
</script>

<template>
  <Slider
    v-model="values"
    :max="100"
    :step="10"
    class="mx-auto w-full max-w-xs"
  >
    <SliderTrack><SliderRange /></SliderTrack>
    <SliderThumb v-for="(_, index) in values" :key="index" :aria-label="`控制点 ${index + 1}`" />
  </Slider>
</template>

垂直

两条垂直 Slider 使用上下方向键。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const primary = shallowRef([50])
  const secondary = shallowRef([25])
</script>

<template>
  <div class="mx-auto flex w-full max-w-xs items-center justify-center gap-6">
    <Slider
      v-model="primary"
      :max="100"
      :step="1"
      orientation="vertical"
      aria-label="主通道"
      class="h-40"
    >
      <SliderTrack><SliderRange /></SliderTrack><SliderThumb />
    </Slider>
    <Slider
      v-model="secondary"
      :max="100"
      :step="1"
      orientation="vertical"
      aria-label="辅助通道"
      class="h-40"
    >
      <SliderTrack><SliderRange /></SliderTrack><SliderThumb />
    </Slider>
  </div>
</template>

受控

v-model 实时显示两个温度边界。

0.3,0.7
<script setup lang="ts">
  import { shallowRef } from 'vue'
  import {
    Field,
    FieldLabel,
    Slider,
    SliderRange,
    SliderThumb,
    SliderTrack
  } from 'moriui'

  const temperature = shallowRef([0.3, 0.7])
</script>

<template>
  <Field class="mx-auto w-full max-w-xs">
    <div class="flex items-center justify-between gap-2">
      <FieldLabel>温度范围</FieldLabel>
      <span class="text-muted-foreground text-sm">{{ temperature.join(',') }}</span>
    </div>
    <Slider
      v-model="temperature"
      :min="0"
      :max="1"
      :step="0.1"
    >
      <SliderTrack><SliderRange /></SliderTrack>
      <SliderThumb aria-label="最低温度" /><SliderThumb aria-label="最高温度" />
    </Slider>
  </Field>
</template>

禁用

disabled 保留当前值并阻止操作。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const value = shallowRef([50])
</script>

<template>
  <Slider
    v-model="value"
    :max="100"
    :step="1"
    aria-label="禁用的音量"
    class="mx-auto w-full max-w-xs"
    disabled
  >
    <SliderTrack><SliderRange /></SliderTrack><SliderThumb />
  </Slider>
</template>

RTL

水平滑杆在 RTL 方向中调整值。

<script setup lang="ts">
  import { shallowRef } from 'vue'
  import { Slider, SliderRange, SliderThumb, SliderTrack } from 'moriui'

  const value = shallowRef([75])
</script>

<template>
  <Slider
    v-model="value"
    :max="100"
    :step="1"
    aria-label="مستوى الصوت"
    class="mx-auto w-full max-w-xs"
    dir="rtl"
  >
    <SliderTrack><SliderRange /></SliderTrack><SliderThumb />
  </Slider>
</template>

API

属性 类型 默认值 说明
Slider v-modelnumber[] | null[0]按 Thumb 顺序排列的当前值。
Slider defaultValuenumber[][0]非受控初始值,同时决定初始 Thumb 数量。
Slider min / max / stepnumber0 / 100 / 1数值范围与步进。
Slider orientation'horizontal' | 'vertical''horizontal'布局与键盘导航方向。
Slider disabled / invertedbooleanfalse禁用交互与反转视觉值方向。
Slider minStepsBetweenThumbsnumber0相邻 Thumb 之间允许的最小步数。
Slider thumbAlignment'contain' | 'overflow''contain'Thumb 在轨道边界内的对齐方式。
Slider @valueCommit(value: number[]) => void一次值修改交互结束时触发。

无障碍说明

Slider 复用 Reka UI 的 slider ARIA、Home/End、Page Up/Page Down、方向键和隐藏表单输入。每个 Thumb 都应通过 aria-label 或关联标签获得名称;范围 Slider 需分别说明起点和终点。

关联组件

这个组件暂时没有登记关联条目。