Несколько HTML Входные теги типа range, которые всегда складываются до определенного значения c? - PullRequest
0 голосов
/ 22 февраля 2020

Я хотел бы иметь несколько HTML входных тегов типа range, которые всегда складываются до определенного значения c. Вот мой текущий код:

<label>Slider 1
    <input max="1.0" min="-1.0" step="0.05" type="range" value="1.0">
</label>
<label>Slider 2
    <input max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>
<label>Slider 3
    <input max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>
<label>Slider 4
    <input max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>

Я хотел бы иметь его, чтобы, если один ползунок перемещался, остальные корректировались так, чтобы подсчет / сумма всегда равнялся 1. Я не возражаю против использования JavaScript (однако было бы предпочтительнее этого не делать), но я не хочу использовать jQuery, jQuery -UI или другие внешние библиотеки, о которых этот аналогичный вопрос задает: Общая сумма для нескольких jQuery - Ползунки пользовательского интерфейса

1 Ответ

1 голос
/ 22 февраля 2020

мы будем использовать обычный JS, чтобы сделать эту работу. Первое, что вы хотите добавить - это атрибут onchange для ваших ползунков, чтобы он вызывал данную функцию, которая будет обновлять другие ползунки. Мы должны дать этой функции индекс слайдера, который мы только что изменили. Давайте дадим индексам ползунков от 0 до 3. Укажите им идентификатор, чтобы мы могли изменить их в скрипте JS. Давайте назовем функцию change().

Итак, давайте напишем функцию сейчас. Что мы хотим сделать, это изменить значение других ползунков. Начальная сумма равна единице, поэтому давайте сохраним это значение навсегда. Нам нужно сохранить значения в массиве, чтобы мы могли увидеть, что это за изменение. Поэтому, когда ползунок был изменен, вычислите дельту между новым значением и старым. Как только вы узнаете, как изменение повлияло на общую сумму, давайте изменим другие ползунки благодаря только что вычисленной дельте. Поскольку есть 3 ползунка, которые мы можем изменить, добавьте их третью дельту к каждому ползунку. Таким образом, изменение, внесенное на одном слайдере, будет «отменено» в общей сумме, поэтому мы сохраняем исходное значение, равное 1.

Вот как теперь должен выглядеть ваш код:

let values = [1, 0, 0, 0]; // The initial values

  /* The onchange attribute will trigger this function */
  function change(x) {

    let newValue = document.getElementById(String(x)).value * 1; // Find the new value
    let oldValue = values[x]; // Search for the old value
    
    values[x] = newValue; // Update in the array the new value
    let deltaValue = oldValue - newValue; // Calculate the difference between the old value and the new one

    /* Now, loop through all the buttons to update them */
    for(let i = 0; i < 4; i++) {
      if(i === x) continue; // If it's the same, so do not change a thing
      
      /* This is the new value we want to put in
       * We want to equilibrate the whole system
       * Means we have to update the 3 other sliders
       * So just add to each one of them the third of the difference created by the one changed
       */
      
      let newVal = document.getElementById(String(i)).value * 1 + deltaValue / 3; // * 1 is to convert the value into an number, we do not want a String
      document.getElementById(String(i)).value = newVal; // Put the new value in
      values[i] += deltaValue / 3; // And update that value in the array
    }
  }
<label>Slider 1
    <input onchange="change(0)" id="0" max="1.0" min="-1.0" step="0.05" type="range" value="1.0">
</label>
<label>Slider 2
    <input onchange="change(1)" id="1" max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>
<label>Slider 3
    <input onchange="change(2)" id="2" max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>
<label>Slider 4
    <input onchange="change(3)" id="3" max="1.0" min="-1.0" step="0.05" type="range" value="0.0">
</label>

Я почти уверен, что можно провести много оптимизаций, но, поскольку я не являюсь JS экспертом, он это сделает!

Надеюсь, это помогло вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...