HTML5:滑块有两个输入吗?

fre*_*ent 90 forms html5 slider

是否可以制作具有两个输入值的HTML5滑块,例如选择价格范围?如果是这样,怎么办呢?

Gar*_*ary 71

我一直在寻找一个轻量级,无依赖关系的双滑块(为此导入jQuery似乎很疯狂)并且似乎没有很多.我最终修改了@ Wildhoney的代码并且非常喜欢它.

function getVals(){
  // Get slider values
  var parent = this.parentNode;
  var slides = parent.getElementsByTagName("input");
    var slide1 = parseFloat( slides[0].value );
    var slide2 = parseFloat( slides[1].value );
  // Neither slider will clip the other, so make sure we determine which is larger
  if( slide1 > slide2 ){ var tmp = slide2; slide2 = slide1; slide1 = tmp; }
  
  var displayElement = parent.getElementsByClassName("rangeValues")[0];
      displayElement.innerHTML = slide1 + " - " + slide2;
}

window.onload = function(){
  // Initialize Sliders
  var sliderSections = document.getElementsByClassName("range-slider");
      for( var x = 0; x < sliderSections.length; x++ ){
        var sliders = sliderSections[x].getElementsByTagName("input");
        for( var y = 0; y < sliders.length; y++ ){
          if( sliders[y].type ==="range" ){
            sliders[y].oninput = getVals;
            // Manually trigger event first time to display values
            sliders[y].oninput();
          }
        }
      }
}
Run Code Online (Sandbox Code Playgroud)
  section.range-slider {
    position: relative;
    width: 200px;
    height: 35px;
    text-align: center;
}

section.range-slider input {
    pointer-events: none;
    position: absolute;
    overflow: hidden;
    left: 0;
    top: 15px;
    width: 200px;
    outline: none;
    height: 18px;
    margin: 0;
    padding: 0;
}

section.range-slider input::-webkit-slider-thumb {
    pointer-events: all;
    position: relative;
    z-index: 1;
    outline: 0;
}

section.range-slider input::-moz-range-thumb {
    pointer-events: all;
    position: relative;
    z-index: 10;
    -moz-appearance: none;
    width: 9px;
}

section.range-slider input::-moz-range-track {
    position: relative;
    z-index: -1;
    background-color: rgba(0, 0, 0, 1);
    border: 0;
}
section.range-slider input:last-of-type::-moz-range-track {
    -moz-appearance: none;
    background: none transparent;
    border: 0;
}
  section.range-slider input[type=range]::-moz-focus-outer {
  border: 0;
}
Run Code Online (Sandbox Code Playgroud)
<!-- This block can be reused as many times as needed -->
<section class="range-slider">
  <span class="rangeValues"></span>
  <input value="5" min="0" max="15" step="0.5" type="range">
  <input value="10" min="0" max="15" step="0.5" type="range">
</section>
Run Code Online (Sandbox Code Playgroud)

  • 我非常喜欢你的方法,并尝试将其调整到我的用例,但是当我意识到我的一些设计规范时(例如,将该范围的"活动"部分着色与其他轨道不同),我不得不放弃它)不可能用这个来实现.所以我寻找另一个解决方案,发现这个非常简洁的项目:http://refreshless.com/nouislider/它是无依赖性的,有一个漂亮而干净的API,与AMD兼容,并提供了很多选项.到目前为止,我对它很满意. (10认同)

Mar*_*erl 61

不,HTML5范围输入只接受一个输入.我建议你使用像jQuery UI范围滑块这样的任务.

  • 前段时间......但我设法通过将两个滑块准确地放在彼此的顶部来"伪造"双滑块.一个从最小值开始,另一个从最大值开始.我猜这是作弊但是...它对我有用. (28认同)
  • 我喜欢ionRangeSlider比我自己的jQuery UI滑块好一点:http://ionden.com/a/plugins/ion.rangeSlider/en.html (7认同)
  • 另一种方法是使用并排输入控件“伪造”双滑块:http://www.simple.gy/blog/range-slider-two-handles/ (5认同)

dar*_*mos 29

迟到了,但noUiSlider避免了jQuery-ui依赖,接受的答案却没有.它唯一的"警告"是IE支持适用于IE9及更新版本,如果遗留IE对你来说是一个交易破坏者.

