วิธีแสดงแถบเลื่อนอินพุตช่วงในแนวตั้ง


92

ฉันต้องการแสดง<input type="range" />ตัวควบคุมแถบเลื่อนในแนวตั้ง ฉันกังวลเฉพาะเบราว์เซอร์ที่รองรับการควบคุมแถบเลื่อนช่วง

ฉันพบความคิดเห็นและการอ้างอิงบางอย่างที่ดูเหมือนจะระบุว่าการตั้งค่าความสูงที่มากกว่าความกว้างจะทำให้เบราว์เซอร์เปลี่ยนการวางแนวโดยอัตโนมัติ แต่ในการทดสอบของฉันใช้งานได้เฉพาะใน Opera ที่ใช้ใน Opera เท่านั้น แต่ไม่ใช่อีกต่อไป ฉันจะปรับแนวแถบเลื่อนช่วง HTML5 ในแนวตั้งได้อย่างไร

คำตอบ:


137

ขั้นแรกกำหนดความสูงมากกว่าความกว้าง ตามทฤษฎีแล้วนี่คือทั้งหมดที่คุณควรต้องมี ข้อกำหนดHTML5 แนะนำมาก :

... UA กำหนดแนวของตัวควบคุมจากอัตราส่วนของคุณสมบัติความสูงและความกว้างที่ระบุสไตล์ชีต

โอเปร่ามีมันดำเนินการด้วยวิธีนี้ แต่โอเปร่าตอนนี้ใช้WebKit กะพริบตา ณ วันนี้ไม่มีเบราว์เซอร์ใดที่ใช้แถบเลื่อนแนวตั้งโดยพิจารณาจากความสูงที่มากกว่าความกว้างเท่านั้น

ไม่ว่าจะต้องตั้งค่าความสูงมากกว่าความกว้างเพื่อให้ได้เค้าโครงที่เหมาะสมระหว่างเบราว์เซอร์ การใช้ช่องว่างด้านซ้ายและด้านขวาจะช่วยในการจัดวางและการวางตำแหน่ง

สำหรับ Chrome -webkit-appearance: slider-verticalใช้

สำหรับ IE ใช้writing-mode: bt-lr.

สำหรับ Firefox ให้เพิ่มorient="vertical"แอตทริบิวต์ใน html สงสารที่พวกเขาทำแบบนี้ สไตล์ภาพควรควบคุมผ่าน CSS ไม่ใช่ HTML

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บนเว็บ:

ห้ามใช้พร็อพเพอร์ตี้นี้บนเว็บไซต์: ไม่เพียง แต่จะไม่ได้มาตรฐานเท่านั้น แต่ยังเปลี่ยนพฤติกรรมจากเบราว์เซอร์หนึ่งไปยังอีกเบราว์เซอร์ แม้แต่คำหลักnoneก็มีลักษณะการทำงานที่ไม่เหมือนกันในแต่ละองค์ประกอบของฟอร์มในเบราว์เซอร์ที่แตกต่างกันและบางคำก็ไม่รองรับเลย

คำบรรยายสำหรับการสาธิตตัวเลื่อนแนวตั้งในเอกสาร IEระบุอย่างไม่ถูกต้องว่าการตั้งค่าความสูงที่มากกว่าความกว้างจะแสดงแถบเลื่อนช่วงในแนวตั้ง แต่ไม่ได้ผล ในส่วนของรหัสwriting-modeมันชัดถ้อยชัดคำไม่สูงไม่ได้ตั้งค่าหรือความกว้างและแทนที่จะใช้ writing-modeคุณสมบัติเป็นดำเนินการโดย IEเป็นที่แข็งแกร่งมาก น่าเศร้าที่ค่าที่กำหนดไว้ในร่างการทำงานปัจจุบันของข้อมูลจำเพาะขณะที่เขียนนี้มีข้อ จำกัด กว่ามาก หากเวอร์ชันในอนาคตของ IE ลดลงสนับสนุนbt-lrตามที่เสนอในปัจจุบันvertical-lr(ซึ่งจะเทียบเท่าtb-lr) แถบเลื่อนจะแสดงกลับหัว เป็นไปได้มากว่าเวอร์ชันในอนาคตจะขยายไฟล์writing-modeเพื่อยอมรับค่าใหม่แทนที่จะปล่อยการสนับสนุนสำหรับค่าที่มีอยู่ แต่ควรรู้ว่าคุณกำลังทำอะไรอยู่


