Animation API

API

animation涉及到的事件有animationstart、animationend、animationiteration三个。这三个事件的bubbles都是yes,cancelable都是no

[注意] 对于safari浏览器,animation的事件为webkitAnimationStart、webkitAnimationEnd、webkitAnimationIteration

[注意] 动画事件只支持DOM2级事件处理程序的写法


animationstart    发生在动画开始时

【1】如果存在delay,且delay为正值,则元素等待延迟完毕后,再触发该事件

【2】如果delay为负值,则元素先将初始值变为delay的绝对值时,再触发该事件

    oSb.addEventListener('animationstart',function(){
        this.innerHTML = '动画开始';
        this.style.background = 'lightgreen';
    },false);

animationend    发生在动画结束时

test.addEventListener('animationend',function(){
    this.style.background="lightgreen";
    this.innerHTML = '动画结束';
},false);

animationiteration    发生在动画的一次循环结束时,只有当iteration-count循环次数大于1时,触发该事件

var i = 0;
oSb.addEventListener('animationiteration',function(){
    i++;
    this.innerHTML = i;
},false);

【补充】    只有改变animation-name时,才会使animation动画效果重新触发

oSb.style.animationName = 'none';
setTimeout(function(){
    oSb.style.animationName = 'test';
},100);

属性

这三个事件的事件对象,都有animationName和elapsedTime属性这两个私有属性

animationName属性:返回产生过渡效果的CSS属性名
elapsedTime属性:动画已经运行的秒数

[注意] 对于animationstart事件,elapsedTime属性等于0,除非animation-delay属性等于负值

<style>
#test{height:100px;width:300px;background-color:lightblue;animation:anim 2s 3;}
@keyframes anim{
    0%{height: 100px;}
    50%{height: 50px;}
    100%{height: 0;}
}
</style>

<button id='reset'>还原</button>
<div id="test"></div>
<script>
reset.onclick = function(){
    history.go();
}
test.addEventListener("animationstart", listener, false);
test.addEventListener("animationend", listener, false);
test.addEventListener("animationiteration", listener, false);
function listener(e){
    e = e || event;
    var li = document.createElement("li");
    switch(e.type) {
    case "animationstart":
      li.innerHTML = "Started: elapsed time is " + e.elapsedTime;
      break;
    case "animationend":
      li.innerHTML = "Ended: elapsed time is " + e.elapsedTime;
      break;
    case "animationiteration":
      li.innerHTML = "New loop started at time " + e.elapsedTime;
      break;
    }
    test.appendChild(li);
}
</script>