检查元素是不是有css动画

Posted

技术标签:

【中文标题】检查元素是不是有css动画【英文标题】:Check if element has css animation检查元素是否有css动画 【发布时间】:2014-09-08 06:39:11 【问题描述】:

我有一个脚本,当 css3 动画在 jQuery 中触发 AnimationEnd 时删除一个元素。问题是这些动画绑定到了一个可能不包含的外部 css 文件。

现在我称之为。

$element.one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(event) 
    $(this).remove();
);

但是如果元素没有动画是因为浏览器不支持它或者动画文件不包含,我仍然需要删除元素。我如何检查它是否被调用。

我已经尝试过了,但它似乎没有将值更改为 true。

var hasAnimation = false;
$element.one('webkitAnimationStart oanimationstart msAnimationStart animationstart', function(event) 
        hasAnimation = true;
);
if (!hasAnimation) 
        $element.remove();

【问题讨论】:

***.com/questions/9736919/… 我发现,问题是我不确定如何将该答案转换为我可以使用的东西。他们的答案是假设动画总是会开始。我正在尝试检查动画是否可以开始。 至少你应该给 javascript 一个触发动画开始的机会......我想如果你把:“如果有动画”放在 setTimeout-function 5ms 中?应该做的伎俩 @halfbit 所以这行得通。我本来希望避免使用setTimeout,但是嘿,必须做你必须做的事情。 我认为 setTimeout(f,0,x) 不是超时,它对我来说更像是一个“ImedaiateReEnqueue(f,x)”函数 【参考方案1】:

你在动画开始之前检查了hasAnimation,因为你没有放弃你的“时间片”。 (这是错误的术语,但我认为“时间片”只是描述了正在发生的事情)

AFAIK no Javascript implementationaion 是-抢占式-多线程,至少不是在脚本级别。所以如果你循环,你循环,没有其他事情发生。

想象一下诸如将函数放入队列之类的事件,这些事件一个接一个地被触发/调用。举止得体。所以如果你想知道这样一个事件的结果是什么,你必须结束你当前的函数(称之为放弃时间片)。现在活动开始了 - 现在是唯一的活动。

因此,如果您将cleanup_if_no_animation( hasAnimation )setTimeout(0) 排在一起,只要StartAnimation 本身没有与setTimeout 一起触发,您就不会真正玩弄时间,您只需放弃,然后在(可选的开始事件)

如果您想计算到 1000 并将其放入 DIV,则与您的情况相同。您必须在步骤之间使用 setTimeout(0) 来更新显示。

喜欢这个example

function bad_loop() 
    for (i = 1; i < 100; ++i) 
        $('#out').text(i)
     

function good_loop(i = 1)  
    $('#out').text(i)
    if (i<50) setTimeout(good_loop,0,i+1) 

【讨论】:

以上是关于检查元素是不是有css动画的主要内容,如果未能解决你的问题,请参考以下文章

简单的 CSS 动画在 Safari 中不流畅

svg中不可以使用css 3d动画吗?

绝对定位元素可以做css3 动画吗

CSS3 弹性布局&3D动画

如何停止CSS3的动画

我可以在构建元素时暂时关闭所有 CSS3 过渡/动画吗?