วิธีจัดรูปแบบอินพุตช่วง HTML5 ให้มีสีต่างกันก่อนและหลังแถบเลื่อน?


95

ป้อนคำอธิบายภาพที่นี่

ฉันต้องการให้ด้านซ้ายเป็นสีเขียวและด้านขวาเป็นสีเทา ตามภาพด้านบนจะสมบูรณ์แบบ ควรเป็นโซลูชัน CSS ที่แท้จริง (ต้องกังวลเกี่ยวกับ WebKit เท่านั้น)

สิ่งนั้นเป็นไปได้หรือไม่?


คุณได้ลองทำอะไรบ้าง? โพสต์รหัสของคุณที่นี่
j08691

2
ได้ที่นี่: codepen.io/vsync/pen/mdEJMLv?editors=1100
vsync

คำถามที่เป็นประโยชน์มาก
Saurav Kumar

คำตอบ:


119

โซลูชันCSS บริสุทธิ์ :

  • Chrome:ซ่อนส่วนที่ล้นออกมาinput[range]และเติมช่องว่างทั้งหมดที่เหลือถึงหัวแม่มือด้วยสีเงา
  • IE:ไม่จำเป็นต้องสร้างล้อใหม่:::-ms-fill-lower
  • Firefox ไม่จำเป็นต้องสร้างวงล้อใหม่:::-moz-range-progress

/*Chrome*/
@media screen and (-webkit-min-device-pixel-ratio:0) {
    input[type='range'] {
      overflow: hidden;
      width: 80px;
      -webkit-appearance: none;
      background-color: #9a905d;
    }
    
    input[type='range']::-webkit-slider-runnable-track {
      height: 10px;
      -webkit-appearance: none;
      color: #13bba4;
      margin-top: -1px;
    }
    
    input[type='range']::-webkit-slider-thumb {
      width: 10px;
      -webkit-appearance: none;
      height: 10px;
      cursor: ew-resize;
      background: #434343;
      box-shadow: -80px 0 0 80px #43e5f7;
    }

}
/** FF*/
input[type="range"]::-moz-range-progress {
  background-color: #43e5f7; 
}
input[type="range"]::-moz-range-track {  
  background-color: #9a905d;
}
/* IE*/
input[type="range"]::-ms-fill-lower {
  background-color: #43e5f7; 
}
input[type="range"]::-ms-fill-upper {  
  background-color: #9a905d;
}
<input type="range"/>


1
สวัสดี deathangel908 ทางออกที่ดี ฉันจะปรับปรุงส่วนเงาของกล่อง: box-shadow: -80px 0 0px 80px # 43e5f7;
Filip Witkowski

32
ปัญหานี้ใน chrome คือหากคุณต้องการให้นิ้วหัวแม่มือใหญ่กว่าแทร็กเงาของกล่องจะทับแทร็กด้วยความสูงของนิ้วหัวแม่มือ มีวิธี จำกัด เงากล่องภายในแทร็กหรือไม่?
mharris7190

1
ใช้ไม่ได้กับอินพุตที่มีความกว้างตามเปอร์เซ็นต์ ใครมีวิธีแก้ปัญหานั้น
Remi Sture

2
สามารถดูเวอร์ชัน CSS / JS ที่ใช้งานได้ที่นี่: jsfiddle.net/remisture/esyvws3d
Remi Sture

3
@tenwest ว้าวน่ากลัวจัง ขอบคุณสำหรับการอัพเดท!
CodeF0x

51

ในขณะที่คำตอบที่ยอมรับนั้นดีในทางทฤษฎี แต่ก็ไม่สนใจข้อเท็จจริงที่ว่านิ้วหัวแม่มือจะไม่สามารถใหญ่กว่าขนาดของแทร็กได้โดยไม่ต้องถูกสับด้วยoverflow: hidden. ดูตัวอย่างวิธีจัดการสิ่งนี้ด้วย JS เพียงเล็กน้อย

// .chrome styling Vanilla JS

document.getElementById("myinput").oninput = function() {
  this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 ' + this.value + '%, #fff ' + this.value + '%, white 100%)'
};
#myinput {
  background: linear-gradient(to right, #82CFD0 0%, #82CFD0 50%, #fff 50%, #fff 100%);
  border: solid 1px #82CFD0;
  border-radius: 8px;
  height: 7px;
  width: 356px;
  outline: none;
  transition: background 450ms ease-in;
  -webkit-appearance: none;
}
<div class="chrome">
  <input id="myinput" type="range" value="50" />
</div>


คุณช่วยแนะนำฉันได้ไหมเมื่อฉันเพิ่ม max = 5 ใน HTML แล้วเติมสีไม่ถูกต้อง
Husna

@Husna ฉันได้ขยายคำตอบนี้เพื่อจัดการแอตทริบิวต์ min max ด้วยหวังว่าจะช่วยได้
htmn

