Làm cách nào để tạo kiểu đầu vào phạm vi HTML5 để có màu khác nhau trước và sau thanh trượt?


96

nhập mô tả hình ảnh ở đây

Tôi muốn mặt trái có màu xanh lá cây và mặt phải có màu xám. Như hình trên sẽ là HOÀN THÀNH. Tốt hơn là một giải pháp CSS thuần túy (chỉ cần lo lắng về WebKit).

Một điều như vậy là có thể?


Có lẽ, bạn đã thử những gì? Đăng mã của bạn ở đây.
j08691


Câu hỏi rất hữu ích.
Saurav Kumar

Câu trả lời:


120

Giải pháp CSS thuần túy :

  • Chrome: Ẩn phần tràn khỏi input[range]và lấp đầy tất cả các khoảng trống còn lại cho ngón tay cái bằng màu bóng.
  • IE: không cần phải phát minh lại bánh xe:::-ms-fill-lower
  • Firefox không cần phải phát minh lại bánh xe:::-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
Chào deathangel908, giải pháp tốt. Tôi chỉ cải thiện phần bóng hộp: box-shadow: -80px 0 0px 80px # 43e5f7;
Filip Witkowski

32
Vấn đề với điều này trong chrome là nếu bạn muốn ngón tay cái lớn hơn bản nhạc, thì bóng hộp sẽ chồng lên bản nhạc bằng chiều cao của ngón tay cái. Có cách nào để giới hạn bóng hộp bên trong bản nhạc không?
mharris7190

1
Điều này không hoạt động đối với các đầu vào có độ rộng dựa trên tỷ lệ phần trăm. Bất cứ ai có một giải pháp cho điều đó?
Remi Sture

2
Một CSS / JS phiên bản làm việc có thể được tìm thấy ở đây: jsfiddle.net/remisture/esyvws3d
Remi Sture

3
@tenwest Chà, thật kinh khủng. Cảm ơn các cập nhật!
CodeF0x

51

Trong khi câu trả lời được chấp nhận là tốt về mặt lý thuyết, nó bỏ qua thực tế rằng ngón tay cái sau đó không thể lớn hơn kích thước của bản nhạc mà không bị cắt bởi overflow: hidden. Hãy xem ví dụ này về cách xử lý điều này chỉ với một chút 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>


bạn có thể gợi ý cho tôi khi tôi thêm max = 5 trong HTML thì màu không được tô đúng
Husna

@Husna Tôi đã mở rộng câu trả lời này để cũng xử lý các thuộc tính tối đa tối thiểu, hy vọng nó sẽ hữu ích.
htmn

1
@Husna Bạn phải tính% là sự khác biệt giữa giá trị tối đa và giá trị tối thiểu của mình. Ví dụ: nếu bạn có min: 0 và max: 10, bạn nên sử dụng, trong JS :,+ this.value / (10-0)*100 +'%, #fff
Rosario Russo

4
@Rosario Russo Bạn chỉ cần đăng lại điều này. Giá trị trong JS với(this.value-this.min)/(this.max-this.min)*100
Silvan

28

Có, nó là có thể. Mặc dù tôi sẽ không khuyên bạn nên sử dụng nó vì nó input rangekhông thực sự được hỗ trợ đúng cách bởi tất cả các trình duyệt vì là một phần tử mới được thêm vào HTML5 và HTML5 chỉ là bản nháp (và sẽ còn lâu) nên đi xa về kiểu dáng có lẽ không phải là tốt nhất sự lựa chọn.

Ngoài ra, bạn cũng sẽ cần một chút JavaScript. Tôi đã tự do sử dụng thư viện jQuery cho việc này, vì mục đích đơn giản.

Đây là trang web của bạn: http://jsfiddle.net/JnrvG/1/ .


8
Đó không phải là câu hỏi, những gì tôi cần làm điều đó bằng css, có một cách tuyệt vời chỉ với css.
Ipad

10
Bạn có thể làm cho nó hoạt động trong Chrome mà không cần JS ( jsfiddle.net/1xg1j3tw ). Đối với IE10 +, bạn có thể sử dụng các phần tử giả -ms-fill-under và -ms-fill-upper.
Ales

1
@Ales Bạn nên đặt điều đó trong một câu trả lời bổ sung.
Lucatylesb

4
Thay đổi .change(để on('input', func..nền sẽ thay đổi khi người dùng di chuyển ngón tay cái chứ không chỉ di chuột lên.
Yami Odymel

10

Một cập nhật nhỏ cho cái này:

nếu bạn sử dụng phần sau, nó sẽ cập nhật nhanh hơn là khi phát hành bằng chuột.

"thay đổi di chuyển chuột", chức năng "

<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

Dựa trên câu trả lời của @ dargue3 , nếu bạn muốn ngón tay cái lớn hơn bản nhạc, bạn muốn tận dụng tối đa <input type="range" />phần tử và sử dụng trình duyệt chéo, bạn cần thêm một chút dòng JS & CSS.

Trên Chrome / Mozilla, bạn có thể sử dụng các linear-gradientkỹ thuật, nhưng bạn cần phải điều chỉnh tỷ lệ dựa trên min, max, valuethuộc tính như đã đề cập ở đây bởi @Attila O. . Bạn cần đảm bảo rằng bạn không áp dụng điều này trên Edge, nếu không ngón tay cái sẽ không hiển thị. @Geoffrey Lalloué giải thích điều này chi tiết hơn tại đây .

Một điều đáng nói nữa, là bạn cần điều chỉnh rangeEl.style.height = "20px";trên IE / Older. Nói một cách đơn giản là vì trong trường hợp này "chiều cao không được áp dụng cho bản nhạc mà là toàn bộ đầu vào bao gồm cả ngón tay cái". vĩ cầm

/**
 * 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

Giải pháp được chấp nhận trước đó không hoạt động nữa .

Tôi đã kết thúc việc viết mã một hàm đơn giản bao bọc nó rangevào một vùng chứa được tạo kiểu, thêm thanh cần thiết trước con trỏ. Tôi đã viết ví dụ này trong đó dễ dàng nhìn thấy hai màu 'xanh lam' và 'cam' được đặt trong css, vì vậy chúng có thể được sửa đổi nhanh chóng.


1

Nếu bạn sử dụng câu trả lời đầu tiên , có vấn đề với ngón tay cái. Trong chrome, nếu bạn muốn ngón cái lớn hơn bản nhạc , thì bóng hộp sẽ chồng lên bản nhạc bằng chiều cao của ngón tay cái.

Chỉ cần tổng hợp tất cả các câu trả lời này và viết thanh trượt hoạt động bình thường với ngón tay cái thanh trượt lớn hơn: 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

Nó hiện được hỗ trợ với các phần tử giả trong mỗi WebKit, Firefox và IE. Nhưng, tất nhiên, nó khác nhau ở mỗi cái. : (

Xem câu trả lời của câu hỏi này và / hoặc tìm kiếm CodePen có tiêu đề prettify <input type=range> #101cho một số giải pháp.


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

mã trên thay đổi kiểu nhập phạm vi .....


Hoạt động trong FireFox 57 nhưng không phải Opera 49 hay Safari 11 - tệ hơn, không có gì hỗ trợ màu nền trước.
devon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.