【CSS】input type="range" の見栄えを、異なるブラウザ間で統一する。

input type="range" で表示できるスライダー形式の HTML 部品。

個人的にはなかなか使い勝手の良い奴ではないか、と思うのですが、ブラウザによって外観がかなり異なるのだな。例えば Firefox だと以下のような感じ。

input_range_firefox.png

そして Chrome などの Blink / WebKit なブラウザでは以下のような具合。

input_range_chrome.png

スタイルシートを使って、ブラウザ間で同じ見栄えになるようにしてみる。ひとまず、以下のような外観にしてみましょ。

range_xbrowser.png

ベースとするスタイルシートは、こちらのページ(Styling Cross-Browser Compatible Range Inputs with CSS | CSS-Tricks)で紹介されているもの。かなり良くできた CSS なのですが、記事の公開時期がちょっと古くて、これをそのまま適用すると Microsoft Edge で部品の位置がズレてしまったりするのだな。

その点を修正しつつ、適宜コメントをいれてみた CSS が以下。

input[type=range] {
  -webkit-appearance: none;
  margin: 0;
  width: 100%;
}
input[type=range]:focus {
  outline: none;
}

/* WebKit・Blink向け 溝のスタイル */
input[type=range]::-webkit-slider-runnable-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  background: #cccccc;
  border-radius: 1.3px;
  border: 1px solid #010101;
}
/* WebKit・Blink向け つまみのスタイル */
input[type=range]::-webkit-slider-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 16px;
  border-radius: 3px;
  background: #ffffff;
  cursor: pointer;
  -webkit-appearance: none;
  /* 以下は つまみの縦位置調整 */
  margin-top: -14px;  /* (つまみの高さ - トラックの高さ) / 2 。つまみの高さは border を含む */	
}

/* 何故か上の margin-top 指定が Edge に効いてしまうので、Edge向けに設定をリセット */
@supports (-ms-ime-align: auto) {
	input[type=range]::-webkit-slider-thumb {
		margin-top: 0 !important;
	}
}

/* WebKit・Blink向け focus時のスタイル */
input[type=range]:focus::-webkit-slider-runnable-track {
  background: #999999;
}

/* Firefox向け 溝のスタイル */
input[type=range]::-moz-range-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  background: #cccccc;
  border-radius: 1.3px;
  border: 0.2px solid #010101;
}
/* Firefox向け つまみのスタイル */
input[type=range]::-moz-range-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 16px;
  border-radius: 3px;
  background: #ffffff;
  cursor: pointer;
}

/* Edge・IE向け 溝のスタイル */
input[type=range]::-ms-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  background: transparent;
  border-color: transparent;
  border-width: 16px 0;
  color: transparent;
}
/* Edge・IE向け 溝の色(つまみより左側) */
input[type=range]::-ms-fill-lower {
  background: #cccccc;
  border: 0.2px solid #010101;
  border-radius: 2.6px;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
/* Edge・IE向け 溝の色(つまみより右側) */
input[type=range]::-ms-fill-upper {
  background: #cccccc;
  border: 0.2px solid #010101;
  border-radius: 2.6px;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
/* Edge・IE向け つまみのスタイル */
input[type=range]::-ms-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 16px;
  border-radius: 3px;
  background: #ffffff;
  cursor: pointer;
}
/* Edge・IE向け focus時の色(つまみより左側) */
input[type=range]:focus::-ms-fill-lower {
  background: #999999;
}
/* Edge・IE向け focus時の色(つまみより右側) */
input[type=range]:focus::-ms-fill-upper {
  background: #999999;
}

/* Edge・IE向け ポップアップを非表示に */
input[type=range]::-ms-tooltip {
  display: none;
}

見本は こちらのページ でご覧いただけます。

各ブラウザ向けに同じ値を何度も設定しているので CSS変数(カスタムプロパティ)を使うともう少しすっきり書けそうな気もしますが、そもそも Internet Explorer が CSS変数を解さないので、残念ながらそんなに楽にはできません。

ツマミを丸くしてみたい! と思ったら、上のスタイルシートをちょっとだけ書き換えて…

input[type=range] {
  -webkit-appearance: none;
  margin: 0;
  width: 100%;
}
input[type=range]:focus {
  outline: none;
}

/* WebKit・Blink向け 溝のスタイル */
input[type=range]::-webkit-slider-runnable-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  background: #cccccc;
  border-radius: 1.3px;
  border: 1px solid #010101;
}
/* WebKit・Blink向け つまみのスタイル */
input[type=range]::-webkit-slider-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 36px;
  border-radius: 50%;
  background: #ffffff;
  cursor: pointer;
  -webkit-appearance: none;
  /* 以下は つまみの縦位置調整 */
  margin-top: -14px;  /* (つまみの高さ - トラックの高さ) / 2 。つまみの高さは border を含む */	
}

/* 何故か上の margin-top 指定が Edge に効いてしまうので、Edge向けに設定をリセット */
@supports (-ms-ime-align: auto) {
	input[type=range]::-webkit-slider-thumb {
		margin-top: 0 !important;
	}
}

/* WebKit・Blink向け focus時のスタイル */
input[type=range]:focus::-webkit-slider-runnable-track {
  background: #999999;
}

/* Firefox向け 溝のスタイル */
input[type=range]::-moz-range-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  background: #cccccc;
  border-radius: 1.3px;
  border: 0.2px solid #010101;
}
/* Firefox向け つまみのスタイル */
input[type=range]::-moz-range-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 36px;
  border-radius: 50%;
  background: #ffffff;
  cursor: pointer;
}

/* Edge・IE向け 溝のスタイル */
input[type=range]::-ms-track {
  width: 100%;
  height: 12px;
  cursor: pointer;
  animate: 0.2s;
  background: transparent;
  border-color: transparent;
  border-width: 16px 0;
  color: transparent;
}
/* Edge・IE向け 溝の色(つまみより左側) */
input[type=range]::-ms-fill-lower {
  background: #cccccc;
  border: 0.2px solid #010101;
  border-radius: 2.6px;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
/* Edge・IE向け 溝の色(つまみより右側) */
input[type=range]::-ms-fill-upper {
  background: #cccccc;
  border: 0.2px solid #010101;
  border-radius: 2.6px;
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
}
/* Edge・IE向け つまみのスタイル */
input[type=range]::-ms-thumb {
  box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
  border: 1px solid #000000;
  height: 36px;
  width: 36px;
  border-radius: 50%;
  background: #ffffff;
  cursor: pointer;
}
/* Edge・IE向け focus時の色(つまみより左側) */
input[type=range]:focus::-ms-fill-lower {
  background: #999999;
}
/* Edge・IE向け focus時の色(つまみより右側) */
input[type=range]:focus::-ms-fill-upper {
  background: #999999;
}

/* Edge・IE向け ポップアップを非表示に */
input[type=range]::-ms-tooltip {
  display: none;
}

つまみの設定(input[type=range]::-webkit-slider-thumb、input[type=range]::-moz-range-thumb および input[type=range]::-ms-thumb)で、

  • width と height を同じ値に
  • border-radius を ' 50% ' に

書き換えます。

表示はこんな感じ。

range_xbrowser_maru.png

見本は こちらのページ でどうぞ。

このスタイルシートを基に、溝やツマミのサイズや色をカスタマイズしていきましょ。

カテゴリ: