1. ホーム
  2. HTML

【HTML】input type=”range” でスライダーを作る方法|min・max・step と値の取得を解説

Share

音量や明るさの調整で見かける「つまみを左右にドラッグして数値を決めるバー」は、<input type="range"> で作れるスライダーです。数値を直接入力させるより直感的に操作でき、決まった範囲の中から値を選ばせたいときに向いています。この記事では、範囲を決める minmax、刻み幅の step、初期値の value といった基本属性から、JavaScript で現在値を取得して画面に表示する方法、よくあるつまずきまで、初心者の方にも分かるように解説します。

range スライダーの基本

スライダーは input 要素の typerange を指定するだけで作れます。何も属性を付けないと、0 から 100 の範囲で、つまみは中央(50)から始まります。

index.html
<!-- 既定では min=0 max=100 step=1 -->
<input type="range" name="volume">

下の例は、音量を 0〜100 で選ぶスライダーです。つまみを動かすと、その値がリアルタイムで上の表示に反映されます(値の表示には後述の JavaScript を使っています)。CSS や属性を書き換えて、動きを確かめてみてください。

<label for="volume">音量: <output id="out">50</output></label>
<input type="range" id="volume" name="volume" min="0" max="100" value="50" step="1">
label {
  display: block;
  margin-bottom: 8px;
  font-family: sans-serif;
  font-size: 15px;
}
output {
  font-weight: bold;
  color: #2196f3;
}
input[type="range"] {
  width: 100%;
  max-width: 320px;
}
const slider = document.getElementById("volume");
const out = document.getElementById("out");

// スライダーを動かすたびに現在値を表示する
slider.addEventListener("input", () => {
  out.textContent = slider.value;
});
Preview

min・max・step・value で範囲と刻みを決める

スライダーの挙動は、4つの属性で調整します。扱いたい数値の範囲や、どれくらい細かく動かせるかを指定できます。

属性意味既定値
min選べる最小値(つまみが左端のとき)0
max選べる最大値(つまみが右端のとき)100
step1回に動かせる刻み幅1
value最初のつまみの位置(初期値)min と max の中間
index.html
<!-- 1.0〜5.0 を 0.5 刻みで、初期値 3.0 -->
<input type="range" name="rating"
       min="1" max="5" step="0.5" value="3">

step は整数だけでなく 0.5 のような小数も指定できます。step="0.5" なら、つまみは 1.01.52.0…と動きます。step="any" にすると刻みの制限がなくなり、連続的な値を選べるようになります。価格帯や評価のように「区切りのよい数値だけ選ばせたい」ときは step を、なめらかに調整させたいときは any を使うとよいでしょう。

JavaScript で現在値を取得して表示する

スライダーは、つまみを動かしている最中は数値が画面に出ません。そのため、現在いくつなのかを別の場所に表示するのが一般的です。値は input 要素の value プロパティで取得でき、操作のたびに発生する input イベントで更新します。

main.js
const slider = document.getElementById("volume");
const out = document.getElementById("out");

// つまみを動かすたびに値を表示に反映する
slider.addEventListener("input", () => {
  out.textContent = slider.value; // 値は常に文字列
});

ポイントは2つです。1つは、ドラッグ中も連続して反応させたいので change ではなく input イベントを使うこと。change は操作が終わった瞬間にしか発火しないため、つまみの動きに合わせた表示にはなりません。もう1つは、slider.value文字列で返ることです。計算に使うときは Number(slider.value) などで数値に変換してください。表示に output 要素を使うと、「計算結果や入力値を表す」という意味づけにもなり、おすすめです。

label と結び付けてアクセシブルにする

スライダーが「何の値」を調整するものかを伝えるため、label と結び付けます。for 属性と inputid を一致させるのが基本です。数値の範囲が見た目だけでは伝わりにくいときは、minmax の値をラベルやその近くに添えておくと親切です。

index.html
<label for="bright">明るさ</label>
<input type="range" id="bright" name="bright"
       min="0" max="100" value="80">

思いどおりに動かないとき

つまみが端から動かせないとき

valueminmax の範囲外の値を指定すると、ブラウザが自動的に範囲内へ補正します。また step と合わない初期値(例: step="10" なのに value="5")を与えると、最も近い有効な値に丸められます。意図した初期位置にならないときは、value が範囲内かつ step の刻みに合っているかを確認してください。

値が更新されないとき

表示が変わらないときは、change イベントを使っていないか確認しましょう。ドラッグ中の変化を拾うには input イベントが必要です。また、取得先の要素を getElementById で正しく取得できているか、id のつづりも見直してください。

計算結果がおかしいとき

slider.value は文字列なので、そのまま + で足すと文字列の連結になってしまいます("50" + 10"5010" になるなど)。数値として計算するときは Number()parseInt() で変換してから使ってください。

まとめ

<input type="range"> は、範囲のある数値を直感的に選ばせるのに便利な入力部品です。要点を整理します。

  • minmax で範囲、step で刻み幅、value で初期値を決める。
  • step="any" で連続的な値も選べる。
  • 現在値は value プロパティで取得し、input イベントで更新する。
  • value は文字列なので、計算時は Number() で数値に変換する。
  • label(と必要なら output)を組み合わせて、何の値か・今いくつかを伝える。

まずは minmaxvalue を指定したスライダーを置き、input イベントで値を表示するところから始めると、仕組みがつかめます。

参考ページ