Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery+;Animate.css动画仅工作一次,动画不重置_Javascript_Jquery_Css_Animation - Fatal编程技术网

Javascript jQuery+;Animate.css动画仅工作一次,动画不重置

Javascript jQuery+;Animate.css动画仅工作一次,动画不重置,javascript,jquery,css,animation,Javascript,Jquery,Css,Animation,我试图在每次按下按钮时重现一个特定的动画 具体地说,我使用了jQuery和animate.css库来实现这个效果:单击按钮时,一个类被添加到我想要设置动画的元素中(确切地说是两个类:fadeInDown animated) 动画确实可以正常工作,但只能工作一次。为什么会这样 小提琴: 我希望每次单击按钮时动画都会重置,即使是在上一次单击完成的中途。每当我点击按钮时,它也应该工作,而不仅仅是一次 JS: 来自animate.css的类: @-webkit-keyframes fadeInDown

我试图在每次按下按钮时重现一个特定的动画

具体地说,我使用了
jQuery
animate.css
库来实现这个效果:单击按钮时,一个类被添加到我想要设置动画的元素中(确切地说是两个类:
fadeInDown animated

动画确实可以正常工作,但只能工作一次。为什么会这样

小提琴:

我希望每次单击按钮时动画都会重置,即使是在上一次单击完成的中途。每当我点击按钮时,它也应该工作,而不仅仅是一次

JS:

来自animate.css的类:

@-webkit-keyframes fadeInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    transform: translateY(0);
  }
}

@keyframes fadeInDown {
  0% {
    opacity: 0;
    -webkit-transform: translateY(-20px);
    -ms-transform: translateY(-20px);
    transform: translateY(-20px);
  }

  100% {
    opacity: 1;
    -webkit-transform: translateY(0);
    -ms-transform: translateY(0);
    transform: translateY(0);
  }
}

.fadeInDown {
  -webkit-animation-name: fadeInDown;
  animation-name: fadeInDown;
}

.animated {
  -webkit-animation-duration: 1s;
  animation-duration: 1s;
  -webkit-animation-fill-mode: both;
  animation-fill-mode: both;
}

动画完成后需要删除类

但是直接使用
removeClass
不起作用,因为它不会让动画完成,而是使用
setTimeout

看到这个了吗


问题是它会立即删除类,然后添加类,所以我只添加了Button2id的新div,点击它就可以删除类,然后再次点击按钮div,它会设置动画

所以问题是你们需要在动画完成后再做

$("#button1").click(function () {
    $("#button").removeClass();
});

fiddle在这里:

更安全的方法是使用动画结束事件,如

$(“#按钮”)。单击(函数(){
$(“#按钮”).addClass(“fadeInDown动画”).one('animationend webkitAnimationEnd oAnimationEnd',函数(){
$(“#按钮”).removeClass();
});
});
#按钮{
高度:30px;
宽度:120px;
边框:1px纯黑;
}
.动画{
-webkit动画持续时间:1s;
动画持续时间:1s;
}
@-webkit关键帧淡入淡出淡入{
0% {
不透明度:0;
-webkit转换:translateY(-20px);
转换:translateY(-20px);
}
100% {
不透明度:1;
-webkit转换:translateY(0);
变换:translateY(0);
}
}
@关键帧淡入淡出{
0% {
不透明度:0;
-webkit转换:translateY(-20px);
-ms变换:translateY(-20px);
转换:translateY(-20px);
}
100% {
不透明度:1;
-webkit转换:translateY(0);
-ms变换:translateY(0);
变换:translateY(0);
}
}
法德恩敦先生{
-webkit动画名称:fadeInDown;
动画名称:fadeInDown;
}

请参阅,其中讨论了这个确切的问题

我认为最干净的解决方案是将删除元素并将其重新插入全局函数中HTML树中相同位置的功能包装起来。然后,如果要重新启动动画,只需删除该类,调用重置函数(从返回值中获取新插入的元素),然后添加动画类以再次启动动画

例如:

function reset($elem) {
    $elem.before($elem.clone(true));
    var $newElem = $elem.prev();
    $elem.remove();
    return $newElem;
} // end reset()

$("#button").click(function () {
    var $this = $(this);
    $this.removeClass();
    $this = reset($this);
    $this.addClass("fadeInDown animated");
});


此解决方案提供了最大的响应能力,因为当动画元素被销毁时,旧的正在进行的动画会自动结束,而新插入的元素的动画会立即开始。

也许这是解决问题的好方法:


在javascript中,类
.animation
.fadeInDown
被添加到
#按钮
中,之后您拥有了这些类,无法再添加它们。

对我来说,简单的解决方案是在添加类之前启动回流过程。 例如,您可以通过“更改”元素的宽度来实现。我认为对于浏览器来说,回流过程比重新插入节点更快。而且它在编码方面更简单。 在jQuery中:

$(this)
  .removeClass('myAnimation')
  .width('auto') // the magic
  .addClass('myAnimation')

这在animate.css github中对我有用:

animateCss: function (animationName) {
    var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
    $(this).addClass('animated ' + animationName).one(animationEnd, function() {
        $(this).removeClass('animated ' + animationName);
    });
}

要重置元素,我们必须重新计算css,对吗?所以我做的是隐藏然后显示元素。我所做的是删除类(),然后隐藏(),然后显示()添加类()


有趣。但是,这不符合我的要求。让用户重置动画将不起作用。你是说我需要做的是设置一个超时,让动画在移除类之前完成吗?@Tiago是的,我的意图是这样的,但你应该接受Arun的回答,他太棒了。很好的回答。。。!啊,这似乎就是我要找的。请您解释一下为什么在动画之前和之后都使用了duplicate.removeClass()方法?@Tiago忘了删除它。。。不需要谢谢你@Arun给了我很好的回答,但我决定接受bgoldst的建议。这正是我想要的。这感觉像是一个比克隆整个元素更干净的解决方案。这太棒了。这篇文章的答案很好,但这段代码完全符合我的要求。谢谢。我写的是同样的答案,但是被打败了!其他答案都不正确,因为它们都在等待动画完成,@Tiago说即使没有完成动画也应该重新启动。@blex完全正确。我真的很高兴找到如此精确的解决方案。谢谢大家。我有一个自定义宽度。所以我做的是先藏后秀
$(this)
  .removeClass('myAnimation')
  .width('auto') // the magic
  .addClass('myAnimation')
animateCss: function (animationName) {
    var animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
    $(this).addClass('animated ' + animationName).one(animationEnd, function() {
        $(this).removeClass('animated ' + animationName);
    });
}
$("#button").click(function () {
    $("#button").removeClass("fadeInDown animated").hide();
    $("#button").show().addClass("fadeInDown animated");
});