如何用JS和CSS对HR标签(横线)做动态效果?
How can I make a dynamic effects on HR tag(horizontal line) with JS and CSS?
我想用 CSS
& JS
和 HR 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;
}
我想用 CSS
& JS
和 HR 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;
}