You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JS函数输出新文本时触发关键帧动画重复执行

解决方案:点击按钮触发单次动画并更新文本

修改思路

  • 将动画从div的默认样式中拆分出来,做成独立的CSS类,仅在需要时触发
  • 点击按钮时更新文本,通过添加/移除动画类来触发单次动画,同时处理浏览器重绘问题确保动画能重复触发

完整代码

<!DOCTYPE html>
<html>
<head>
  <style>
    #output {
      position: relative;
    }

    /* 单次动画类 */
    .animate {
      animation: anim 1s linear;
    }

    @keyframes anim {
      from {
        top: 0px;
      }
      to {
        top: 100px;
      }
    }
  </style>
</head>
<body>
  <button type="button" id="btn">
    <p>点击触发函数</p>
  </button>
  <div id="output">Js输出显示在这里</div>

  <script>
    const btn = document.getElementById('btn');
    const outputDiv = document.getElementById('output');
    // 模拟不同输出内容
    const textPool = ['第一个输出', '第二个输出', '第三个输出', '更新后的文本'];
    let currentIndex = 0;

    btn.addEventListener('click', () => {
      // 更新div文本
      outputDiv.textContent = textPool[currentIndex];
      currentIndex = (currentIndex + 1) % textPool.length;

      // 触发动画:先移除类,强制重绘后再添加
      outputDiv.classList.remove('animate');
      void outputDiv.offsetWidth;
      outputDiv.classList.add('animate');
    });

    // 动画结束后清理类,避免影响下次触发
    outputDiv.addEventListener('animationend', () => {
      outputDiv.classList.remove('animate');
    });
  </script>
</body>
</html>

关键细节说明

  • CSS动画调整:去掉原代码中的infinite,将动画定义在单独的类中,默认div不执行动画,只有添加类时才会运行一次
  • JS触发逻辑:
    • 点击时先更新文本,再通过移除再添加动画类触发动画
    • void outputDiv.offsetWidth;是关键:强制浏览器重新计算元素布局,否则快速的移除/添加类操作会被浏览器忽略,导致动画不生效
    • 监听animationend事件,动画结束后自动移除类,保证每次点击都能重新触发动画

内容的提问来源于stack exchange,提问作者sdrogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:01:19