JavaScript检测正在进行的CSS动画

时间:2015-06-29 10:07:43

标签: javascript jquery html css animation

我在JavaScript中遇到一些问题,决定是否等待animationend个事件,并想知道是否存在这个问题的优雅解决方案。

假设我有一个div在页面加载时淡化并淡入,然后在稍后我有另一个脚本将<img>标记附加到div。

我希望在动画完成之后附加 {em},以避免在动画过程中出现任何卡顿现象,并让它看起来更漂亮。

目前我知道我可以写这样的东西(假设我使用animate.css):

HTML:

<img>

JavaScript的:

<div class="append-image-here animated fadeIn"></div>

如果脚本在动画完成之前运行并且$(function() { $('.append-image-here').one([ 'webkitAnimationEnd', 'mozAnimationEnd', 'MSAnimationEnd', 'oanimationend', 'animationend' ].join(' '), function() { $('<img>', { src: '/image.jpg' }).appendTo(this); }); }); 事件触发,这很好,但是如果脚本在动画结束后运行,则永远不会创建animationend标记,并且永远不会附加到div(例如,如果处理程序设置为超时或类似于超过动画持续时间的那些)。

有没有办法检测CSS动画当前是否正在运行,以便脚本可以决定是否等待<img>而不必依赖用户添加的类或数据属性?

(我要求不要依赖课程和属性,因为如果我和别人合作动画,我可能不会提前知道课程)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:3)

为什么不在文档上使用.on(),甚至检查哪个动画只是 已完成,哪个元素已设置动画(e.target)事件处理程序将在DOM完全加载并触发CSS动画之前附加。

DEMO:JSnippet Demo

注意:当DOM准备就绪时不要附加 - $(function(){ ... })

$(document).on([
    'webkitAnimationEnd',
    'mozAnimationEnd',
    'MSAnimationEnd',
    'oanimationend',
    'animationend'
    ].join(' '), function(e) {
       //Do whatever you want 
       console.log(e);
       $('ul').append(
          "<li>Animation end detected on: "  
          + e.target 
          + "." + e.target.className + 
          "</li>"
       );
});

&#13;
&#13;
$(function(){
  
    $('button').click(function(){
        $(this).addClass('animate');
    });
    
});

$(document).on([
    'webkitAnimationEnd',
    'mozAnimationEnd',
    'MSAnimationEnd',
    'oanimationend',
    'animationend'
  ].join(' '), function(e) {
    //Do whatever you want 
    console.log(e);
    $('ul').append(
        "<li>Animation end detected on: "  
        + e.target 
        + "." + e.target.className + 
        "</li>"
    );
    $('button').removeClass('animate');
});
&#13;
button {
        width: 300px;
        background-color: red;
}
button.animate {
        -webkit-animation-name: example; /* Chrome, Safari, Opera */
        -webkit-animation-duration: 1s; /* Chrome, Safari, Opera */
        animation-name: example;
        animation-duration: 1s;
}
/* Chrome, Safari, Opera */
@-webkit-keyframes example {
    from {background-color: red;}
    to {background-color: yellow;}
}

/* Standard syntax */
@keyframes example {
    from {background-color: red;}
    to {background-color: yellow;}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<button class="animate">Trigger animation</button>
<ul></ul>
&#13;
&#13;
&#13;