2
+1 สำหรับข้อจำกัดความรับผิดชอบ-webkit-appearance- ฉันไม่รู้ มันเปลี่ยนแปลงทุกอย่าง
Robin Winslow

องค์ประกอบอินพุตที่มี type = "range" ใน IE มีความไวต่อค่า width / height / display มาก เมื่อใช้ Bootstrap ค่าเหล่านี้บางค่าอาจถูกเขียนทับโดยไม่ได้ตั้งใจ (โดยเฉพาะอย่างยิ่งถ้าคุณไม่ได้ใช้ blanket css ในคำตอบ) สำหรับช่วงแนวตั้งช่วงหนึ่งของฉันฉันใช้ css แบบนี้: .vert {-ms-writing-mode: bt-lr; / * IE / -webkit- ลักษณะ: ตัวเลื่อนแนวตั้ง; / WebKit * / ความสูง: 210px; ความกว้าง: 20px! important; ช่องว่างภายใน: 0 5px; display: inline-block! important; }
mp31415

1
ฉันไม่ใช่แฟนของ!important. การเสริมความแข็งแกร่งให้กับตัวเลือกของคุณจะดีกว่าเสมอ แทนที่จะเป็นเพียงบางสิ่งบางอย่างเช่นการใช้งาน.vert input[type=range].vert
gilly3

76

คุณสามารถทำได้ด้วยการแปลง css แต่ระวังความสูง / ความกว้างของคอนเทนเนอร์ด้วย นอกจากนี้คุณอาจต้องวางตำแหน่งให้ต่ำลง:

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


หรือเทียบเท่าการแปลง 3d:

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

คุณยังสามารถใช้สิ่งนี้เพื่อเปลี่ยนทิศทางของสไลด์โดยตั้งค่าเป็น 180deg หรือ 90deg สำหรับแนวนอนหรือแนวตั้งตามลำดับ


2
โปรดทราบว่าคุณต้องทำให้เป็น 270 หากคุณต้องการให้สอดคล้องกับค่าที่สูงขึ้นคุณจะเพิ่มขึ้นและลดค่าที่คุณลงไป แก้ไขคำตอบของคุณ
สิงหาคม

1
ฉันชอบแนวทางนี้เพราะรองรับสไตล์ css ที่กำหนดเอง ด้วยวิธีการอื่นการจัดแต่งทรงผมที่กำหนดเองทำให้ตัวเลื่อนดูตลก
Kim T

1
นี่เรียบง่าย แต่ยอดเยี่ยม
Christopher M.

แทนตำแหน่ง: แน่นอนคุณอาจใช้ display: inline-block; กับแหล่งกำเนิดการเปลี่ยนแปลง
Denis Giffeler

@DenisGiffeler ตำแหน่งสัมบูรณ์ไม่ได้เป็นส่วนหนึ่งของโซลูชันนี้เป็นเพียงวิธีที่สะดวกในการทำให้ตัวอย่าง SO แสดงอย่างถูกต้อง มีหลายวิธีในการจัดตำแหน่งให้สำเร็จขึ้นอยู่กับกรณีการใช้งานของคุณ
MaxPRafferty

25

โดยไม่ต้องเปลี่ยนตำแหน่งเป็นค่าสัมบูรณ์โปรดดูด้านล่าง สิ่งนี้รองรับเบราว์เซอร์ล่าสุดทั้งหมดด้วย

.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

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.