javascript - 输入类型范围样式和显示值问题
问题描述
目前我正在开发 React BMI 计算器应用程序,但输入类型范围元素有问题。我之前遇到过一些问题,但我在这里或谷歌上找到了帮助。一切正常,直到我更改了最小值和最大值以使应用程序更有意义。
如果min设置为 1 并且max设置为 100 一切正常。
如您所见,滑块拇指上方的气泡中显示数字,并且滑块轨道选定部分的白色背景效果也可以正常工作。我能够移动滑块拇指,白色背景正在工作,并且气泡始终位于滑块拇指上方。
当我尝试将这些最小值和最大值切换为更真实的东西时,就会出现问题。
例如 :
- 高度 - 最小:150,最大:220
- 重量 - 最小:50,最大:250
在这种情况下,我的整个应用程序都崩溃了,这就是结果。我不明白为什么,白色背景效果停止正常工作,滑块拇指一直向左,如果我尝试移动它们,气泡将显示在滑块拇指上方。
拜托,有人可以帮我吗?我整天都在为此苦苦挣扎。所有方法(如何设置输入类型范围的样式/如何更改输入类型范围的颜色/如何在其上方制作气泡,甚至如何制作白色背景选择效果)我在这里或谷歌上找到了,所以可能有一些代码中的错误,因为我从未尝试过设置样式或使用这些输入。
感谢您的每一个帮助。这是codesandbox的链接:https ://codesandbox.io/s/suspicious-tereshkova-ujk45?file=/src/index.css
解决方案
我试图通过修改您的代码来完成所需的操作。
这是代码,您需要修改 Range.js 文件如下,
import React, { useEffect } from "react";
function Range(props) {
useEffect(() => {
const range = document.getElementById("range");
const rangeV = document.getElementById("rangeV");
const range2 = document.getElementById("range2");
const rangeV2 = document.getElementById("rangeV2");
const setValue = () => {
const newValue = Number(
((range.value - range.min) * 100) / (range.max - range.min)
);
const newPosition = 10 - newValue * 0.2;
rangeV.innerHTML = `<span>${range.value} cm</span>`;
rangeV.style.left = `calc(${newValue}% + (${newPosition}px))`;
const newValue2 = Number(
((range2.value - range2.min) * 100) / (range2.max - range2.min)
);
const newPosition2 = 10 - newValue2 * 0.2;
rangeV2.innerHTML = `<span>${range2.value} kg</span>`;
rangeV2.style.left = `calc(${newValue2}% + (${newPosition2}px))`;
};
document.addEventListener("DOMContentLoaded", setValue);
range.addEventListener("input", setValue);
range2.addEventListener("input", setValue);
// setting default value of both the inputs
document.getElementById('range').value = 185;
document.getElementById('range2').value = 150;
}, []);
//Selected value effect
function selectedEffectHeight(e) {
const val = (e.target.value - 150)*1.42;
e.target.style.background =
"linear-gradient(to right, #fff 0%, #fff " +
val +
"%, #f0959a " +
val +
"%, #f0959a 100%)";
}
function selectedEffectWeight(e) {
const val = (e.target.value - 50)*0.5;
e.target.style.background =
"linear-gradient(to right, #fff 0%, #fff " +
val +
"%, #f0959a " +
val +
"%, #f0959a 100%)";
}
return (
<div className="range">
<p className="heading">HEIGHT</p>
<div className="range-wrap">
<div className="range-value" id="rangeV">
<span>{props.Height} cm</span>
</div>
<input
type="range"
id="range"
min="150"
max="220"
onInput={selectedEffectHeight}
onChange={props.getHeight}
></input>
</div>
<p className="heading">WEIGHT</p>
<div className="range-wrap">
<div className="range-value" id="rangeV2">
<span>{props.Weight} kg</span>
</div>
<input
type="range"
id="range2"
min="50"
max="250"
onInput={selectedEffectWeight}
onChange={props.getWeight}
></input>
</div>
</div>
);
}
export default Range;
推荐阅读
- reactjs - 如何从我的资产文件夹中动态导入图像?
- sharepoint - 基于 Sharepoint 列表中的第三列的查找值
- reactjs - 如何显示来自 React-Query 的单个缓存数据?
- python - 使用 selenium、bs4 或请求从交互式图表中抓取数据
- azure - Docker:“在 Azure 上部署 Docker 容器”说明
- pine-script - Pinescript 条件线绘图
- pandas - 如何更改 cartopy 地图中颜色条的类型?
- python - 如何通过使用 Python 对特定列进行分组来求和?
- c# - 如何在新的 MSTests 中运行测试序列?
- python - 为什么使用后向差分编码时会丢失列?