1
@Husna คุณต้องคำนวณ% เป็นผลต่างระหว่างค่าสูงสุดและค่าต่ำสุดของคุณ ตัวอย่างเช่นหากคุณมีขั้นต่ำ: 0 และสูงสุด: 10 คุณควรใช้ใน JS :,+ this.value / (10-0)*100 +'%, #fff
Rosario Russo

4
@Rosario Russo คุณเพียงแค่ต้องตอบกลับนี้ค่าใน JS ด้วย(this.value-this.min)/(this.max-this.min)*100
Silvan

28

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

นอกจากนี้คุณจะต้องใช้ JavaScript เล็กน้อยด้วย ฉันใช้เสรีภาพในการใช้ไลบรารีjQueryสำหรับสิ่งนี้เพื่อความเรียบง่าย

ที่นี่คุณไป: http://jsfiddle.net/JnrvG/1/


8
นั่นไม่ใช่คำถามสิ่งที่ iu ต้องทำโดย css มีวิธีเดียวกับ css
Ipad

10
คุณสามารถทำให้ใช้งานได้ใน Chrome โดยไม่ต้องใช้ JS ( jsfiddle.net/1xg1j3tw ) สำหรับ IE10 + คุณสามารถใช้องค์ประกอบหลอก -ms-fill-lower และ -ms-fill-upper
Ales

1
@ เอลส์คุณควรใส่คำตอบเพิ่มเติม
Luca Steeb

