How to style HTML5 range input to have different color before and after slider?

enter image description here

I want the left side to be green and the right side to be gray. As pictured above would be PERFECT. Preferably a pure CSS solution (only need to worry about WebKit).

Is such a thing possible?

257281 次浏览

是的,有可能。虽然我不会推荐它,因为 input range并没有得到所有浏览器的正确支持,因为它是在 HTML5中添加的一个新元素,而 HTML5只是一个草案(并且会持续很长时间) ,所以它的样式可能并不是最好的选择。

另外,您还需要一些 JavaScript。为了简单起见,我擅自使用了 JQuery库。

给你 http://jsfiddle.net/JnrvG/1/

现在 WebKit、 Firefox 和 IE 都支持伪元素。但是,当然,每一个都是不同的。: (

有关一些解决方案,请参阅 这个问题的答案和/或搜索名为 prettify <input type=range> #101的 CodePen。

这里有一个小小的更新:

如果您使用以下命令,它将在动态更新,而不是在鼠标释放。

“更改鼠标移动”,功能

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

纯 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"/>

以前接受的解决方案不再有效。

我最后编写了一个简单的函数,它将 range封装到一个样式化的容器中,并在光标之前添加所需的条形图。 我写 这个例子的地方很容易看到两个颜色’蓝色’和’橙色’设置在 css,所以他们可以迅速修改。

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

以上代码更改范围输入样式... ..。

虽然公认的答案在理论上是好的,但它忽略了一个事实,那就是拇指不能大于轨道的大小而不被 overflow: hidden砍掉。看看这个例子,说明如何用一点 JS 来处理这个问题。

// .chrome styling Vanilla JS


document.getElementById("myinput").oninput = function() {
var value = (this.value-this.min)/(this.max-this.min)*100
this.style.background = 'linear-gradient(to right, #82CFD0 0%, #82CFD0 ' + value + '%, #fff ' + 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" min="0" max="60" type="range" value="30" />
</div>

建立在 @ dargue3’s的答案之上,如果你想要拇指大于轨道,你想要充分利用 <input type="range" />元素和去跨浏览器,你需要一点额外的 JS 和 CSS 行。

在 Chrome/Mozilla 上,你可以使用 linear-gradient技术,但是你需要根据 minmaxvalue属性调整比率,就像 @ Attila O.提到的 给你。您需要确保不在 Edge 上应用此选项,否则将不显示拇指。@ Geoffrey Lalloué更详细地解释了这一点 给你

另一件值得一提的事情是,您需要调整 IE/Older 上的 rangeEl.style.height = "20px";。简单地说,这是因为在这种情况下“高度不适用于轨道,而是整个输入,包括拇指”。小提琴

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

如果使用 first answer ,则拇指有问题。在铬,如果你想要拇指 比赛道还要大,然后框阴影重叠轨道与拇指的高度。

只要总结所有这些答案,并写出正常工作的滑块与较大的滑块拇指: 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>

使用这个简单的 css 属性可以更改复选框、单选按钮和范围的颜色

accent-color: #F55050;

当前浏览器支持

使用 datalist时去除蜱痕。如果滑块的一般外观没问题,但是默认的蓝色(在 Chrome 中)需要适合主题颜色,那么在 input[type="range"]元素上应用一个 filter: hue-rotate();。可以使用其他过滤器。有些甚至改变滑块的背景颜色。

input[type="range"] {
filter: hue-rotate(180deg); //rotate degrees to get desired color
}
<input type="range" min="0" max="5" step="1" list="data" value="1" />
<datalist id="data">
<option>0</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
</datalist>

您可以简单地使用重音颜色(在 Chrome99中)

 <input style="accent-color: #2ecc71" type="range"/>