当前位置: 首页 > 知识库问答 >
问题:

带范围滑块的自定义表单会中断,我不知道为什么

凤伟泽
2023-03-14

我正在创建一个带有两个滑块(实际上是三个)的自定义表单,因为我将两个滑块转换为一个范围滑块。
我正在使用input type=“range”

使用JS,我为自定义范围滑块添加了一些限制。

  • 代表最大值的输入值不能小于最小值

最小值和最大值的起始值分别为0和100
现在,由于某些原因,当您将最小值调整到大于100,然后将其更改回小于100时,自定义范围滑块会中断
更新:或者一旦最小值设置为8或更高-_-
最大值设置为(最小值100),而这只应在最大值小于最小值(最大值)时发生

我不明白为什么会发生这种情况,以及如何解决。

function equalizeMin(value) {
  let maxVal = document.getElementById('maxText').value;
  
  if(value > maxVal) {
    document.getElementById('maxText').value = Number(value) + 100;
    document.getElementById('maxRange').value = Number(value) + 100;
  }
  
  document.getElementById('minText').value = value;
  document.getElementById('minRange').value = value;
  
  setAvg();
}

function equalizeMax(value) {
  let minVal = document.getElementById('minText').value;
  if(value >= minVal) {
    document.getElementById('maxText').value = value;
    document.getElementById('maxRange').value = value;
  } else {
    document.getElementById('maxText').value = minVal;
    document.getElementById('maxRange').value = minVal;
  }
  setAvg();
}

function equalizeAvg(value) {
  document.getElementById('avgText').value = value;
  document.getElementById('avgRange').value = value;
}

function setAvg() {
  let _minVal = document.getElementById('minText').value;
  let _maxVal = document.getElementById('maxText').value;
  let avgVal = Number(_minVal) + Math.round((_maxVal - _minVal) / 2);
  
  document.getElementById('avgText').min = _minVal;
  document.getElementById('avgRange').min = _minVal;
  
  document.getElementById('avgText').max = _maxVal;
  document.getElementById('avgRange').max = _maxVal;
  
  document.getElementById('avgText').value = avgVal;
  document.getElementById('avgRange').value = avgVal;
}

window.onload = setAvg();  
//
* {
  box-sizing: border-box;
}

form {
  position: relative;
  width: 300px;
}
form span {
  display: inline-block;
  width: calc(50% - 2px);
}
form span label {
  display: block;
}
form span input[type="number"] {
  width: 100%;
}
form .range, form .average {
  display: block;
  padding: 1rem 0;
  width: 100%;
}
form .range input[type="range"], form .average input[type="range"] {
  -webkit-appearance: none;
  background-color: silver;
  border-radius: 4px;
  display: block;
  height: 8px;
  pointer-events: none;
  position: absolute;
  outline: none;
  width: 100%;
}
form .range input[type="range"]::-webkit-slider-thumb, form .average input[type="range"]::-webkit-slider-thumb {
  -webkit-appearance: none;
  background-color: gray;
  border-radius: 50%;
  cursor: -webkit-grab;
  cursor: -moz-grab;
  height: 20px;
  pointer-events: all;
  position: relative;
  width: 20px;
  z-index: 2;
}
form .range input[type="range"]::-webkit-slider-thumb:active, form .average input[type="range"]::-webkit-slider-thumb:active {
  cursor: -webkit-grabbing;
  cursor: -moz-grabbing;
}
form .range input[type="range"]#avgRange, form .average input[type="range"]#avgRange {
  margin: 1rem 0;
}
<form>
  <span>
    <label for="minText">Min value</label>
    <input type="number" id="minText" value="0" onchange="equalizeMin(this.value)" min="0" />
  </span>
  <span>
    <label for="maxText">Max value</label>
    <input type="number" id="maxText" value="100" onchange="equalizeMax(this.value)" min="0" />
  </span>
  <div class="range">
    <input type="range" min="0" max="1000" value="0" id="minRange" onchange="equalizeMin(this.value)">
    <input type="range" min="0" max="1000" value="100" id="maxRange" onchange="equalizeMax(this.value)">
   </div>
  <br>
  <div class="average">
    <span>
      <label for="avgText">New value</label>
      <input type="number" id="avgText" value="50" onchange="equalizeAvg(this.value)" />
    </span>
    <input type="range" min="0" max="1000" value="50" id="avgRange" onchange="equalizeAvg(this.value)" />
  </div>
</form>

共有1个答案

梅逸清
2023-03-14

我已经弄明白了!

事实证明,从范围输入中提取的值不是一个数字。在计算平均数时,我不得不将其改为一个数字,这一事实本应表明这一点,但我完全没有注意到。

实际情况是,最小值4被认为大于300。

使用Number(...)将值转换为数字解决了我的问题。

 类似资料:
  • 我有以下html: 我试图获得如下范围: 但我收到:。 我是angularJS初学者,我只是不明白为什么这不起作用。 更新:这也不起作用: 更新2:我试图在控制台中打印出作用域的所有代码:

  • 问题内容: 阅读文档时,我遇到了以下段落: 范围定义了块中名称的可见性。如果在块中定义了局部变量,则其范围将包括该块。如果定义出现在功能块中,则范围将扩展到定义块中包含的任何块,除非所包含的块为名称引入了不同的绑定。 在类块中定义的名称范围仅限于该类块。 它没有扩展到方法的代码块–这包括理解和生成器表达式,因为它们是使用函数范围实现的。 我决定尝试自己从一个方法访问类变量: 我知道可以通过显式指向

  • 我有一个960x540窗口,我正在使用OpenGL创建。在这里渲染一个纹理,并使用imgui实现一个滑块,让我在运行时翻译x、y和z位置。 首先,我设置滑块默认值。 稍后,在我的循环中,只要窗口打开,就会逐帧渲染对象的位置,我将ImGui::SliderFloat3和v\u min参数设置为窗口的尺寸。似乎所有3个滑块x、y和z都使用这些值,但是否有方法为每个滑块设置范围?正如你所看到的,我的y轴

  • 我试图使用redux-form渲染以下自定义字段组件,我也传递自定义道具到字段组件,但是它一直给我一个错误如下: 不变的js:42未捕获错误:对象作为React子对象无效(找到:具有键{renderValidation}的对象)。如果要呈现子对象集合,请改用数组。在InputField中(由ConnectedField创建)在ConnectedField中(由ConnectedField创建)在C

  • 我想自定义滑块显示的数据。例如,与其显示一个数字,不如说是“前缀”数字“后缀”,而且这个值应该始终可见。 在类VSlider我找到了方法。我怀疑这是配置滑块显示的值的地方。我尝试用相同的包结构在我自己的项目中复制这个类,我还重新编译了小部件集,但是视图中没有显示这些更改。我刚开始为Vaadin创建客户端代码,所以可能有一些我不理解的地方。 问题: 你对我如何实现我的目标有什么建议吗? 您知道为什么

  • 我正在尝试定制一个范围滑块根据我的需要我几乎在那里除了它的方向,目前它是水平对齐的,应该是垂直的。 我尝试添加和以及 不走运。 当前代码库如下:Style 标记 是不是我漏了什么?如有任何帮助,我们将不胜感激。谢谢