範囲入力スライダーを垂直に表示する方法


88

<input type="range" />スライダーコントロールを縦に表示したい。私が関心を持っているのは、範囲スライダーコントロールをサポートするブラウザーだけです。

幅よりも高さを設定するとブラウザの向きが自動的に変更されることを示すと思われるコメントや参照を見つけましたが、私のテストでは、Operaでのみ機能し、Operaでは機能しなくなりました。HTML5範囲スライダーを垂直方向に向けるにはどうすればよいですか?

回答:


131

まず、高さを幅よりも大きく設定します。理論的には、これで十分です。HTML5仕様は限り示唆します

... UAは、スタイルシートで指定された高さと幅のプロパティの比率からコントロールの方向を決定しました。

Operaはこの方法で実装していましたが、Operaは現在WebKit Blinkを使用しています。現在のところ、幅よりも高さだけに基づく垂直スライダーを実装しているブラウザーはありません。

いずれにしても、ブラウザー間でレイアウトを正しくするには、幅よりも高さを高く設定する必要があります。左と右のパディングを適用すると、レイアウトと配置にも役立ちます。

Chromeの場合はを使用します-webkit-appearance: slider-vertical

IEの場合はを使用しますwriting-mode: bt-lr

Firefoxの場合orient="vertical"、htmlに属性を追加します。彼らがこのようにそれをしたのは残念だ。ビジュアルスタイルは、HTMLではなくCSSを介して制御する必要があります。

input[type=range][orient=vertical]
{
    writing-mode: bt-lr; /* IE */
    -webkit-appearance: slider-vertical; /* WebKit */
    width: 8px;
    height: 175px;
    padding: 0 5px;
}
<input type="range" orient="vertical" />


免責事項:

このソリューションは、未定義または未確定のCSSプロパティの現在のブラウザー実装に基づいています。コードで使用する場合は、新しいブラウザーバージョンがリリースされ、w3cの推奨事項が完了したときにコードを調整できるように準備してください。

MDNには-webkit-appearance、Web での使用に対する明示的な警告が含まれています。

このプロパティはWebサイトでは使用しないでください。非標準であるだけでなく、ブラウザごとに動作が異なります。キーワードでさえ、none異なるブラウザの各フォーム要素で同じ動作をするわけではなく、まったくサポートしていないものもあります。

IEドキュメントの垂直スライダーデモのキャプションは、高さを幅より大きく設定すると、範囲スライダーが垂直に表示されることを誤って示していますが、これは機能しませコードセクションは、はっきり高さまたは幅を設定せず、代わりに使用しますwriting-modeIE実装されているこのwriting-modeプロパティは非常に堅牢です。残念なことに、この執筆時点での仕様の現在の草案で定義されている値は、はるかに制限されています。IEの将来のバージョンで、現在提案されている(と同等)のサポートが廃止された場合、スライダーは上下逆に表示されます。おそらく、将来のバージョンでは、bt-lrvertical-lrtb-lrwriting-mode既存の値のサポートを削除するのではなく、新しい値を受け入れる。しかし、あなたが何を扱っているかを知るのは良いことです。


2
免責事項の+1- -webkit-appearance私はそれを知りませんでした。それはすべてを変えます。
ロビンウィンスロー

IEでtype = "range"の入力要素は、幅/高さ/表示値に非常に敏感です。Bootstrapを使用すると、これらの値の一部が誤って上書きされる可能性があります(特に、回答のようにブランケットcssを使用しない場合)。私の垂直範囲の1つでは、次のようにcssを使用します:.vert {-ms-writing-mode:bt-lr; / * IE / -webkit-appearance:slider-vertical; / WebKit * /高さ:210px; 幅:20px!重要; パディング:0 5px; 表示:インラインブロック!重要; }
mp31415 2014年

1
私は間違いなくのファンではありません!important。セレクターを強化することは常に良いことです。だけでなく.vert、のようなものを使用してくださいinput[type=range].vert
gilly3 2014年

72

これはcss変換を使用して行うことができますが、コンテナの高さと幅には注意してください。また、下に配置する必要がある場合があります。

input[type="range"] {
   position: absolute;
   top: 40%;
   transform: rotate(270deg);
}
<input type="range"/>


または同等の3D変換:

input[type="range"] {
   transform: rotateZ(270deg);
}

これを使用して、スライドを水平または垂直にそれぞれ180度または90度に設定して、スライドの方向を切り替えることもできます。


2
上昇する高い値と下降する低い値に対応させる場合は、270にする必要があることに注意してください。回答を編集しました。
2015年

