【CSS】input type="range" の見栄えを、異なるブラウザ間で統一する。
input type="range" で表示できるスライダー形式の HTML 部品。
個人的にはなかなか使い勝手の良い奴ではないか、と思うのですが、ブラウザによって外観がかなり異なるのだな。例えば Firefox だと以下のような感じ。
そして Chrome などの Blink / WebKit なブラウザでは以下のような具合。
スタイルシートを使って、ブラウザ間で同じ見栄えになるようにしてみる。ひとまず、以下のような外観にしてみましょ。
ベースとするスタイルシートは、こちらのページ(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% ' に
書き換えます。
表示はこんな感じ。
見本は こちらのページ でどうぞ。
このスタイルシートを基に、溝やツマミのサイズや色をカスタマイズしていきましょ。
コメント