我在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>
而不必依赖用户添加的类或数据属性?
(我要求不要依赖课程和属性,因为如果我和别人合作动画,我可能不会提前知道课程)
任何帮助都将不胜感激。
答案 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>"
);
});
$(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;