如何仅使用一次 jquery 和百分比单位为进度条设置动画?
How to animate a progress bar with jquery and percent unit just once?
我正在尝试为我的“HTML 级别”进度条制作动画。当我悬停父级 div 时,我希望进度条达到“90%”。我发现的最好方法是设置“宽度:90%”。但是,例如,当我将父级 div 悬停两次时,进度条会再动画一次。我试过使用“px”单位,它起作用了,但它没有响应,如果我们缩放,我们永远不会得到相同的结果。请问我该如何解决这个问题?
PS:我希望我的代码能像下面的“片段”一样工作,但是当我在浏览器中一次又一次地将它悬停时,它会多次动画化
$(document).ready(function () {
$("#langages").on('mouseenter', function () {
$("#fr").animate({ width: "90%" });
});
});
#langages{
height: 100px;
}
#fr {
width: 20%;
}
.size {
max-height: 25em;
}
.bgBlue{
background-color: #5DD5FF;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="langages" class="bg-white col-10 text-center mx- auto mb-5 fs-5 shadow rounded size">
<div class="col-11 mx-auto my-4 text-start">
Français
<div class="progress mt-1">
<div class="progress-bar bgBlue" id="fr" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100">
<span class="sr-only">90% Complete</span>
</div>
</div>
</div>
</div>
你可以在动画完成时添加class,并在mouseenter事件时检查元素是否得到class。像这样,动画运行只有一次。
$(document).ready(function () {
$("#langages").on('mouseenter', function () {
// we check if animation was done once
if (!$("#fr").hasClass('animationDone')) {
// if not, then we do animation
$("#fr").animate({
width: "90%"
}, 500, function() {
// we add class animationDone once
$("#fr").addClass('animationDone');
console.log('Animate once');
});
}
});
});
#langages{
height: 100px;
}
#fr {
width: 20%;
}
.size {
max-height: 25em;
}
.bgBlue{
background-color: #5DD5FF;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="langages" class="bg-white col-10 text-center mx- auto mb-5 fs-5 shadow rounded size">
<div class="col-11 mx-auto my-4 text-start">
Français
<div class="progress mt-1">
<div class="progress-bar bgBlue" id="fr" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100">
<span class="sr-only">90% Complete</span>
</div>
</div>
</div>
</div>
响应的最佳方式之一是使用 vw。当然你可以定义变量,获取 screen.width 并进行一些数学运算。
$("#fr").animate({ width: "90vw" });
$(document).ready(function () {
let userScreenWidth =String(screen.width);
userScreenWidth = userScreenWidth.substring(0, 2) * 90;
// console.log(userScreenWidth.substring(0, 2) * 90);
$("#langages").on('mouseenter', function () {
$("#fr").animate({ width:userScreenWidth+'px' });
});
});
我正在尝试为我的“HTML 级别”进度条制作动画。当我悬停父级 div 时,我希望进度条达到“90%”。我发现的最好方法是设置“宽度:90%”。但是,例如,当我将父级 div 悬停两次时,进度条会再动画一次。我试过使用“px”单位,它起作用了,但它没有响应,如果我们缩放,我们永远不会得到相同的结果。请问我该如何解决这个问题?
PS:我希望我的代码能像下面的“片段”一样工作,但是当我在浏览器中一次又一次地将它悬停时,它会多次动画化
$(document).ready(function () {
$("#langages").on('mouseenter', function () {
$("#fr").animate({ width: "90%" });
});
});
#langages{
height: 100px;
}
#fr {
width: 20%;
}
.size {
max-height: 25em;
}
.bgBlue{
background-color: #5DD5FF;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="langages" class="bg-white col-10 text-center mx- auto mb-5 fs-5 shadow rounded size">
<div class="col-11 mx-auto my-4 text-start">
Français
<div class="progress mt-1">
<div class="progress-bar bgBlue" id="fr" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100">
<span class="sr-only">90% Complete</span>
</div>
</div>
</div>
</div>
你可以在动画完成时添加class,并在mouseenter事件时检查元素是否得到class。像这样,动画运行只有一次。
$(document).ready(function () {
$("#langages").on('mouseenter', function () {
// we check if animation was done once
if (!$("#fr").hasClass('animationDone')) {
// if not, then we do animation
$("#fr").animate({
width: "90%"
}, 500, function() {
// we add class animationDone once
$("#fr").addClass('animationDone');
console.log('Animate once');
});
}
});
});
#langages{
height: 100px;
}
#fr {
width: 20%;
}
.size {
max-height: 25em;
}
.bgBlue{
background-color: #5DD5FF;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="langages" class="bg-white col-10 text-center mx- auto mb-5 fs-5 shadow rounded size">
<div class="col-11 mx-auto my-4 text-start">
Français
<div class="progress mt-1">
<div class="progress-bar bgBlue" id="fr" role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100">
<span class="sr-only">90% Complete</span>
</div>
</div>
</div>
</div>
响应的最佳方式之一是使用 vw。当然你可以定义变量,获取 screen.width 并进行一些数学运算。
$("#fr").animate({ width: "90vw" });
$(document).ready(function () {
let userScreenWidth =String(screen.width);
userScreenWidth = userScreenWidth.substring(0, 2) * 90;
// console.log(userScreenWidth.substring(0, 2) * 90);
$("#langages").on('mouseenter', function () {
$("#fr").animate({ width:userScreenWidth+'px' });
});
});