animationend事件也会在子元素的动画结束时触发?

ozxc1zmp  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(488)

我有一个带动画的div。
我已将animationend事件侦听器附加到此分区。
这个div还有一个子元素和一个动画。
出于某种原因,当childelement的动画也完成时,animationend事件将激发。
为什么会这样?有没有办法绕过这个问题?我希望animationend事件仅在我附加eventlistener的元素完成时运行。

document.querySelector('.outer').addEventListener('animationend',function () {
  console.log('done')
})
body {
  height:100vh;
  display:grid;
  place-items:center;
}

.outer {
  display:grid;
  place-items:center;
  height:200px;
  width:200px;
  background:black;
  animation:spin 2s 
}

.inner {
  height:50px;
  width:50px;
  background:red;
    animation:spin 2s 2s 
}

@keyframes spin {
  from {
    transform:rotate(0)
  }
  to {
    transform:rotate(360deg)
  }
}
<div class="outer">
  <div class="inner">

  </div>
</div>

改为尝试使用id。还是不走运

document.querySelector('#outer').addEventListener('animationend',function () {
  console.log('done')
})
body {
  height:100vh;
  display:grid;
  place-items:center;
}

# outer {

  display:grid;
  place-items:center;
  height:200px;
  width:200px;
  background:black;
  animation:spin 2s 
}

.inner {
  height:50px;
  width:50px;
  background:red;
    animation:spin 2s 2s 
}

@keyframes spin {
  from {
    transform:rotate(0)
  }
  to {
    transform:rotate(360deg)
  }
}
<div id="outer">
  <div class="inner">

  </div>
</div>
kknvjkwl

kknvjkwl1#

您可以检查事件的目标是否是侦听器附加到的元素。当子元素上的动画结束时,也会调用事件处理程序,因为 animationend 事件气泡。

document.querySelector('.outer').addEventListener('animationend', function(e) {
    if(e.target === this)  console.log('done')
})
document.querySelector('.outer').addEventListener('animationend',function (e) {
    if(e.target === this)  console.log('done')
})
body {
  height:100vh;
  display:grid;
  place-items:center;
}

.outer {
  display:grid;
  place-items:center;
  height:200px;
  width:200px;
  background:black;
  animation:spin 2s 
}

.inner {
  height:50px;
  width:50px;
  background:red;
    animation:spin 2s 2s 
}

@keyframes spin {
  from {
    transform:rotate(0)
  }
  to {
    transform:rotate(360deg)
  }
}
<div class="outer">
  <div class="inner">

  </div>
</div>

相关问题