代码之家  ›  专栏  ›  技术社区  ›  Jack Maessen

当min-val不为0时,如何计算输入type=“range”中点之间的填充颜色

  •  0
  • Jack Maessen  · 技术社区  · 7 月前

    我正在努力计算范围价格滑块中2个点之间的填充颜色。

    范围滑块的部分html是:

     <div class="values">
        <span id="range1">0</span>
        <span> &dash; </span>
        <span id="range2">100</span>
     </div>
     <div class="container">
        <div class="slider-track"></div>
        <input type="range" min="0" max="80" value="50" id="slider-1" oninput="slideOne()">
        <input type="range" min="0" max="80" value="70" id="slider-2" oninput="slideTwo()">
      </div>
    

    JS:

    window.onload = function () {
      slideOne();
      slideTwo();
    };
    
    let sliderOne = document.getElementById("slider-1");
    let sliderTwo = document.getElementById("slider-2");
    let displayValOne = document.getElementById("range1");
    let displayValTwo = document.getElementById("range2");
    let minGap = 5;
    let sliderTrack = document.querySelector(".slider-track");
    let sliderMaxValue = document.getElementById("slider-1").max;
    
    function slideOne() {
      if (parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap) {
        sliderOne.value = parseInt(sliderTwo.value) - minGap;
      }
      displayValOne.textContent = sliderOne.value;
      fillColor();
    }
    function slideTwo() {
      if (parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap) {
        sliderTwo.value = parseInt(sliderOne.value) + minGap;
      }
      displayValTwo.textContent = sliderTwo.value;
      fillColor();
    }
    function fillColor() {
       percent1 = (sliderOne.value / sliderMaxValue) * 100;
       percent2 = (sliderTwo.value / sliderMaxValue) * 100;
       sliderTrack.style.background = `linear-gradient(to right, #dadae5 ${percent1}% , #3264fe ${percent1}% , #3264fe ${percent2}%, #dadae5 ${percent2}%)`;
    }
    

    当html中的输入值为“0”时( min="0" ),点之间的填充颜色一切正常。但是何时将两个输入都设置为 min="40" 例如 百分比1 百分比2 JS中的变量需要重新计算。否则,点之间的填充颜色将不再正确。

    那么:正确的计算方法是什么 百分比1 百分比2 在JS案例中 min="20" 最小值=“40” 在HTML输入中?

    示例1 最小值=“0” : Fiddle 1

    示例2 最小值=“40” : Fiddle 2

    2 回复  |  直到 7 月前
        1
  •  2
  •   hedfol    7 月前

    如前所述,计算应使用一系列可能的值( max - min )而不是只使用最大值( max - 0 ).

    除此之外,两个滑块必须具有相同的最小值。否则,整体外观和行为将不一致。

    window.onload = function() {
      slideOne();
      slideTwo();
    };
    
    const sliderOne = document.getElementById("slider-1");
    const sliderTwo = document.getElementById("slider-2");
    const displayValOne = document.getElementById("range1");
    const displayValTwo = document.getElementById("range2");
    const minGap = 5;
    const sliderTrack = document.querySelector(".slider-track");
    const sliderMaxValue = sliderOne.max;
    const sliderMinValue = sliderOne.min;
    const sliderValueRange = (sliderMaxValue - sliderMinValue);
    
    function slideOne() {
      if (parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap) {
        sliderOne.value = parseInt(sliderTwo.value) - minGap;
      }
      displayValOne.textContent = sliderOne.value;
      fillColor();
    }
    
    function slideTwo() {
      if (parseInt(sliderTwo.value) - parseInt(sliderOne.value) <= minGap) {
        sliderTwo.value = parseInt(sliderOne.value) + minGap;
      }
      displayValTwo.textContent = sliderTwo.value;
      fillColor();
    }
    
    function fillColor() {
      const percent1 = (sliderOne.value - sliderMinValue) / sliderValueRange * 100;
      const percent2 = (sliderTwo.value - sliderMinValue) / sliderValueRange * 100;
      sliderTrack.style.background = `linear-gradient(to right, #dadae5 ${percent1}% , #3264fe ${percent1}% , #3264fe ${percent2}%, #dadae5 ${percent2}%)`;
    }
    .container {
      position: relative;
      width: 100%;
      height: 100px;
      margin-top: 30px;
    }
    
    input[type="range"] {
      -webkit-appearance: none;
      -moz-appearance: none;
      appearance: none;
      width: 100%;
      outline: none;
      position: absolute;
      margin: auto;
      top: 0;
      bottom: 0;
      background-color: transparent;
      pointer-events: none;
    }
    
    .slider-track {
      width: 100%;
      height: 5px;
      position: absolute;
      margin: auto;
      top: 0;
      bottom: 0;
      border-radius: 5px;
    }
    
    input[type="range"]::-webkit-slider-runnable-track {
      -webkit-appearance: none;
      height: 5px;
    }
    
    input[type="range"]::-moz-range-track {
      -moz-appearance: none;
      height: 5px;
    }
    
    input[type="range"]::-ms-track {
      appearance: none;
      height: 5px;
    }
    
    input[type="range"]::-webkit-slider-thumb {
      -webkit-appearance: none;
      height: 1.7em;
      width: 1.7em;
      background-color: #3264fe;
      cursor: pointer;
      margin-top: -9px;
      pointer-events: auto;
      border-radius: 50%;
    }
    
    input[type="range"]::-moz-range-thumb {
      -webkit-appearance: none;
      height: 1.7em;
      width: 1.7em;
      cursor: pointer;
      border-radius: 50%;
      background-color: #3264fe;
      pointer-events: auto;
      border: none;
    }
    
    input[type="range"]::-ms-thumb {
      appearance: none;
      height: 1.7em;
      width: 1.7em;
      cursor: pointer;
      border-radius: 50%;
      background-color: #3264fe;
      pointer-events: auto;
    }
    
    input[type="range"]:active::-webkit-slider-thumb {
      background-color: #ffffff;
      border: 1px solid #3264fe;
    }
    
    .values {
      background-color: #3264fe;
      width: 32%;
      position: relative;
      margin: auto;
      padding: 10px 0;
      border-radius: 5px;
      text-align: center;
      font-weight: 500;
      font-size: 25px;
      color: #ffffff;
    }
    
    .values:before {
      content: "";
      position: absolute;
      height: 0;
      width: 0;
      border-top: 15px solid #3264fe;
      border-left: 15px solid transparent;
      border-right: 15px solid transparent;
      margin: auto;
      bottom: -14px;
      left: 0;
      right: 0;
    }
    <div class="values">
      <span id="range1">0</span>
      <span> &dash; </span>
      <span id="range2">100</span>
    </div>
    <div class="container">
      <div class="slider-track"></div>
      <input type="range" min="40" max="80" value="50" id="slider-1" oninput="slideOne()">
      <input type="range" min="40" max="80" value="70" id="slider-2" oninput="slideTwo()">
    </div>
        2
  •  1
  •   Phaelax z    7 月前

    如果我理解正确的话,你想在两个值之间进行互推?听起来你是在描述“线性插值”。

    newValue = valueA + (valueB - valueA) * t

    其中“t”的范围为0到1。

    因此,如果你的最小值是40,最大值是100,那么在50%(0.5)时,你会得到70。