1
カスタムのCSSスタイリングをサポートしているので、このアプローチを好みます。他のアプローチでは、カスタムのスタイル設定によりスライダーの動作がおかしくなります
Kim T

1
これはシンプルですが見事です
クリストファーM.

位置:絶対の代わりに、display:inline-block;を使用できます。変換元。
Denis Giffeler

@DenisGiffeler絶対位置は実際にはこのソリューションの一部ではなく、SOの例を正しく表示するための便利な方法です。ユースケースに応じて、ポジショニングを実現する方法はたくさんあります。
MaxPRafferty

22

絶対位置に変更せずに、以下を参照してください。これは最近のすべてのブラウザもサポートしています。

.vranger {
  margin-top: 50px;
   transform: rotate(270deg);
  -moz-transform: rotate(270deg); /*do same for other browsers if required*/
}
<input type="range" class="vranger"/>

非常に古いブラウザでは-sand-transform: rotate(10deg);CSSサンドペーパーから使用できます

または使用

-ms-transform: rotate(270deg);IE9 などのプレフィックスセレクタ


transform-origin: center left;スライダーを中央揃えではなく左揃えにするようなものも含ま れます。
DragonLord

3

.container {
    border: 3px solid #eee;
    margin: 10px;
    padding: 10px;
    float: left;
    text-align: center;
    max-width: 20%
}

input[type=range].range {
    cursor: pointer;
    width: 100px !important;
    -webkit-appearance: none;
    z-index: 200;
    width: 50px;
    border: 1px solid #e6e6e6;
    background-color: #e6e6e6;
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#e6e6e6), to(#d2d2d2));
    background-image: -webkit-linear-gradient(right, #e6e6e6, #d2d2d2);
    background-image: -moz-linear-gradient(right, #e6e6e6, #d2d2d2);
    background-image: -ms-linear-gradient(right, #e6e6e6, #d2d2d2);
    background-image: -o-linear-gradient(right, #e6e6e6, #d2d2d2)
}

input[type=range].range:focus {
    border: 0 !important;
    outline: 0 !important
}

input[type=range].range::-webkit-slider-thumb {
    -webkit-appearance: none;
    width: 10px;
    height: 10px;
    background-color: #555;
    background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#4ddbff), to(#0cf));
    background-image: -webkit-linear-gradient(right, #4ddbff, #0cf);
    background-image: -moz-linear-gradient(right, #4ddbff, #0cf);
    background-image: -ms-linear-gradient(right, #4ddbff, #0cf);
    background-image: -o-linear-gradient(right, #4ddbff, #0cf)
}

input[type=range].round {
    -webkit-border-radius: 20px;
    -moz-border-radius: 20px;
    border-radius: 20px
}

input[type=range].round::-webkit-slider-thumb {
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    -o-border-radius: 5px
}

.vertical-lowest-first {
    -webkit-transform: rotate(90deg);
    -moz-transform: rotate(90deg);
    -o-transform: rotate(90deg);
    -ms-transform: rotate(90deg);
    transform: rotate(90deg)
}

.vertical-heighest-first {
    -webkit-transform: rotate(270deg);
    -moz-transform: rotate(270deg);
    -o-transform: rotate(270deg);
    -ms-transform: rotate(270deg);
    transform: rotate(270deg)
}
<div class="container" style="margin-left: 0px">
    <br><br>
    <input class="range vertical-lowest-first" type="range" min="0" max="1" step="0.1" value="1">
    <br><br><br>
</div>

<div class="container">
    <br><br>
    <input class="range vertical-heighest-first" type="range" min="0" max="1" step="0.1" value="1">
    <br><br><br>
</div>


<div class="container">
    <br><br>
    <input class="range vertical-lowest-first round" type="range" min="0" max="1" step="0.1" value="1">
    <br><br><br>
</div>


<div class="container" style="margin-right: 0px">
    <br><br>
    <input class="range vertical-heighest-first round" type="range" min="0" max="1" step="0.1" value="1">
    <br><br><br>
</div>

ソース:http : //twiggle-web-design.com/tutorials/Custom-Vertical-Input-Range-CSS3.html


ソースリンクには、さまざまなスタイルの処理を備えたさまざまなスライダーを示すデモが含まれています。
Josh Habdas、2018年

0

とてもシンプルです。私はを使用して実装し-webkit-appearance: slider-verticalましたが、chorme、Firefox、Edgeで動作しました

<input type="range">
input[type=range]{
    writing-mode: bt-lr; /* IE */
    -webkit-appearance: slider-vertical; /* WebKit */
    width: 50px;
    height: 200px;
    padding: 0 24px;
    outline: none;
    background:transparent;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.