Slider
ドラッグ、トラックのタップ、キー操作で値や範囲を選びます。ジャンプは滑らかに動き、値のバブルは任意で表示できます。
pnpm dlx shadcn@latest add https://hextaui.com/r/slider.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react class-variance-authority cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/slider.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
<Slider /> は値ごとにつまみを1つ描画するため、数値または1要素の配列なら単一のスライダー、2要素なら範囲指定になります。<SliderLabel /> や <SliderValue /> などの子要素は、トラックの上の1行に並びます。
ドラッグ中、つまみはポインターにぴったり追従します。トラックの押下、キー、制御された新しい値によって値がジャンプするときは、つまみと塗りは瞬間移動せず、180msで滑らかに移動します。
サイズ
sm、default、lg は、つまみとトラックをまとめて拡大縮小します。
範囲
範囲指定には2つの値を渡します。各つまみには getAriaLabel で名前を付け、minStepsBetweenValues で間隔を保ちます。draggableRange を指定すると、つまみの間のどこをドラッグしても両方が同時に動き、そこをタップした場合は最も近いつまみが動きます。
値のバブル
showValue は、ドラッグ中またはキーボードでフォーカスされている間、つまみの上にフォーマットした値を表示します。バブルはトラックの上の空間にせり上がるので、ラベルの行の代わりに使います。
ステップとフォーマット
step は値をスナップさせ、largeStep は Page Up と Shift + 矢印のジャンプ量を設定し、format はスライダーが表示または読み上げるすべての数値をフォーマットします。
制御
onValueChange は動くたびに、onValueCommitted は離したときに一度だけ発火します。保存するのはこのタイミングです。外部から値を設定した場合も滑らかに動きます。
垂直
orientation="vertical" では、スライダーは親の高さを満たし、Up で値が増えます。
アイコンつき
flex の行でスライダーの横にアイコンを置きます。スライダーが残りの幅を占めます。
無効
スライダー全体が薄くなり、ポインターとキーボードの入力を無視します。
長いラベル
長いラベルは折り返され、値は末尾に残ります。
右から左
右から左の親の内側では、塗りが右から始まり、矢印キーもそれに従います。読み手の数字で表示するには locale を渡します。
| キー | アクション |
|---|---|
| Tab | 次のつまみにフォーカスを移します。 |
| →↑ | 値を1ステップ増やします。右から左では → で減ります。 |
| ←↓ | 値を1ステップ減らします。右から左では ← で増えます。 |
| Shift + ArrowPage UpPage Down | largeStep の分だけ動きます。 |
| Home | 最小値を設定します。範囲指定では前のつまみの値を設定します。 |
| End | 最大値を設定します。範囲指定では次のつまみの値を設定します。 |
- 各つまみはネイティブの
input type="range"を持つため、それぞれ独自の値、min、max を持つsliderです。 <SliderLabel />はすべてのつまみに名前を付けます。ない場合でも、<Slider />のaria-labelはラッパーではなくつまみに渡されるため、スライダーが名前なしで残ることはありません。範囲指定ではgetAriaLabelでつまみを区別します。<SliderValue />と値のバブルは、変化のたびには読み上げられません。つまみがすでに値を伝えるためです。- つまみを押してもフォーカスリングは表示されませんが、矢印キーでは表示されます。視差効果の軽減が有効な場合、つまみは滑らかに動かずジャンプします。
- タッチスクリーンでは、レイアウトを変えずにヒット領域が最低44pxまで広がります。
Base UI の slider 上に構築されています。すべてのパーツは、ラップしているプリミティブの props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value制御される値。1項目につきつまみ1つ。 | number | number[] | – |
defaultValue | number | number[] | – |
onValueChangeドラッグ中、変化のたびに発火します。 | (value, eventDetails) => void | – |
onValueCommitted変化が終わったときに一度だけ発火します。 | (value, eventDetails) => void | – |
min | number | 0 |
max | number | 100 |
step | number | 1 |
largeStep | number | 10 |
minStepsBetweenValues | number | 0 |
size | "sm" | "default" | "lg" | "default" |
orientation | "horizontal" | "vertical" | "horizontal" |
draggableRange範囲指定では、つまみの間をドラッグすると、間隔を保ったまま両方が一緒に動きます。 | boolean | false |
showValueドラッグ中またはキーボードフォーカス中に、つまみの上に値を表示します。 | boolean | false |
thumbAlignmentedge は、min と max でつまみをトラックの内側に収めます。 | "edge" | "center" | "edge-client-only" | "edge" |
thumbCollisionBehavior | "push" | "swap" | "none" | "push" |
format | Intl.NumberFormatOptions | – |
locale | Intl.LocalesArgument | "en-US" |
aria-labelつまみに名前を付けます。 | string | – |
getAriaLabel範囲指定の各つまみに名前を付けます。 | (index: number) => string | – |
getAriaValueText | (formattedValue: string, value: number, index: number) => string | – |
name | string | – |
disabled | boolean | false |
className | string | (state) => string | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="slider" | ルート。 |
data-size | sm、default、lg。 |
data-jump | つまみが新しい値へ滑らかに動く220msの間付きます。 |
data-range-dragging | 範囲全体をドラッグしている間付きます。 |
data-orientation | horizontal または vertical。 |
data-dragging | ポインターが押されている間付きます。 |
data-disabled | 無効のときに存在します。 |
data-invalid | Field の内側で無効(invalid)なときに付きます。 |
--slider-thumb | つまみの直径。size によって設定されます。 |
--slider-track | トラックの太さ。size によって設定されます。 |
data-slot="slider-control" | トラックの周りの押せる領域。 |
data-slot="slider-track" | トラック。 |
data-slot="slider-range" | 開始位置、または最初のつまみから、最後のつまみまでの塗り。 |
data-slot="slider-thumb" | 各つまみ。data-index がその位置を示します。 |
data-active | フォーカスされている、またはドラッグ中のつまみに付きます。 |
data-slot="slider-thumb-value" | showValue による値のバブル。 |
つまみに名前を付け、行を埋めるまで広がります。<div> を描画します。
| プロパティ | 型 | デフォルト |
|---|---|---|
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="slider-label" | ラベル。 |
フォーマットした値を表示します。範囲指定ではエンダッシュでつなぎます。<output> を描画します。
| プロパティ | 型 | デフォルト |
|---|---|---|
childrenカスタムテキスト。 | (formattedValues: string[], values: number[]) => ReactNode | – |
render | ReactElement | (props, state) => ReactElement | <output> |
| 属性 | 説明 |
|---|---|
data-slot="slider-value" | 値。 |
data-orientation | horizontal または vertical。 |
data-dragging | ポインターが押されている間付きます。 |
data-disabled | 無効のときに存在します。 |
data-invalid | Field の内側で無効(invalid)なときに付きます。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。
使用しているブロック
Slider の上に構築されるブロック。
- AppearanceAIプロダクトの設定にある外観セクションです。テーマ、アクセント、背景の色合い、密度、チャットのフォント、文字サイズ、アクセシビリティのオプションを、保存するまで下書きとして保持します。
- BillingCursor、Claude、Vercelのスタイルによる、AIプロダクト向けのプランと使用量です。モデルごとに分かれ、サイクル終了時を予測してクレジット切れの前に警告する使用量メーター、ドラッグで確認できる日別チャート、メーター上でプレビューできるアラートつきの支出上限、正確な日割り計算によるプラン変更、実際のバリデーションを備えたカードフォーム、PDFでダウンロードできる請求書を備えています。
- ProfileAIプロダクトの設定にあるプロフィールセクションです。写真を円形に切り抜き、入力しながら確認されるユーザー名を選び、6桁のコードで新しいメールアドレスを確認し、サイトを認識するリンクを追加し、他の人からどう見えるかをライブのカードで確認できます。
- SettingsCursorやClaudeのように構成した、AIプロダクト向けの設定です。検索、グループ、外部リンクを備えた塗りつぶしのサイドバー、控えめなピッカーと入れ子のオプションを持つ行のカード、変更があったときだけ浮かび上がる暗い保存アイランド、⌘Sでの保存、チェックやサーバーからのフィールドエラー、コンテンツの形に合わせた読み込み状態を備えています。