4
เปลี่ยน.change(ไป on('input', func..เพื่อให้พื้นหลังเปลี่ยนเมื่อผู้ใช้เลื่อนนิ้วหัวแม่มือไม่ใช่แค่เลื่อนเมาส์ขึ้น
Yami Odymel

10

การอัปเดตเล็กน้อยสำหรับสิ่งนี้:

หากคุณใช้สิ่งต่อไปนี้มันจะอัปเดตทันทีแทนที่จะปล่อยเมาส์

"เปลี่ยน mousemove", ฟังก์ชัน "

<script>
$('input[type="range"]').on("change mousemove", function () {
    var val = ($(this).val() - $(this).attr('min')) / ($(this).attr('max') - $(this).attr('min'));

    $(this).css('background-image',
                '-webkit-gradient(linear, left top, right top, '
                + 'color-stop(' + val + ', #2f466b), '
                + 'color-stop(' + val + ', #d3d3db)'
                + ')'
                );
});</script>

7

จากคำตอบของ@ dargue3หากคุณต้องการให้นิ้วหัวแม่มือใหญ่กว่าแทร็กคุณต้องการใช้ประโยชน์จาก<input type="range" />องค์ประกอบอย่างเต็มที่และไปที่เบราว์เซอร์ข้ามคุณต้องมีบรรทัด JS & CSS เพิ่มเติมเล็กน้อย

บน Chrome / Mozilla คุณสามารถใช้linear-gradientเทคนิค แต่คุณจำเป็นต้องปรับอัตราส่วนตามmin, max, valueคุณลักษณะตามที่กล่าวไว้ที่นี่โดย@Attila ทุม คุณต้องแน่ใจว่าคุณไม่ได้ใช้สิ่งนี้กับ Edge มิฉะนั้นจะไม่แสดงนิ้วหัวแม่มือ @Geoffrey Lallouéอธิบายในรายละเอียดเพิ่มเติมที่นี่

อีกสิ่งหนึ่งที่ควรค่าแก่การกล่าวถึงคือคุณต้องปรับrangeEl.style.height = "20px";IE / Older พูดง่ายๆก็คือเพราะในกรณีนี้ "ไม่ได้ใช้ความสูงกับแทร็ก แต่ใช้อินพุตทั้งหมดรวมทั้งนิ้วโป้งด้วย" ซอ

/**
 * Sniffs for Older Edge or IE,
 * more info here:
 * https://stackoverflow.com/q/31721250/3528132
 */
function isOlderEdgeOrIE() {
  return (
    window.navigator.userAgent.indexOf("MSIE ") > -1 ||
    !!navigator.userAgent.match(/Trident.*rv\:11\./) ||
    window.navigator.userAgent.indexOf("Edge") > -1
  );
}

function valueTotalRatio(value, min, max) {
  return ((value - min) / (max - min)).toFixed(2);
}

function getLinearGradientCSS(ratio, leftColor, rightColor) {
  return [
    '-webkit-gradient(',
    'linear, ',
    'left top, ',
    'right top, ',
    'color-stop(' + ratio + ', ' + leftColor + '), ',
    'color-stop(' + ratio + ', ' + rightColor + ')',
    ')'
  ].join('');
}

function updateRangeEl(rangeEl) {
  var ratio = valueTotalRatio(rangeEl.value, rangeEl.min, rangeEl.max);

  rangeEl.style.backgroundImage = getLinearGradientCSS(ratio, '#919e4b', '#c5c5c5');
}

function initRangeEl() {
  var rangeEl = document.querySelector('input[type=range]');
  var textEl = document.querySelector('input[type=text]');

  /**
   * IE/Older Edge FIX
   * On IE/Older Edge the height of the <input type="range" />
   * is the whole element as oposed to Chrome/Moz
   * where the height is applied to the track.
   *
   */
  if (isOlderEdgeOrIE()) {
    rangeEl.style.height = "20px";
    // IE 11/10 fires change instead of input
    // https://stackoverflow.com/a/50887531/3528132
    rangeEl.addEventListener("change", function(e) {
      textEl.value = e.target.value;
    });
    rangeEl.addEventListener("input", function(e) {
      textEl.value = e.target.value;
    });
  } else {
    updateRangeEl(rangeEl);
    rangeEl.addEventListener("input", function(e) {
      updateRangeEl(e.target);
      textEl.value = e.target.value;
    });
  }
}

initRangeEl();
input[type="range"] {
  -webkit-appearance: none;
  -moz-appearance: none;
  width: 300px;
  height: 5px;
  padding: 0;
  border-radius: 2px;
  outline: none;
  cursor: pointer;
}


/*Chrome thumb*/

input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  -moz-appearance: none;
  -webkit-border-radius: 5px;
  /*16x16px adjusted to be same as 14x14px on moz*/
  height: 16px;
  width: 16px;
  border-radius: 5px;
  background: #e7e7e7;
  border: 1px solid #c5c5c5;
}


/*Mozilla thumb*/

input[type="range"]::-moz-range-thumb {
  -webkit-appearance: none;
  -moz-appearance: none;
  -moz-border-radius: 5px;
  height: 14px;
  width: 14px;
  border-radius: 5px;
  background: #e7e7e7;
  border: 1px solid #c5c5c5;
}


/*IE & Edge input*/

input[type=range]::-ms-track {
  width: 300px;
  height: 6px;
  /*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
  background: transparent;
  /*leave room for the larger thumb to overflow with a transparent border */
  border-color: transparent;
  border-width: 2px 0;
  /*remove default tick marks*/
  color: transparent;
}


/*IE & Edge thumb*/

input[type=range]::-ms-thumb {
  height: 14px;
  width: 14px;
  border-radius: 5px;
  background: #e7e7e7;
  border: 1px solid #c5c5c5;
}


/*IE & Edge left side*/

input[type=range]::-ms-fill-lower {
  background: #919e4b;
  border-radius: 2px;
}


/*IE & Edge right side*/

input[type=range]::-ms-fill-upper {
  background: #c5c5c5;
  border-radius: 2px;
}


/*IE disable tooltip*/

input[type=range]::-ms-tooltip {
  display: none;
}

input[type="text"] {
  border: none;
}
<input type="range" value="80" min="10" max="100" step="1" />
<input type="text" value="80" size="3" />


5

วิธีการแก้ปัญหาที่ยอมรับก่อนหน้านี้จะไม่ทำงานอีกต่อไป

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


1

หากคุณใช้คำตอบแรกแสดงว่านิ้วหัวแม่มือมีปัญหา ในโครเมี่ยมหากคุณต้องการให้นิ้วหัวแม่มือใหญ่กว่าแทร็กเงาของกล่องจะทับแทร็กด้วยความสูงของนิ้วหัวแม่มือ

เพียงสรุปคำตอบเหล่านี้ทั้งหมดและเขียนแถบเลื่อนที่ใช้งานได้ตามปกติด้วยหัวแม่มือตัวเลื่อนขนาดใหญ่: jsfiddle

const slider = document.getElementById("myinput")
const min = slider.min
const max = slider.max
const value = slider.value

slider.style.background = `linear-gradient(to right, red 0%, red ${(value-min)/(max-min)*100}%, #DEE2E6 ${(value-min)/(max-min)*100}%, #DEE2E6 100%)`

slider.oninput = function() {
  this.style.background = `linear-gradient(to right, red 0%, red ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 ${(this.value-this.min)/(this.max-this.min)*100}%, #DEE2E6 100%)`
};
#myinput {
  border-radius: 8px;
  height: 4px;
  width: 150px;
  outline: none;
  -webkit-appearance: none;
}

input[type='range']::-webkit-slider-thumb {
  width: 6px;
  -webkit-appearance: none;
  height: 12px;
  background: black;
  border-radius: 2px;
}
<div class="chrome">
  <input id="myinput" type="range" min="0" value="25" max="200" />
</div>


0

ตอนนี้ได้รับการสนับสนุนด้วยองค์ประกอบหลอกในแต่ละ WebKit, Firefox และ IE แต่แน่นอนว่ามันแตกต่างกันในแต่ละอัน : (

ดูคำตอบของคำถามนี้และ / หรือค้นหา CodePen ที่มีหัวข้อprettify <input type=range> #101สำหรับวิธีแก้ปัญหาบางอย่าง


-5
input type="range" min="0" max="50" value="0"  style="margin-left: 6%;width: 88%;background-color: whitesmoke;"

โค้ดด้านบนเปลี่ยนรูปแบบการป้อนข้อมูลช่วง .....


ทำงานใน FireFox 57 แต่ไม่ใช่ Opera 49 หรือ Safari 11 - แย่กว่านั้นไม่มีอะไรรองรับสีพื้นหน้า
devon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.