如何使用 javascript 将 属性 从设置属性转换为新属性
How to use javascript to transition a property from a set attribute to a new attribute
我正在开展一个项目,该项目需要仅使用 html、css 和 javascript 的自定义进度条。我希望能够在进度条上设置初始条件并让它从正确的位置开始。
示例:我有一个时间戳来指示某件事何时开始,我知道它应该何时完成。我希望进度条从按比例正确的位置开始,然后在适当的时间内将宽度过渡到 100% 完成。
我在设置代码时遇到问题,因此这成为可能。我还无法获得一个 css 过渡以从编程设置的宽度开始。
这个例子展示了我目前的方法...
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: "Avenir Next", sans-serif;
font-size: 1em;
text-align: center;
}
html, body, div {
width: 100%;
height: 100%;
background-color: white;
}
#spacer {
height: 40%;
}
#container {
height: 20%;
background-color: gray;
}
#progressBar {
background-color: green;
float: left;
}
</style>
</head>
<body onload="startProgressBar()">
<div id="spacer"></div>
<div id="container">
<div id="progressBar"></div>
</div>
<div id="spacer"></div>
</body>
<script type="text/javascript">
function startProgressBar() {
bar = document.getElementById("progressBar");
// assume that the bar should start at 50%
bar.style.transitionDuration = "0s";
bar.style.width = "50%";
// assume that bar should complete final 50% in 10s
bar.style.transition = "width 10s linear";
bar.style.width = "100%";
}
</script>
</html>
我是 javascript 的新手。似乎当我设置 bar.style
时,这些行不是串行执行的。我可能只是误解了 javascript 的工作原理。
这是因为您设置过渡属性的方式。您需要在超时或 requestAnimationFrame 中应用动画,如下所示:
function startProgressBar() {
bar = document.getElementById("progressBar");
// assume that the bar should start at 50%
bar.style.width = "50%";
requestAnimationFrame(function(){
// assume that bar should complete final 50% in 10s
bar.style.transition = "width 10s linear";
bar.style.width = "100%";
});
}
此外,您不需要第一个设置的 transitionDuration,因为您没有过渡到 50%,您想要从那里开始。
仅需 setTimeout
即可:
function startProgressBar(){
bar=document.getElementById('progressBar');
bar.style.width='50%';
setTimeout(function(){
bar.style.transitionDuration='2s';
bar.style.width='100%';
},1);
}
startProgressBar();
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family:"Avenir Next", sans-serif;
font-size: 1em;
text-align: center;
}
html, body, div {
width: 100%;
height: 100%;
background-color: white;
}
#spacer {
height: 40%;
}
#container {
height: 20%;
background-color: gray;
}
#progressBar {
background-color: green;
float: left;
}
<div id="spacer"></div>
<div id="container"><div id="progressBar"></div></div>
<div id="spacer"></div>
更新:糟糕!没有意识到@KevinF已经发布了一个很好的解决方案。
或者只是简单地给#progressBar 一个宽度值 css。
#progressBar {
background-color: green;
float: left;
width: 50%;
}
我正在开展一个项目,该项目需要仅使用 html、css 和 javascript 的自定义进度条。我希望能够在进度条上设置初始条件并让它从正确的位置开始。
示例:我有一个时间戳来指示某件事何时开始,我知道它应该何时完成。我希望进度条从按比例正确的位置开始,然后在适当的时间内将宽度过渡到 100% 完成。
我在设置代码时遇到问题,因此这成为可能。我还无法获得一个 css 过渡以从编程设置的宽度开始。
这个例子展示了我目前的方法...
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: "Avenir Next", sans-serif;
font-size: 1em;
text-align: center;
}
html, body, div {
width: 100%;
height: 100%;
background-color: white;
}
#spacer {
height: 40%;
}
#container {
height: 20%;
background-color: gray;
}
#progressBar {
background-color: green;
float: left;
}
</style>
</head>
<body onload="startProgressBar()">
<div id="spacer"></div>
<div id="container">
<div id="progressBar"></div>
</div>
<div id="spacer"></div>
</body>
<script type="text/javascript">
function startProgressBar() {
bar = document.getElementById("progressBar");
// assume that the bar should start at 50%
bar.style.transitionDuration = "0s";
bar.style.width = "50%";
// assume that bar should complete final 50% in 10s
bar.style.transition = "width 10s linear";
bar.style.width = "100%";
}
</script>
</html>
我是 javascript 的新手。似乎当我设置 bar.style
时,这些行不是串行执行的。我可能只是误解了 javascript 的工作原理。
这是因为您设置过渡属性的方式。您需要在超时或 requestAnimationFrame 中应用动画,如下所示:
function startProgressBar() {
bar = document.getElementById("progressBar");
// assume that the bar should start at 50%
bar.style.width = "50%";
requestAnimationFrame(function(){
// assume that bar should complete final 50% in 10s
bar.style.transition = "width 10s linear";
bar.style.width = "100%";
});
}
此外,您不需要第一个设置的 transitionDuration,因为您没有过渡到 50%,您想要从那里开始。
仅需 setTimeout
即可:
function startProgressBar(){
bar=document.getElementById('progressBar');
bar.style.width='50%';
setTimeout(function(){
bar.style.transitionDuration='2s';
bar.style.width='100%';
},1);
}
startProgressBar();
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family:"Avenir Next", sans-serif;
font-size: 1em;
text-align: center;
}
html, body, div {
width: 100%;
height: 100%;
background-color: white;
}
#spacer {
height: 40%;
}
#container {
height: 20%;
background-color: gray;
}
#progressBar {
background-color: green;
float: left;
}
<div id="spacer"></div>
<div id="container"><div id="progressBar"></div></div>
<div id="spacer"></div>
更新:糟糕!没有意识到@KevinF已经发布了一个很好的解决方案。
或者只是简单地给#progressBar 一个宽度值 css。
#progressBar {
background-color: green;
float: left;
width: 50%;
}