我试图在CSS动画完成时试图在Web组件上启动事件,但是使用animation: none;
,用户可能有可能从元素中清除动画,这意味着transitionend
事件永远不会火灾:
// wait for dialog close animation to end before firing closed event
element.addEventListener('transitionend', function() {
// fire dialog closed event
self.dispatchEvent(new CustomEvent('pure-dialog-closed', {
bubbles: true,
cancelable: true
}));
});
要确保我的自定义事件始终开火,我需要确定元素或任何孩子是否使用动画,如果没有应用,请立即发射pure-dialog-closed
事件。
我尝试检查style.animationName
和self.style.transition
,但似乎无法正常工作。我需要一种简单的方法来检查元素或其任何孩子是否使用CSS动画。
您可以使用getComputedStyle
函数。以下是一个读取Div的transition
属性
在这里阅读更多有关此的信息。
https://developer.mozilla.org/en-us/docs/web/api/window/getComputedStyle
function getTheStyle() {
var elem = document.getElementById("elem-container");
var theCSSprop = window.getComputedStyle(elem, null).getPropertyValue("transition");
document.getElementById("output").innerHTML = theCSSprop;
}
getTheStyle();
#elem-container {
position: absolute;
left: 100px;
top: 200px;
height: 100px;
transition: all 1s;
}
<div id="elem-container"></div>
<div id="output"></div>
谢谢@thusitha。我将window.getComputedStyle
与animation-duration
和transition-duration
一起使用,以确定是否存在动画,因为任何一个都需要大于0才能进行动画/过渡才能播放。
以下检查所有元素,包括传递的元素:
/**
* Determine if an element of any or its children have a CSS animation applied
* @param {HTMLElement} el - element to inspect
* @returns {boolean} true if an animation/transition detected, otherwise false
*/
function hasCssAnimation(el) {
// get a collection of all children including self
var items = [el].concat(Array.prototype.slice.call(el.getElementsByTagName("*")));
// go through each item in reverse (faster)
for (var i = items.length; i--;) {
// get the applied styles
var style = window.getComputedStyle(items[i], null);
// read the animation/transition duration - defaults to 0
var animDuration = parseFloat(style.getPropertyValue('animation-duration') || '0');
var transDuration = parseFloat(style.getPropertyValue('transition-duration') || '0');
// if we have any duration greater than 0, an animation exists
if (animDuration > 0 || transDuration > 0) {
return true;
}
}
return false;
}
var elementToTest = document.querySelector('.one');
var result = hasCssAnimation(elementToTest);
alert(result);
div {
font-size: 14px;
padding: 20px;
color: #fff;
}
.one {
background: red;
}
.two {
background: green;
animation: zoomIn 3s ease; /* <-- animation applied to child */
}
.three {
background: blue;
}
@keyframes zoomIn {
from {
opacity: 0;
transform: scale3d(.3, .3, .3);
}
50% {
opacity: 1;
}
}
<div class="one">
<div class="two"> <!-- animation on child element -->
<div class="three">
Hello World
</div>
</div>
</div>
您可以收听AnimationEnd和AnimationStart事件。
let element = document.getElementById("square");
element.addEventListener("animationstart", function(event) {
element.innerHTML = "RED!"
element.setAttribute('data-animating', true);
}, false);
element.addEventListener("animationend", function(event) {
element.innerHTML = "YELLOW!"
element.setAttribute('data-animating', false);
}, false);
setInterval(() => {
console.log(element.getAttribute('data-animating'))
}, 500)
#square{
width: 100px;
height: 100px;
animation-name: anim;
animation-duration: 4s;
background-color: red;
animation-fill-mode: forwards;
text-align: center;
vertical-align: middle;
line-height: 100px;
}
@keyframes anim {
to {background-color: yellow;}
}
<div id="square"></div>