Javascript 如何使用setTimeout添加和删除CSS类n次?
我想添加和删除CSS类Javascript 如何使用setTimeout添加和删除CSS类n次?,javascript,jquery,css,Javascript,Jquery,Css,我想添加和删除CSS类n次以显示动画,以显示效果n次,就像设置动画迭代计数时一样,不同之处在于这里有两个动画,第二个延迟 我的想法是使用setTimeout,所以我阅读了,但没有得到预期的结果 这里是一个片段-和一个-与动画(显示一次) $(“按钮”)。单击(函数(){ $('div').addClass('a'); $(this.attr('disabled','true').text('Started'); setTimeout(函数(){ $('div').removeClass('a'
n
次以显示动画,以显示效果n
次,就像设置动画迭代计数时一样,不同之处在于这里有两个动画,第二个延迟
我的想法是使用setTimeout
,所以我阅读了,但没有得到预期的结果
这里是一个片段-和一个-与动画(显示一次)
$(“按钮”)。单击(函数(){
$('div').addClass('a');
$(this.attr('disabled','true').text('Started');
setTimeout(函数(){
$('div').removeClass('a');
$('button').removeAttr('disabled').text('Finished | reach');
},6000);
});代码>
div{
宽度:100px;高度:100px;背景:红色;
}
.a{
动画:a 2s线性,b 2s线性;
}
@关键帧{
来自{背景:红色;}
至{背景:蓝色;}
}
@关键帧b{
来自{背景:蓝色;}
至{背景:黑色;}
}
开始
您可以使用设置间隔
并计算迭代次数
var n = 3;
var iterationCount = 0;
$('button').click(function(){
clearInterval(animInterval);
var animInterval = setInterval(function(){
$('div').toggleClass('a');
iterationCount++;
if (n == iterationCount)
clearInterval(animInterval);
},4000);
});
css方式
在我看来,用js重复动画似乎是错误的。有动画迭代计数
属性,如果不添加多个@关键帧
,您应该能够实现您所追求的目标。对于您的示例代码,它非常简单(尽管我怀疑您的真实动画可能有点不同:
.a {
animation: a 2s linear 5 alternate;
}
@keyframes a {
0% { background: red; }
50% { background: blue; }
100% { background: black; }
}
如果你找不到用css实现动画的方法,请随意发布你的真实动画。
js方式
如果你坚持使用js方式,你需要确保在每个周期后重置超时。这可以通过递归调用函数来实现。在计数器的帮助下,你可以轻松控制它运行的次数。按照以下顺序:
$('button').click(function(){
$('div').addClass('a');
$(this).attr('disabled','true').text('Started');
var counter = 5;
function repeater() {
if (counter >= 0) {
$('div').toggleClass('a');
counter--;
// start new cycle
setTimeout(repeater, 3000);
} else {
// cleanup
$('button').removeAttr('disabled').text('Finished | Again');
}
}
// boot the repeater
repeater()
});
您可以处理animationend事件。请看以下代码:
$('div').on('animationend', function (data) {
if (data.originalEvent.animationName === 'b') {
$('div').removeClass('a');
iteration++;
if (iteration < n) {
setTimeout(function () { $('div').addClass('a'); });
} else {
iteration = 0;
$('button').removeAttr('disabled').text('Finished | Again');
}
}
});
$('div')。在('animationend',函数(数据)上{
如果(data.originalEvent.animationName==='b'){
$('div').removeClass('a');
迭代++;
if(迭代
有一个参数data.originalEvent.animationName,它指示动画名称已结束。您的最后一个动画是b。因此,您必须删除类并再次添加它。您还必须保留当前迭代次数和最大迭代次数。请在此处检查此项:这是您的小提琴的更新:
正如您所看到的,这将重复动画任意多次,也可以容纳多个动画,但有点混乱。因为您已经在使用jQuery,我建议您研究jQuery的动画API,它(我认为)具有更强大的回调功能,但我几乎不使用jQuery,因此您必须研究它
如果这还不包括你想要的,也许你可以在网上找到一个例子来更好地说明你的问题
(js/jquery供参考-尽管我也更新了关键帧以添加另一个动画,所以请看小提琴)
你能更详细地说明你想要实现的目标吗?如果你想让setTimeout运行多次(就像在你链接的另一个线程中一样),你必须递归调用它,而不是在这里执行。与setInterval()
,setTimeout()不同
不会重复,我看不到您的设置超时
调用任何会导致它再次运行的东西。@Damon是的,因为正如我所说,我没有得到预期的结果。我想重复多次动画n次,但我不知道如何做。我提到了“设置超时”作为一个选项。最好的方法是什么?谢谢!使用setInterval()和clearInterval()。基本上设置一个变量,比如说interval
,并将其设置为您的setInterval
函数。有一个计数器n。在间隔的n个循环之后,调用clearInterval(interval);
(编辑:如果您需要一个示例,我会在答案中发布一些内容-让我知道这是否有效)@Damon你能举个例子吗?谢谢谢谢谢谢,但是我必须使用多个动画,背景色就是一个例子。谢谢,但是我必须使用多个动画,背景色就是一个例子。我最后一句话的意思是,“请随意发布你的真实动画”。无论如何,如果你坚持走js路线(这可能没有必要),我已经用一个可能的解决方案更新了我的答案。
$('button').click(function(){
$('div').addClass('a');
$(this).attr('disabled','true').text('Started');
var n = 0;
var interval = setInterval(function() {
$('div').removeClass('a');
if (n === 5) {
clearInterval(interval);
$('button').removeAttr('disabled').text('Finished | Again');
} else {
setTimeout(function() {
$('div').addClass('a');
}, 0)
n++;
}
}, 4500);
});