Slider
<script setup lang="ts">
import { ref } from 'vue'
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
const sliderValue = ref([50])
</script>
<template>
<SliderRoot
v-model="sliderValue"
class="relative flex items-center select-none touch-none w-[200px] h-5"
:max="100"
:step="1"
>
<SliderTrack class="bg-blackA10 relative grow rounded-full h-[3px]">
<SliderRange class="absolute bg-white rounded-full h-full" />
</SliderTrack>
<SliderThumb
class="block w-5 h-5 bg-white shadow-[0_2px_10px] shadow-blackA7 rounded-[10px] hover:bg-violet3 focus:outline-none focus:shadow-[0_0_0_5px] focus:shadow-blackA8"
aria-label="Volume"
/>
</SliderRoot>
</template>
機能
- 制御または非制御にすることができます。
- 複数のサムをサポートします。
- サム間に最小値をサポートします。
インストール
コマンドラインからコンポーネントをインストールします。
$ npm add radix-vue
アナトミー
すべてのパーツをインポートして、組み合わせてください。
<script setup>
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
</script>
<template>
<SliderRoot>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</SliderRoot>
</template>
API リファレンス
ルート
スライダーのすべてのパーツが含まれます。form
内で使用される場合、各サム用の input
をレンダリングし、イベントが正しく伝播されるようにします。
プロパティ | 既定値 | タイプ |
---|---|---|
as | 'div' | AsTag | Component このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | boolean 子として渡されたデフォルトのレンダリングされた要素を変更し、それらのプロパティと動作をマージします。 Composition ガイドの詳細については、こちらを参照してください。 | |
defaultValue | [0] | number[] 最初にレンダリングされたときの、スライダーの値。スライダーの状態を制御する必要がない場合に使用します。 |
dir | 'ltr' | 'rtl' 適用可能な場合、コンボボックスの読み取り方向。 | |
disabled | false | boolean
|
inverted | false | boolean スライダーが視覚的に反転されているかどうか。 |
max | 100 | number 範囲の最大値。 |
min | 0 | number 範囲の最小値。 |
minStepsBetweenThumbs | 0 | number 複数のサムの間で許可される最小のステップ。 |
modelValue | number[] スライダーの制御値。 | |
name | string | |
orientation | 'horizontal' | 'vertical' | 'horizontal' スライダーの向き。 |
step | 1 | number ステップ間隔。 |
Emit | ペイロード |
---|---|
update:modelValue | [payload: number[]] スライダーの値が変更されたときに呼び出されるイベントハンドラー |
valueCommit | [payload: number[]] 値が操作の最後に変更されたときに呼び出されるイベントハンドラー。 バックエンドサービスを更新するなど、最終値のみをキャプチャする必要がある場合に役立ちます。 |
スロット(デフォルト) | ペイロード |
---|---|
modelValue | number[] 現在のスライダーの値 |
データ属性 | 値 |
---|---|
[data-disabled] | 無効になっている場合に表示されます。 |
[data-orientation] | "vertical" | "horizontal" |
トラック
SliderRange
を含むトラック。
プロパティ | 既定値 | タイプ |
---|---|---|
as | 'span' | AsTag | Component このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | boolean 子として渡されたデフォルトのレンダリングされた要素を変更し、それらのプロパティと動作をマージします。 Composition ガイドの詳細については、こちらを参照してください。 |
データ属性 | 値 |
---|---|
[data-disabled] | 無効になっている場合に表示されます。 |
[data-orientation] | "vertical" | "horizontal" |
範囲
範囲の部分。SliderTrack
内に存在する必要があります。
プロパティ | 既定値 | タイプ |
---|---|---|
as | 'span' | AsTag | Component このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | boolean 子として渡されたデフォルトのレンダリングされた要素を変更し、それらのプロパティと動作をマージします。 Composition ガイドの詳細については、こちらを参照してください。 |
データ属性 | 値 |
---|---|
[data-disabled] | 無効になっている場合に表示されます。 |
[data-orientation] | "vertical" | "horizontal" |
サム
ドラッグ可能なサムです。複数のサムをレンダリングできます。
プロパティ | 既定値 | タイプ |
---|---|---|
as | 'div' | AsTag | Component このコンポーネントがレンダリングする要素またはコンポーネント。 |
asChild | boolean 子として渡されたデフォルトのレンダリングされた要素を変更し、それらのプロパティと動作をマージします。 Composition ガイドの詳細については、こちらを参照してください。 |
データ属性 | 値 |
---|---|
[data-disabled] | 無効になっている場合に表示されます。 |
[data-orientation] | "vertical" | "horizontal" |
例
垂直方向
orientation
プロパティを使用して、垂直スライダーを作成します。
// index.vue
<script setup>
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
</script>
<template>
<SliderRoot
class="SliderRoot"
:default-value="[50]"
orientation="vertical"
>
<SliderTrack class="SliderTrack">
<SliderRange class="SliderRange" />
</SliderTrack>
<SliderThumb class="SliderThumb" />
</SliderRoot>
</template>
/* styles.css */
.SliderRoot {
position: relative;
display: flex;
align-items: center;
}
.SliderRoot[data-orientation="vertical"] {
flex-direction: column;
width: 20px;
height: 100px;
}
.SliderTrack {
position: relative;
flex-grow: 1;
background-color: grey;
}
.SliderTrack[data-orientation="vertical"] {
width: 3px;
}
.SliderRange {
position: absolute;
background-color: black;
}
.SliderRange[data-orientation="vertical"] {
width: 100%;
}
.SliderThumb {
display: block;
width: 20px;
height: 20px;
background-color: black;
}
範囲を作成する
複数のサムと値を追加して、範囲スライダーを作成します。
// index.vue
<script setup>
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
</script>
<template>
<SliderRoot :default-value="[25, 75]">
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
<SliderThumb />
</SliderRoot>
</template>
ステップサイズを定義する
step
プロパティを使用して、ステップ間隔を増やします。
// index.vue
<script setup>
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
</script>
<template>
<SliderRoot
:default-value="[50]"
:step="10"
>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
</SliderRoot>
</template>
サムのオーバーラップを防ぐ
minStepsBetweenThumbs
を使用して、値が同じサムを避けます。
// index.vue
<script setup>
import { SliderRange, SliderRoot, SliderThumb, SliderTrack } from 'radix-vue'
</script>
<template>
<SliderRoot
:default-value="[25, 75]"
:step="10"
:min-steps-between-thumbs="1"
>
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb />
<SliderThumb />
</SliderRoot>
</template>
アクセシビリティ
キーボードインタラクション
キー | 説明 |
---|---|
右矢印 | orientation に応じて、step 値を加算/減算します。 |
左矢印 | orientation に応じて、step 値を加算/減算します。 |
上矢印 | 値を step 量だけ増やします。 |
下矢印 | 値を step 量だけ減らします。 |
ページアップ | 値を大きな step だけ増やします。 |
ページダウン | 値を大きな step だけ減らします。 |
シフト + 上矢印 | 値を大きな step だけ増やします。 |
シフト + 下矢印 | 値を大きな step だけ減らします。 |
ホーム | 値を最小値に設定します。 |
エンド | 値を最大値に設定します。 |
カスタムAPI
プリミティブパーツを独自のコンポーネントに抽象化して、独自APIを作成します。
すべてのパーツを抽象化
この例では、Slider
パーツをすべて抽象化して、自己完結型の要素として使用できるようにします。
使用法
<script setup lang="ts">
import { Slider } from './your-slider'
</script>
<template>
<Slider :default-value="[25]" />
</template>
実装
// your-slider.ts
export { default as Slider } from 'Slider.vue'
<!-- Slider.vue -->
<script setup lang="ts">
import { SlideRoot, SliderRange, type SliderRootEmits, type SliderRootProps, SliderThumb, SliderTrack, useForwardPropsEmits } from 'radix-vue'
const props = defineProps<SliderRootProps>()
const emits = defineEmits<SliderRootEmits>()
const forward = useForwardPropsEmits(props, emits)
</script>
<template>
<SliderRoot v-bind="forward">
<SliderTrack>
<SliderRange />
</SliderTrack>
<SliderThumb
v-for="(_, i) in value"
:key="i"
/>
</SliderRoot>
</template>
注意点
マウスイベントが発生しない
制約が実装中に発生するため、次の例は期待どおりに動作せず、@mousedown
および@mousedown
イベントハンドラーは発生しません
<SliderRoot
@mousedown="() => { console.log('onMouseDown') }"
@mouseup="() => { console.log('onMouseUp') }"
>
…
</SliderRoot>
代わりにポインターイベント(例:@pointerdown
、@pointerup
)の使用をお勧めします。上記の制約に関係なく、これらのイベントはすべてのポインター入力タイプ(マウス、タッチ、ペンなど)で発生するため、クロスプラットフォーム/デバイスの処理にもっと適しています。