我正在使用点击事件触发CSS动画,为啥再次点击时动画不会再次运行?

Posted

技术标签:

【中文标题】我正在使用点击事件触发CSS动画,为啥再次点击时动画不会再次运行?【英文标题】:I'm using click event to trigger CSS animation, why wouldn't the animation run again when clicked again?我正在使用点击事件触发CSS动画,为什么再次点击时动画不会再次运行? 【发布时间】:2022-01-20 00:45:51 【问题描述】:

我是 Web 开发新手,我正在尝试更好地了解 DOM。

我的代码的目的是在触发点击事件时为元素提供一些动画。这是我尝试过的:

代码:

const svg = document.getElementById('svg');
const button = document.getElementById('button');

button.onclick = function() 
  svg.style.animation = 'svg-color 5s linear 1 1s';
svg 
  background-color: lightcyan;


@keyframes svg-color 
  0% 
    background-color: lightcyan;
  
  50% 
    background-color: skyblue;
  
  100% 
    background-color: steelblue;
  
<svg id="svg"  ></svg>
<button id="button">button</button>

它适用于第一次点击事件。但是当我再次单击按钮时,动画将不再运行。

这个问题是由于 DOM 还是我在 CSS 上将 animation-iteration-count 设置为 1 的事实?

如果我将动画迭代计数设置为无限,有没有办法让动画回到它的开始状态并在点击事件时再次重播?

【问题讨论】:

因为您分配的样式与已在元素上设置的样式相同。您应该在动画结束时移除样式。 【参考方案1】:

如果您分配的样式已在元素上设置,则不会发生任何事情。

您需要在动画结束时移除样式。这样,下次单击时样式将是新的。

const svg = document.getElementById('svg');
const button = document.getElementById('button');

button.onclick = function() 
  svg.style.animation = 'svg-color 5s linear 1 1s';

svg.addEventListener("animationend", (e) => e.target.style.animation = '');
svg 
  background-color: lightcyan;


@keyframes svg-color 
  0% 
    background-color: lightcyan;
  
  50% 
    background-color: skyblue;
  
  100% 
    background-color: steelblue;
  
<svg id="svg"  ></svg>
<button id="button">button</button>

【讨论】:

以上是关于我正在使用点击事件触发CSS动画,为啥再次点击时动画不会再次运行?的主要内容,如果未能解决你的问题,请参考以下文章

移动端300ms的点击延迟以及解决方案

js触发css动画,可以重复触发

wpf点击checkbox触发了两次

为啥/何时我必须点击两次才能触发 iOS 上的点击

点击事件不会在动画图像视图上触发

为啥点击事件不适用于 iOS 上的 li 元素?