如何使用 JS 和 CSS 对 HR 标签(水平线)进行动态效果?

Posted

技术标签:

【中文标题】如何使用 JS 和 CSS 对 HR 标签(水平线)进行动态效果?【英文标题】:How can I make a dynamic effects on HR tag(horizontal line) with JS and CSS? 【发布时间】:2022-01-22 17:43:16 【问题描述】:

我想用 CSS & JSHR html 元素制作动态效果:这个想法是像这样水平制作 4 行: 并通过添加 range 类型的输入 使其动态化,并根据 input range 的值使它们在宽度上增长和缩小! 到目前为止我尝试过的:

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增加或减少;根据其值所有水平线将动态变宽或变窄!更重要的是,我会根据input range value 动态地增加或减少margin-left,我做得对还是使用CSS variables;欢迎提出任何建议并更加感谢!

【问题讨论】:

【参考方案1】:

做一些小改动 -

  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查看

【讨论】:

如果通过 currentValue 增加或减少行数,它不会给出预期的结果。例如:如果我的滑块位于 10 并且我将其移动到 0。线条的宽度将保持不变。 好的,谢谢..【参考方案2】:

根据您的 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;

【讨论】:

以上是关于如何使用 JS 和 CSS 对 HR 标签(水平线)进行动态效果?的主要内容,如果未能解决你的问题,请参考以下文章

前端学习html css js

如何控制HR标签制作的网页水平线的长度和颜色?

HTML常用标记属性CSS代码JS代码(速查)

在表格中使用 <hr> 标签?

更改 HTML 页面中的 hr 样式[重复]

如何在HTML中设计<hr>即水平线的颜色??