相关https://github.com/angular/angular.js/issues/4818
请参阅以下 Plunker: http ://plnkr.co/edit/i1DJ6ejtuHVFHty9jxfe?p=preview
元素<div class="box" ng-if="showBox">
有一个 5 秒的无限动画,用于永久循环背景。 当showBox
被切换时,元素的动画会重新开始,并且直到整个 5 秒过去后它才会从 DOM 中删除 - 尽管没有定义进入/离开动画。
更有问题的是:如果在动画结束之前多次切换该值(多次单击复选框),元素的多个副本将同时显示。
问题是 ngAnimate 认为您的无限动画适用于所有使用的动画事件(如进入、离开等)。 因为它是一个无限动画,所以 CSS 事件永远不会被触发,直到最后的倒计时结束,也就是 7.5 秒(5 x 1.5 == 7.5)之后。
您需要通过覆盖元素上的.ng-animate
CSS 类并取消关键帧动画来告诉 ng-animate 不要为无限背景动画设置动画。
http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview
.box.ng-animate {
-webkit-animation: none 0s;
animation: none 0s;
}
不幸的是,在 JavaScript 中检测样式和 CSS 类非常有限。 在早期版本的 AngularJS 中,我们规定您只能在动画属性(如 .ng-enter、.ng-leave 等)上定义 CSS 动画/过渡,但这导致的问题多于解决的问题。 所以在这种情况下,你需要做相反的事情。
附注。 您只需要-webkit-
前缀和标准的animation
属性,因为所有其他供应商都放弃了它们的前缀。
很酷,感谢您的解决方法。
一次多副本的事情对我来说仍然是一个错误:我编写代码的假设是使用ng-if
的元素要么出现一次,要么根本不存在,我希望框架,以防止它由于无意的菜鸟错误而如此容易地破坏。 如果我误解了ng-if
(或ng-switch
)是如何运作的,请纠正我。
多个副本在那里是因为动画仍在进行。 并且 $animate 有一个catch-all
动画,用于在您的持续时间 * 1.5 到期后发生的关键帧/过渡。 这就是为什么它们会在片刻之后消失。
您的 ng-if 代码是正确的。 是的,它只有在为真时才存在。 但是每次表达式再次变为真时,内部都会制作元素的新副本。 但是由于动画挂在较旧的元素上,因此在捕获所有动画进入之前它还没有被删除。
ng-switch 和 ng-if 的操作方式相同。 只有 ng-switch 有多个元素,而不是只有一个。
最有用的评论
问题是 ngAnimate 认为您的无限动画适用于所有使用的动画事件(如进入、离开等)。 因为它是一个无限动画,所以 CSS 事件永远不会被触发,直到最后的倒计时结束,也就是 7.5 秒(5 x 1.5 == 7.5)之后。
您需要通过覆盖元素上的
.ng-animate
CSS 类并取消关键帧动画来告诉 ng-animate 不要为无限背景动画设置动画。http://plnkr.co/edit/fq7ZEO7tDnqLmavHoBfQ?p=preview
不幸的是,在 JavaScript 中检测样式和 CSS 类非常有限。 在早期版本的 AngularJS 中,我们规定您只能在动画属性(如 .ng-enter、.ng-leave 等)上定义 CSS 动画/过渡,但这导致的问题多于解决的问题。 所以在这种情况下,你需要做相反的事情。
附注。 您只需要
-webkit-
前缀和标准的animation
属性,因为所有其他供应商都放弃了它们的前缀。