UIXHERO

Slider(スライダー)

連続した数値の範囲を直感的に選択させるコンポーネント。正確な値入力より「だいたいこの辺」という曖昧さを許容する場面でのみ使う。

2026年2月28日
更新: 2026年8月28日
19
by Dengen Yosho(DGYS)

連続する数値範囲をドラッグ操作で選択させるコンポーネント。「正確に127を入力したい」場面ではなく、「音量をだいたい70%くらいに」「価格帯を1万〜5万円で」という曖昧さを許容する範囲選択のために存在する。

この記事を読むと、SliderとNumber Input・Selectの使い分け、Range Sliderの設計、キーボード操作とARIA属性の実装基準が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

数値の連続した範囲を水平(または垂直)のトラック上でドラッグして選択するコンポーネント。単一値の選択(Single Slider)と最小・最大値の範囲選択(Range Slider)の2種類がある。

Number Inputとの違い:Number Inputは正確な数値を入力する場面に使う。Sliderは「だいたいこの辺」という曖昧な選択を許容する場面——音量・明るさ・価格帯フィルタなど——に使う。

Selectとの違い:Selectは離散した選択肢から1つを選ぶ。Sliderは連続した数値範囲を選ぶ。「S/M/L/XL」のサイズ選択はSelect、「1〜100%の音量」はSlider。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • 音量・明るさ・再生位置など、だいたいの値で良い連続量の調整
  • 価格帯・評価スコアなど、範囲でフィルタリングする場面
  • 正確な数値より「感覚的な調整」の方がユーザーにとって自然な入力

3.2 When NOT to use

  • 正確な数値が必要な入力(金額・数量・コード値など)→ Number Input を使う
  • 離散した選択肢が少数(S/M/L など)→ Select / Radio を使う
  • タッチデバイスで正確な操作が困難な小さなスライダー → Number Input やステッパーに切り替える

3.3 代替UI(Alternatives)

  • 正確な数値入力 → Number Input<input type="number">
  • 少数の離散選択肢 → Select / Radio Button
  • スライダー+精密入力の組み合わせ → Slider + Number Input の併置(両方向に同期)

4. 設計判断の核(Decision Principles)

「正確な値が必要か、だいたいで良いか」——これだけで Slider か Number Input かが決まる。

判断の優先順位:① 精度要求 → ② 範囲の広さ → ③ 現在値の表示 → ④ キーボード操作性

  • Slider を使う場合は常に現在値を数値で表示する(「だいたい70%」ではなく「70%」と明示)
  • Range Slider(最小・最大の2ハンドル)は、2つのハンドルが交差しないロジックを実装する
  • step を設定して「5刻み」「1000円刻み」など意味のある単位で動くようにする
  • Slider 単体で精度が不足する場合は、横に Number Input を並置して双方向同期させる

5. 状態設計(States)

5.1 必須状態(Required)

  • Default:トラックとハンドル(サム)が視覚的に明確。現在値を表示
  • Focus:ハンドルにフォーカスリングを表示(省略不可)
  • Disabled:トラックとハンドルをグレーに、cursor-not-allowed

5.2 条件付き状態(Conditional)

  • Hover:ハンドルにシャドウ or サイズ変化でクリッカブルを強調
  • Active(ドラッグ中):ハンドルのサイズを大きくしてドラッグ中の視覚的
  • Error:範囲外の値が入力された場合(Range Sliderで最小 > 最大など)にトラックを赤に
状態必須何を伝えるか
Default現在の値と操作可能な範囲
Focusキーボードユーザーに今ハンドルにフォーカスがあることを示す
Disabled現在この値は変更できないこと
Hoverこのハンドルをドラッグできることを強調する
Activeドラッグ操作中であることを示す

6. バリエーション設計(Variants)

Sliderのバリアントは主に「ハンドルの数」と「目盛り・ラベルの有無」で決まる。

バリアント目的
Single Slider1つの値を選択(音量・明るさ・再生位置)
Range Slider最小〜最大の範囲を選択(価格帯・期間フィルタ)
With Ticks目盛り付き。離散的なステップを示す(0, 25, 50, 75, 100)
With InputSliderの横にNumber Inputを並置し、精密入力も可能にする

