如何用JS和CSS对HR标签(横线)做动态效果?

How can I make a dynamic effects on HR tag(horizontal line) with JS and CSS?

我想用 CSS & JSHR HTML 元素制作动态效果:我的想法是像这样水平制作 4 条线:
并通过添加 类型范围 的输入并根据 输入的值使它们 在宽度上增长和收缩 使其动态化范围!
到目前为止我尝试了什么:

document
  .querySelector('input[type="range"]')
  .addEventListener("input", (e) => {
    document.querySelectorAll(".line").forEach((line) => {
      line.style.width = line.offsetWidth + 10 + "px";
      const marginOnLeft = window
        .getComputedStyle(line)
        .getPropertyValue("margin-left")
        .slice(0, -2); //remove "px"
      line.style.marginLeft =
        Number(marginOnLeft) + 100 / Number(marginOnLeft) + "px";
    });
  });
.lines {
  position: relative;
}
.line {
  position: absolute;
}
hr {
  background-color: black;
  border-radius: 5px;
}
.line1 {
  width: 500px;
  height: 3px;
  margin-left: 0;
  margin-top: 5px;
}
.line2 {
  width: 400px;
  height: 6px;
  margin-left: 50;
  margin-top: 5px;
}
.line3 {
  width: 300px;
  height: 8px;
  margin-left: 100;
  margin-top: 5px;
}
.line4 {
  width: 200px;
  height: 10px;
  margin-left: 150;
}
input[type="range"] {
  margin-top: 70px;
}
<div class="lines">
  <hr class="line line1" />
  <hr class="line line2" />
  <hr class="line line3" />
  <hr class="line line4" />
</div>
<div>
  <input type="range" name="" id="" value="10" />
</div>

如果用户的 input range 增加或减少,我该如何跟踪;根据其值所有水平线 将在宽度处动态变宽或变窄!更重要的是,我会 margin-left 也会根据 input range value 动态地 增加或减少 ,我做得对还是可能使用 CSS variables;欢迎提出任何建议,我们将不胜感激!

做一些小改动-

  var oldValue = 10;
document
  .querySelector('input[type="range"]')
  .addEventListener("input", (e) => {
    document.querySelectorAll(".line").forEach((line) => {
      if(parseInt(e.target.value) > oldValue){
            line.style.width = parseInt(line.offsetWidth) + parseInt(e.target.value) + "px";
        }else{
            line.style.width = parseInt(line.offsetWidth) - parseInt(e.target.value) + "px";
        }
    });
    oldValue = e.target.value;
  });

从 css

中删除
.line {
  position: absolute;
}

更新css

.line2 {
  width: 400px;
  height: 6px;
  position: absolute;
  top: -1px;
  left:50px;
  background:green;
}
.line3 {
  width: 300px;
  height: 8px;
  position: absolute;
  top: -2px;
  left:100px;
  background:green;
}
.line4 {
  width: 200px;
  height: 10px;
  position: absolute;
  top: -3px;
  left:150px;
  background:green;
}

点击JSfiddle查看

根据您的 js 代码,无论滑块值如何,线宽只会增加。

试试给定的js

var previousValue = 10;
document
  .querySelector('input[type="range"]')
  .addEventListener("input", (e) => {
    document.querySelectorAll(".line").forEach((line) => {
      if(parseInt(e.target.value) > previousValue){
        difValue = parseInt(e.target.value) - previousValue;
        line.style.width = line.clientWidth + difValue + "px";
        }else{
            difValue = previousValue - parseInt(e.target.value);
                    line.style.width = line.clientWidth - difValue + "px";
        }
    });
    previousValue = parseInt(e.target.value);
  });

difValue 用于根据先前值和当前值的差来增加或减少线宽。 例如 当前值为 10 之前的值为 8 所以线的大小应该增加 2,即 10-8

您可以将 css 更新为

.lines {
  position: relative;
  text-align: center;
  width: 500px;
  height: 50px;
  box-sizing: border-box;
}
.line {
  position: absolute;
}
hr {
  background-color: black;
  border-radius: 5px;
}
.line1 {
  width: 500px;
  min-width: 490px;
  height: 3px;
}
.line2 {
  width: 400px;
  min-width: 390px;
  height: 6px;
  top: -1px;
  left:50px;
}
.line3 {
  width: 300px;
  min-width: 290px;
  height: 8px;
  top: -2px;
  left:100px;
}
.line4 {
  width: 200px;
  min-width: 190px;
  height: 10px;
  top: -3px;
  left:150px;
}
input[type="range"] {
  margin-top: 70px;
}