它也是免费的,开源的,可以无限制地用于商业项目.

安装:下载noUiSlider,在站点文件系统中的某处解压缩CSS和JS文件,然后从头部链接到CSS并从正文链接到JS:

<!-- In <head> -->
<link href="nouislider.min.css" rel="stylesheet">

<!-- In <body> -->
<script src="nouislider.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

用法示例:创建一个从0到100的滑块,并开始设置为20-80.

HTML:

<div id="slider">
</div>
Run Code Online (Sandbox Code Playgroud)

JS:

var slider = document.getElementById('slider');

noUiSlider.create(slider, {
    start: [20, 80],
    connect: true,
    range: {
        'min': 0,
        'max': 100
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 我没有深入研究它,但是我可以在键盘上使用滑块,所以我认为它现在已经实现了@ptrin :) (3认同)
  • 哇,太棒了!这正是我们所需要的,而且它的开发非常出色!没有 jQuery (2认同)

use*_*132 21

当然你可以简单地使用两个相互重叠的滑块,并添加一些javascript(实际上不超过5行),选择器不超过最小/最大值(如@Garys)解决方案.

附上你会找到一个改编自当前项目的简短片段,包括一些CSS3样式,以显示你可以做什么(仅限webkit).我还添加了一些标签来显示所选的值.

它使用JQuery,但vanillajs版本并不神奇.

    (function() {

        function addSeparator(nStr) {
            nStr += '';
            var x = nStr.split('.');
            var x1 = x[0];
            var x2 = x.length > 1 ? '.' + x[1] : '';
            var rgx = /(\d+)(\d{3})/;
            while (rgx.test(x1)) {
                x1 = x1.replace(rgx, '$1' + '.' + '$2');
            }
            return x1 + x2;
        }

        function rangeInputChangeEventHandler(e){
            var rangeGroup = $(this).attr('name'),
                minBtn = $(this).parent().children('.min'),
                maxBtn = $(this).parent().children('.max'),
                range_min = $(this).parent().children('.range_min'),
                range_max = $(this).parent().children('.range_max'),
                minVal = parseInt($(minBtn).val()),
                maxVal = parseInt($(maxBtn).val()),
                origin = $(this).context.className;

            if(origin === 'min' && minVal > maxVal-5){
                $(minBtn).val(maxVal-5);
            }
            var minVal = parseInt($(minBtn).val());
            $(range_min).html(addSeparator(minVal*1000) + ' €');


            if(origin === 'max' && maxVal-5 < minVal){
                $(maxBtn).val(5+ minVal);
            }
            var maxVal = parseInt($(maxBtn).val());
            $(range_max).html(addSeparator(maxVal*1000) + ' €');
        }

     $('input[type="range"]').on( 'input', rangeInputChangeEventHandler);
})();
Run Code Online (Sandbox Code Playgroud)
body{
font-family: sans-serif;
font-size:14px;
}
input[type='range'] {
  width: 210px;
  height: 30px;
  overflow: hidden;
  cursor: pointer;
    outline: none;
}
input[type='range'],
input[type='range']::-webkit-slider-runnable-track,
input[type='range']::-webkit-slider-thumb {
  -webkit-appearance: none;
    background: none;
}
input[type='range']::-webkit-slider-runnable-track {
  width: 200px;
  height: 1px;
  background: #003D7C;
}

input[type='range']:nth-child(2)::-webkit-slider-runnable-track{
  background: none;
}

input[type='range']::-webkit-slider-thumb {
  position: relative;
  height: 15px;
  width: 15px;
  margin-top: -7px;
  background: #fff;
  border: 1px solid #003D7C;
  border-radius: 25px;
  z-index: 1;
}


input[type='range']:nth-child(1)::-webkit-slider-thumb{
  z-index: 2;
}

.rangeslider{
    position: relative;
    height: 60px;
    width: 210px;
    display: inline-block;
    margin-top: -5px;
    margin-left: 20px;
}
.rangeslider input{
    position: absolute;
}
.rangeslider{
    position: absolute;
}

.rangeslider span{
    position: absolute;
    margin-top: 30px;
    left: 0;
}

.rangeslider .right{
   position: relative;
   float: right;
   margin-right: -5px;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="rangeslider">
                                <input class="min" name="range_1" type="range" min="1" max="100" value="10" />
                                <input class="max" name="range_1" type="range" min="1" max="100" value="90" />
                                <span class="range_min light left">10.000 €</span>
                                <span class="range_max light right">90.000 €</span>
                            </div>
Run Code Online (Sandbox Code Playgroud)

  • 嘿看起来很棒!但它在Firefox中不起作用,你只能拖动最大输入.你有设法解决它吗? (7认同)
  • 天啊。我来这里添加几乎完全相同的东西!http://www.simple.gy/blog/range-slider-two-handles/我的版本将输入并排放置,但也使用双重输入。 (4认同)
  • 你好呀!我发现这很有用,并希望将来为其他人的阅读做出贡献。从 jQuery 3.0 开始,这不再有效。“origin = $(this).context.className;”行应更改为“origin = e.originalEvent.target.className;”或等效行。`.context` 功能在 1.10 中已弃用,并在 3.0 中删除 (3认同)
  • 不错,我不得不更改一些设置,但总体不错+1 (2认同)

max*_*uty 21

2023 年 - 无障碍解决方案 - 30 秒即可实施解决方案

我为此创建了一个简单的库,或者您可以自己应用此答案中的代码

这个解决方案建立在@Mr.的这个答案的基础上。雨果. 可访问性是所有答案都没有关注的问题,这是一个问题,因此我通过使其更易于访问和扩展来构建上述答案,因为它有一些缺陷。

用法非常简单:

  1. 使用CDN或在本地托管脚本:https://cdn.jsdelivr.net/gh/maxshuty/accessible-web-components/dist/simpleRange.min.js
  2. 将此元素添加到您的模板或 HTML 中:<range-selector min-range="0" max-range="1000" />
  3. range-changed通过侦听事件(或event-name-to-emit-on-change您传入的任何内容)来挂钩它

就是这样。在这里查看完整的演示。您只需应用属性即可轻松自定义它,例如inputs-for-labels使用输入而不是标签、slider-color调整颜色等等!

这是一个小提琴:

window.addEventListener('range-changed', (e) => {console.log(`Range changed for: ${e.detail.sliderId}. Min/Max range values are available in this object too`)})
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdn.jsdelivr.net/gh/maxshuty/accessible-web-components@latest/dist/simpleRange.min.js"></script>

<div>
  <range-selector
    id="rangeSelector1"
    min-label="Minimum"
    max-label="Maximum"
    min-range="1000"
    max-range="2022"
    number-of-legend-items-to-show="6"
  />
</div>

<div>
  <range-selector
    id="rangeSelector1"
    min-label="Minimum"
    max-label="Maximum"
    min-range="1"
    max-range="500"
    number-of-legend-items-to-show="3"
    inputs-for-labels
  />
</div>

<div>
  <range-selector
    id="rangeSelector2"
    min-label="Minimum"
    max-label="Maximum"
    min-range="1000"
    max-range="2022"
    number-of-legend-items-to-show="3"
    slider-color="#6b5b95"
  />
</div>

<div>
  <range-selector
    id="rangeSelector3"
    min-label="Minimum"
    max-label="Maximum"
    min-range="1000"
    max-range="2022"
    hide-label
    hide-legend
  />
</div>
Run Code Online (Sandbox Code Playgroud)

我决定解决链接答案的问题,例如使用标签display: none(对 a11y 不利)、滑块上没有视觉焦点等,并通过清理事件侦听器并使其更加动态和可扩展来改进代码。

我创建了这个小型库,其中包含许多选项来自定义颜色、事件名称、轻松连接到它、使可访问标签具有国际化功能等等。如果你想玩的话,这里就很麻烦了。

您可以轻松自定义它显示的图例项目的数量,隐藏或显示标签和图例,并自定义所有内容的颜色,包括像这样的焦点颜色。

使用几个道具的示例:

<range-selector
  min-label="i18n Minimum Range"
  max-label="i18n Maximum Range"
  min-range="5"
  max-range="555"
  number-of-legend-items-to-show="6"
  event-name-to-emit-on-change="my-custom-range-changed-event"
  slider-color="orange"
  circle-color="#f7cac9"
  circle-border-color="#083535"
  circle-focus-border-color="#3ec400"
/>
Run Code Online (Sandbox Code Playgroud)

然后在你的脚本中:

window.addEventListener('my-custom-range-changed-event', (e) => { const data = e.detail; });
Run Code Online (Sandbox Code Playgroud)

最后,如果您发现缺少您需要的东西,我可以非常轻松地自定义该库。

只需复制此文件,您就可以在顶部看到cssHelpers包含constants您可能想要进一步自定义的大部分变量的对象。

自从我使用本机 Web 组件构建此组件以来,我利用了disconnectedCallback其他钩子来清理事件侦听器并进行设置。


Him*_*ndu 19

实际上我直接在 html 中使用了我的脚本。但是在 javascript 中,当您为此事件添加 oninput 事件侦听器时,它会自动提供数据。您只需要根据您的要求分配值。

[slider] {
  width: 300px;
  position: relative;
  height: 5px;
  margin: 45px 0 10px 0;
}

[slider] > div {
  position: absolute;
  left: 13px;
  right: 15px;
  height: 5px;
}
[slider] > div > [inverse-left] {
  position: absolute;
  left: 0;
  height: 5px;
  border-radius: 10px;
  background-color: #CCC;
  margin: 0 7px;
}

[slider] > div > [inverse-right] {
  position: absolute;
  right: 0;
  height: 5px;
  border-radius: 10px;
  background-color: #CCC;
  margin: 0 7px;
}


[slider] > div > [range] {
  position: absolute;
  left: 0;
  height: 5px;
  border-radius: 14px;
  background-color: #d02128;
}

[slider] > div > [thumb] {
  position: absolute;
  top: -7px;
  z-index: 2;
  height: 20px;
  width: 20px;
  text-align: left;
  margin-left: -11px;
  cursor: pointer;
  box-shadow: 0 3px 8px rgba(0, 0, 0, 0.4);
  background-color: #FFF;
  border-radius: 50%;
  outline: none;
}

[slider] > input[type=range] {
  position: absolute;
  pointer-events: none;
  -webkit-appearance: none;
  z-index: 3;
  height: 14px;
  top: -2px;
  width: 100%;
  opacity: 0;
}

div[slider] > input[type=range]:focus::-webkit-slider-runnable-track {
  background: transparent;
  border: transparent;
}

div[slider] > input[type=range]:focus {
  outline: none;
}

div[slider] > input[type=range]::-webkit-slider-thumb {
  pointer-events: all;
  width: 28px;
  height: 28px;
  border-radius: 0px;
  border: 0 none;
  background: red;
  -webkit-appearance: none;
}

div[slider] > input[type=range]::-ms-fill-lower {
  background: transparent;
  border: 0 none;
}

div[slider] > input[type=range]::-ms-fill-upper {
  background: transparent;
  border: 0 none;
}

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

[slider] > div > [sign] {
  opacity: 0;
  position: absolute;
  margin-left: -11px;
  top: -39px;
  z-index:3;
  background-color: #d02128;
  color: #fff;
  width: 28px;
  height: 28px;
  border-radius: 28px;
  -webkit-border-radius: 28px;
  align-items: center;
  -webkit-justify-content: center;
  justify-content: center;
  text-align: center;
}

[slider] > div > [sign]:after {
  position: absolute;
  content: '';
  left: 0;
  border-radius: 16px;
  top: 19px;
  border-left: 14px solid transparent;
  border-right: 14px solid transparent;
  border-top-width: 16px;
  border-top-style: solid;
  border-top-color: #d02128;
}

[slider] > div > [sign] > span {
  font-size: 12px;
  font-weight: 700;
  line-height: 28px;
}

[slider]:hover > div > [sign] {
  opacity: 1;
}
Run Code Online (Sandbox Code Playgroud)
<div slider id="slider-distance">
  <div>
    <div inverse-left style="width:70%;"></div>
    <div inverse-right style="width:70%;"></div>
    <div range style="left:0%;right:0%;"></div>
    <span thumb style="left:0%;"></span>
    <span thumb style="left:100%;"></span>
    <div sign style="left:0%;">
      <span id="value">0</span>
    </div>
    <div sign style="left:100%;">
      <span id="value">100</span>
    </div>
  </div>
  <input type="range" value="0" max="100" min="0" step="1" oninput="
  this.value=Math.min(this.value,this.parentNode.childNodes[5].value-1);
  let value = (this.value/parseInt(this.max))*100
  var children = this.parentNode.childNodes[1].childNodes;
  children[1].style.width=value+'%';
  children[5].style.left=value+'%';
  children[7].style.left=value+'%';children[11].style.left=value+'%';
  children[11].childNodes[1].innerHTML=this.value;" />

  <input type="range" value="100" max="100" min="0" step="1" oninput="
  this.value=Math.max(this.value,this.parentNode.childNodes[3].value-(-1));
  let value = (this.value/parseInt(this.max))*100
  var children = this.parentNode.childNodes[1].childNodes;
  children[3].style.width=(100-value)+'%';
  children[5].style.right=(100-value)+'%';
  children[9].style.left=value+'%';children[13].style.left=value+'%';
  children[13].childNodes[1].innerHTML=this.value;" />
</div>
Run Code Online (Sandbox Code Playgroud)


Joo*_*stS 10

问题是:“是否可以制作一个带有两个输入值的 HTML5 滑块,例如选择一个价格范围?如果可以,怎么做?”

在 2020 年,可以创建一个完全可访问的、原生的、非 jquery HTML5 滑块,其中包含两个用于价格范围的拇指。如果在我已经创建了这个解决方案之后发现这个帖子,我认为在这里分享我的实现会很好。

此实现已在移动 Chrome 和 Firefox (Android) 以及 Chrome 和 Firefox (Linux) 上进行了测试。我不确定其他平台,但它应该是相当不错的。我很想得到您的反馈并改进此解决方案。

此解决方案允许在一个页面上有多个实例,并且它只包含两个输入(每个)以及屏幕阅读器的描述性标签。您可以在网格标签的数量中设置拇指大小。此外,您可以使用触摸、键盘和鼠标与滑块进行交互。由于 'on input' 事件侦听器,该值在调整期间更新。

我的第一种方法是覆盖滑块并剪辑它们。然而,这导致了具有大量浏览器依赖性的复杂代码。然后我用两个“内联”滑块重新创建了解决方案。这是您将在下面找到的解决方案。

var thumbsize = 14;

function draw(slider,splitvalue) {

    /* set function vars */
    var min = slider.querySelector('.min');
    var max = slider.querySelector('.max');
    var lower = slider.querySelector('.lower');
    var upper = slider.querySelector('.upper');
    var legend = slider.querySelector('.legend');
    var thumbsize = parseInt(slider.getAttribute('data-thumbsize'));
    var rangewidth = parseInt(slider.getAttribute('data-rangewidth'));
    var rangemin = parseInt(slider.getAttribute('data-rangemin'));
    var rangemax = parseInt(slider.getAttribute('data-rangemax'));

    /* set min and max attributes */
    min.setAttribute('max',splitvalue);
    max.setAttribute('min',splitvalue);

    /* set css */
    min.style.width = parseInt(thumbsize + ((splitvalue - rangemin)/(rangemax - rangemin))*(rangewidth - (2*thumbsize)))+'px';
    max.style.width = parseInt(thumbsize + ((rangemax - splitvalue)/(rangemax - rangemin))*(rangewidth - (2*thumbsize)))+'px';
    min.style.left = '0px';
    max.style.left = parseInt(min.style.width)+'px';
    min.style.top = lower.offsetHeight+'px';
    max.style.top = lower.offsetHeight+'px';
    legend.style.marginTop = min.offsetHeight+'px';
    slider.style.height = (lower.offsetHeight + min.offsetHeight + legend.offsetHeight)+'px';
    
    /* correct for 1 off at the end */
    if(max.value>(rangemax - 1)) max.setAttribute('data-value',rangemax);

    /* write value and labels */
    max.value = max.getAttribute('data-value'); 
    min.value = min.getAttribute('data-value');
    lower.innerHTML = min.getAttribute('data-value');
    upper.innerHTML = max.getAttribute('data-value');

}

function init(slider) {
    /* set function vars */
    var min = slider.querySelector('.min');
    var max = slider.querySelector('.max');
    var rangemin = parseInt(min.getAttribute('min'));
    var rangemax = parseInt(max.getAttribute('max'));
    var avgvalue = (rangemin + rangemax)/2;
    var legendnum = slider.getAttribute('data-legendnum');

    /* set data-values */
    min.setAttribute('data-value',rangemin);
    max.setAttribute('data-value',rangemax);
    
    /* set data vars */
    slider.setAttribute('data-rangemin',rangemin); 
    slider.setAttribute('data-rangemax',rangemax); 
    slider.setAttribute('data-thumbsize',thumbsize); 
    slider.setAttribute('data-rangewidth',slider.offsetWidth);

    /* write labels */
    var lower = document.createElement('span');
    var upper = document.createElement('span');
    lower.classList.add('lower','value');
    upper.classList.add('upper','value');
    lower.appendChild(document.createTextNode(rangemin));
    upper.appendChild(document.createTextNode(rangemax));
    slider.insertBefore(lower,min.previousElementSibling);
    slider.insertBefore(upper,min.previousElementSibling);
    
    /* write legend */
    var legend = document.createElement('div');
    legend.classList.add('legend');
    var legendvalues = [];
    for (var i = 0; i < legendnum; i++) {
        legendvalues[i] = document.createElement('div');
        var val = Math.round(rangemin+(i/(legendnum-1))*(rangemax - rangemin));
        legendvalues[i].appendChild(document.createTextNode(val));
        legend.appendChild(legendvalues[i]);

    } 
    slider.appendChild(legend);

    /* draw */
    draw(slider,avgvalue);

    /* events */
    min.addEventListener("input", function() {update(min);});
    max.addEventListener("input", function() {update(max);});
}

function update(el){
    /* set function vars */
    var slider = el.parentElement;
    var min = slider.querySelector('#min');
    var max = slider.querySelector('#max');
    var minvalue = Math.floor(min.value);
    var maxvalue = Math.floor(max.value);
    
    /* set inactive values before draw */
    min.setAttribute('data-value',minvalue);
    max.setAttribute('data-value',maxvalue);

    var avgvalue = (minvalue + maxvalue)/2;

    /* draw */
    draw(slider,avgvalue);
}

var sliders = document.querySelectorAll('.min-max-slider');
sliders.forEach( function(slider) {
    init(slider);
});
Run Code Online (Sandbox Code Playgroud)
* {padding: 0; margin: 0;}
body {padding: 40px;}

.min-max-slider {position: relative; width: 200px; text-align: center; margin-bottom: 50px;}
.min-max-slider > label {display: none;}
span.value {height: 1.7em; font-weight: bold; display: inline-block;}
span.value.lower::before {content: "€"; display: inline-block;}
span.value.upper::before {content: "- €"; display: inline-block; margin-left: 0.4em;}
.min-max-slider > .legend {display: flex; justify-content: space-between;}
.min-max-slider > .legend > * {font-size: small; opacity: 0.25;}
.min-max-slider > input {cursor: pointer; position: absolute;}

/* webkit specific styling */
.min-max-slider > input {
  -webkit-appearance: none;
  outline: none!important;
  background: transparent;
  background-image: linear-gradient(to bottom, transparent 0%, transparent 30%, silver 30%, silver 60%, transparent 60%, transparent 100%);
}
.min-max-slider > input::-webkit-slider-thumb {
  -webkit-appearance: none; /* Override default look */
  appearance: none;
  width: 14px; /* Set a specific slider handle width */
  height: 14px; /* Slider handle height */
  background: #eee; /* Green background */
  cursor: pointer; /* Cursor on hover */
  border: 1px solid gray;
  border-radius: 100%;
}
.min-max-slider > input::-webkit-slider-runnable-track {cursor: pointer;}
Run Code Online (Sandbox Code Playgroud)
<div class="min-max-slider" data-legendnum="2">
    <label for="min">Minimum price</label>
    <input id="min" class="min" name="min" type="range" step="1" min="0" max="3000" />
    <label for="max">Maximum price</label>
    <input id="max" class="max" name="max" type="range" step="1" min="0" max="3000" />
</div>
Run Code Online (Sandbox Code Playgroud)

请注意,您应该将步长保持为 1,以防止由于重绘/重绘错误而更改值。

在线查看:https : //codepen.io/joosts/pen/rNLdxvK

  • 这是一个聪明的代码,但我不会说“时代已经改变”,这仍然使用两个滑块,并且仍然添加 JS 和 Css 来克服标准的缺点。在我看来,“更改时间”将是: &lt;input type="range" min="0" max="10" range&gt; 支持多值输入元素。或者其他的东西。 (6认同)