禁止パターン:Range Sliderで最小ハンドルと最大ハンドルが交差できる設計 → 「最小が最大を超える」という矛盾状態が発生する。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • 現在値の非表示:Sliderだけ置いて数値を表示しない → 「今何に設定したか」が分からない
  • 精度要求場面での使用:金額や数量の正確な入力にSliderを使う → 1円単位の操作が事実上不可能になる
  • aria-valuetext の欠落aria-valuenow="70" だけでは単位が分からず、スクリーンリーダーが「70」としか読まない

7.1 Bad(典型3つ)

  • 音量スライダーに現在値表示がなく「今何%か」が分からない
  • 価格フィルタをSliderで実装したが step が設定されておらず1円単位で動いてしまう
  • <input type="range"> のみでAR属性なし → スクリーンリーダーが値の意味を読み上げられない

7.2 Good(対になる3つ)

  • スライダーの右上(または下)に現在値を常時表示し、ドラッグに合わせてリアルタイム更新する
  • step={1000} を設定し「1,000円刻み」で動くようにする。目盛りで刻みをする
  • aria-label="音量" + aria-valuenow={70} + aria-valuetext="70パーセント" を組み合わせる

7.3 How to fix(手順)

  1. Sliderの近くに現在値を数値で常時表示する(ツールチップか固定テキスト)
  2. step 属性で意味のある刻み幅を設定する
  3. role="slider" + aria-valuemin + aria-valuemax + aria-valuenow + aria-valuetext を全て付与する
  4. キーボード操作(/ で1ステップ、Home/End で最小・最大)が動作することを確認する

7.4 GUNJO 実装で見る(Bad / Good)

同じ GUNJO の Slider を、ラベル/値表示の崩れた使い方と正しい使い方で


8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Keyboard

  • Tab でハンドルにフォーカスでき、/ で値を減らし / で値を増やせること
  • Home で最小値、End で最大値に移動できること
  • Page Up / Page Down で大きなステップの移動(任意)

Focus

  • ハンドルのフォーカスリングは周囲と4.5:1以上のコントラストを持つこと

Screen Reader

  • role="slider"aria-valuemin / aria-valuemax / aria-valuenow を付与する
  • aria-valuetext で単位付きの読み上げテキストを設定する
<!-- 基本パターン -->
<div
  role="slider"
  tabindex="0"
  aria-label="音量"
  aria-valuemin="0"
  aria-valuemax="100"
  aria-valuenow="70"
  aria-valuetext="70パーセント"
>
  <!-- ハンドルのDOM -->
</div>

Touch / Pointer

  • ハンドルの視覚的サイズが小さい場合でも、を44×44px以上確保する
  • トラック全体をタップして値をジャンプできるようにする

Contrast / Readability

  • トラックとは3:1以上のコントラスト比(WCAG 1.4.11 Non-text Contrast)
  • ハンドルはトラックに対して視認しやすいコントラストを持つこと

10. 実装メモ(Implementation Notes)

  • <input type="range"> はブラウザのデフォルトスタイルを使えば多くのARIA属性を自動で持つが、見た目のカスタマイズが難しい。Radix / shadcn の Slider は ARIA 対応済みかつスタイルカスタマイズが容易
  • Range Slider(2ハンドル)はHTML<input type="range"> では実装できないため、ライブラリか自前実装が必要
  • step 属性はHTML属性として設定できるが、React では step={1000} のようにプロップスで渡す。onChange の値は文字列で返るため Number() で変換すること

11. 関連リンク


12. まとめ

Sliderの設計は「正確な値が必要か、だいたいで良いか」という一問から始まります。迷ったら 4. 設計判断の核 に戻り、精度要求を確認してください。Sliderを使うなら現在値の常時表示と aria-valuetext による単位付き読み上げが最低ラインです。精度が必要な場面はNumber Inputへの切り替え、または Slider + Number Input の併置で解決してください。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年8月28日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る