transitionend
所有添加了CSS3动画的元素都会有一个Transitionend事件,顾名思义,也就是当前元素的CSS3动画完成的时候执行一些操作。
下面来看一个例子,一个元素,当鼠标移过它的时候,我们让它在1秒内使用CSS3从宽度100PX
变到200PX
,动画执行完成后,弹出一句话:
<div id="ani"> </div>
window.onload = function(){ var ani = document.getElementById("ani"); ani.addEventListener("mouseover",function(){ this.style.width = "200px"; },false); ani.addEventListener("transitionend",function(){ alert("done!"); },false); };
在Chrome下,鼠标移动到上面后,元素的宽度会变化到200PX
,当动画结束后,会弹出一个“done!”:
点击Demo进行查看效果。
transitionend的一些问题
我们可以同时改变元素的多个属性,让它一起参加动画(把上面的动画增加一个高度和背景色,结束后仍然弹出”done!”):
ani.addEventListener("mouseover",function(){ this.style.width = "200px"; this.style.height = "200px"; this.style.backgroundColor = "skyblue"; },false);
可是这样出现了一个大问题,什么问题呢?请点击Demo。
没错,在动画结束后,会弹出三遍“done!”,因为它同时进行了三个属性的动画,也就是说回调函数也会执行三遍!
解决回调问题
transitionend会根据属性的多少来执行多次,对此,我没有办法继续使用它,所以我使用了定时器:
var ani = document.getElementById("ani"), timer = null; ani.addEventListener("mouseover",function(){ this.style.width = "200px"; this.style.height = "200px"; this.style.backgroundColor = "skyblue"; clearTimeout(timer); timer = setTimeout(function(){ alert("done!"); },1000); },false); ani.addEventListener("mouseout",function(){ this.style.width = "100px"; this.style.height = "100px"; this.style.backgroundColor = "transparent"; clearTimeout(timer); },false);
现在当鼠标经过并动画完成后,只会弹出一次”done!”,查看 Demo。
结语
文中所述代替transitionend执行回调函数的方法,可能不是最好的,如果您有更好的解决方案,可以分享一下,谢谢!