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?
是的,有可能。虽然我不会推荐它,因为 input range并没有得到所有浏览器的正确支持,因为它是在 HTML5中添加的一个新元素,而 HTML5只是一个草案(并且会持续很长时间) ,所以它的样式可能并不是最好的选择。
input range
另外,您还需要一些 JavaScript。为了简单起见,我擅自使用了 JQuery库。
给你 http://jsfiddle.net/JnrvG/1/。
现在 WebKit、 Firefox 和 IE 都支持伪元素。但是,当然,每一个都是不同的。: (
有关一些解决方案,请参阅 这个问题的答案和/或搜索名为 prettify <input type=range> #101的 CodePen。
prettify <input type=range> #101
这里有一个小小的更新:
如果您使用以下命令,它将在动态更新,而不是在鼠标释放。
“更改鼠标移动”,功能
<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 解决方案:
input[range]
::-ms-fill-lower
::-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,所以他们可以迅速修改。
range
input type="range" min="0" max="50" value="0" style="margin-left: 6%;width: 88%;background-color: whitesmoke;"
以上代码更改范围输入样式... ..。
虽然公认的答案在理论上是好的,但它忽略了一个事实,那就是拇指不能大于轨道的大小而不被 overflow: hidden砍掉。看看这个例子,说明如何用一点 JS 来处理这个问题。
overflow: hidden
// .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 行。
<input type="range" />
在 Chrome/Mozilla 上,你可以使用 linear-gradient技术,但是你需要根据 min,max,value属性调整比率,就像 @ Attila O.提到的 给你。您需要确保不在 Edge 上应用此选项,否则将不显示拇指。@ Geoffrey Lalloué更详细地解释了这一点 给你。
linear-gradient
min
max
value
另一件值得一提的事情是,您需要调整 IE/Older 上的 rangeEl.style.height = "20px";。简单地说,这是因为在这种情况下“高度不适用于轨道,而是整个输入,包括拇指”。小提琴
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();。可以使用其他过滤器。有些甚至改变滑块的背景颜色。
datalist
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"/>