こんにちは、さち です。
先日の記事で、HTML のスライダー <input type="range"> のデザインを「CSS」で変更する方法について書きました。
この時は、「バー」の色が「1色」だけでしたが、今回は上図のように「ツマミ」の前後で色を分けて「2色」にしてみます。
スライダーをデザインする
実行結果
結果
HTML
<input type="range" class="slider" min="0" max="10" step="0.5" value="2">
CSS
.slider {
-webkit-appearance: none;/* CSS適用のおまじない */
appearance: none;/* CSS適用のおまじない */
background: lightgreen;/* バーの色 */
}
(以下省略)
<input type="range"> のデザインを変える CSS については、以前の記事で詳しく書いたので省略。「バー」の色に関する部分だけを掲載しています。
background は1色だけ指定しておきます。これは、次項の「JavaScript」が動作しない場合に備えたものです。
JavaScript
/* input 要素を取得 */
let slider = document.querySelector('.slider');
/*【関数】バーの色を現在値に合わせる */
function setSeekbar(elm) {
// 値の取得
let now = parseFloat(elm.value);// 現在値
let max = parseFloat(elm.getAttribute('max'));// 最大値
let min = parseFloat(elm.getAttribute('min'));// 最小値
// 現在値がバーではどの位置[%]なのかを計算
let percent = (now - min) / (max - min) * 100;
// 算出した位置[%]を linear-gradient に適用
elm.style.background = `linear-gradient(to right, steelblue ${percent}%, lightgreen ${percent}%)`;
}
/* 初期値に合わせてバーの色を変える */
setSeekbar(slider);
/*【イベント】現在値が変わったらバーの色を変える */
slider.addEventListener('input', function() {
setSeekbar(this);
});
バーを「2色」にするために、バーの背景色に linear-gradient() を使っています。
「関数」では <input> の現在値を取得して「ツマミ」の位置[%]を計算し、これを linear-gradient() の色が変わる位置として使用。これで、「ツマミ」の前後で「バー」の色が変わります。
また、slider.addEventListener('input', ~) によって、<input> の現在値に変更があるとイベントが発火。「関数」を実行します。
【おまけ】 スライダーをまとめて設定
実行結果
結果
HTML
<input type="range" class="slider" min="0" max="10" step="0.5" value="2"> <input type="range" class="slider" min="5" max="20" step="5" value="15"> <input type="range" class="slider" min="-5" max="5" step="1" value="-1">
min max などをいろいろな値にしてあります。
CSS
.slider {
-webkit-appearance: none;/* CSS適用のおまじない */
appearance: none;/* CSS適用のおまじない */
background: lightgreen;/* バーの色 */
}
(以下省略)
JavaScript
/* input 要素をすべて取得 */
let sliders = document.querySelectorAll('.slider');
/*【関数】バーの色を現在値に合わせる */
function setSeekbar(elm) {
// 値の取得
let now = parseFloat(elm.value);// 現在値
let max = parseFloat(elm.getAttribute('max'));// 最大値
let min = parseFloat(elm.getAttribute('min'));// 最小値
// 現在値がバーではどの位置[%]なのかを計算
let percent = (now - min) / (max - min) * 100;
// 算出した位置[%]を linear-gradient に適用
elm.style.background = `linear-gradient(to right, steelblue ${percent}%, lightgreen ${percent}%)`;
}
/* バーの色を設定 */
sliders.forEach((inp)=> {
// 初期値に合わせてバーの色を変える
setSeekbar(inp);
//【イベント】現在値が変わったらバーの色を変える
inp.addEventListener('input', function() {
setSeekbar(this);
});
});
関連記事

【CSS】 スライダー「input type="range"」のデザインを変更する
こんにちは、さち です。今回は、HTML のスライダー <input type="range"> のデザインを「CSS」で変更する方法について書いていきます。CSS の書き方が少し特殊なので、備忘録です。


コメント