Получить значение из range меньшего числа. JS

есть блок с 2 input и range

<div class="block">
  <div class="val__block">
    <input type="text" id="i1">
    <input type="text" id="i2">
  </div>
  <span id="min">30</span>
  <input type="range" id="r1" oninput="fun1()" min="30" max="200">
  <span id="max">200</span>
</div>

нужно в левый текстовый input выводить значение меньшего числа, в данном случае это 30. То-есть если ползунок довести до середины будет 100 в правом инпут а в левом должно быть 15

function fun1() {
     var rng = document.getElementById('r1'); 
   var i1 = document.getElementById('i1');
   var min = document.getElementById('min').textContent;
   var max = document.getElementById('max').textContent;;
   var val = rng.value;

     i1.value = val;
   var full = max - min; //100%
   var left = max - val;
   var summ = left * 100 / full; //процент
   var data = min / 100 * summ;
   i1.value = data;
   i2.value = val;
}

Вот так если делать, получаю изначально 0 а в конце 30 и если довести до середины у левого инпута будет 17.64705882352941 вместо 15, тут математически скорее всего не верно что то подставил, заранее спасибо за ответ


Ответы (1 шт):

Автор решения: Zhihar

я не совсем понял логику - у вас есть ползунок между min и max, а вот что в left и rigth должно происходить? right должен меняться от 30 до 200, а left от 0 до 30?

у вас используется какая-то дикая формула -

// дикая формула
//  var data = min * (max - val) / (max - min);

что она символизировать должна?

вот вам код, который даёт в зависимости от ползунка правому input значение от 30 (min) до 200 (max), а левому - от 0 до 30

и кстати раз уж добавили атрибуты к ползунку, так и используйте эти атрибуты, а не получайте данные из текстовых блоков - это некрасиво

function fun1() {
  let rng = document.querySelector('#r1'); 
  var i1 = document.querySelector('#i1');

  const min = rng.getAttribute('min');
  const max = rng.getAttribute('max');
  const full = max - min;

  const val = rng.value;
  const pos = (val - min) / (max - min);

  const left = min * pos;
  const right = max * pos;

  i1.value = Math.round(left);
  i2.value = Math.round(right);
}
<div class="block">
  <div class="val__block">
    <input type="text" id="i1">
    <input type="text" id="i2">
  </div>
  <span>30</span>
  <input type="range" id="r1" oninput="fun1()" min="30" max="200">
  <span>200</span>
</div>

→ Ссылка