在React中实现CSS动画的回放

1. 使用key属性强制组件重载

React组件:

javascript 复制代码
import "./styles.css";
import React, { useState } from "react";

export default function App() {
  const [key, setKey] = useState(0);

  const replay = () => {
    setKey((prevKey) => prevKey + 1); // 改变key,触发组件重新渲染
  };

  return (
    <div className="App">
      <div key={key} className="animated-element">
        内容
      </div>
      <button onClick={replay}>重播</button>
    </div>
  );
}

CSS动画:

css 复制代码
.App {
  font-family: sans-serif;
  text-align: center;
}

.animated-element {
  animation: fadeIn 1s ease-in-out;
}

@keyframes fadeIn {
  from {
    opacity: 0;
    transform: translateY(-20px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

缺点是会导致组件完全重新挂载,可能影响性能。

2.通过重置类名触发动画重播

React组件:

javascript 复制代码
import "./styles.css";
import React, { useState } from "react";

export default function App() {
  const [isAnimating, setIsAnimating] = useState(true);

  const replay = () => {
    // 1. 先移除动画类
    setIsAnimating(false);
    // 2. 在下一帧重新添加,触发动画重播
    requestAnimationFrame(() => {
      setIsAnimating(true);
    });
  };

  return (
    <div className="App">
      <div className={`${isAnimating ? "animated-element" : ""}`}>内容</div>
      <button onClick={replay}>重播</button>
    </div>
  );
}

CSS动画同上。

这种方式需要注意的是toggle类名的时候要在下一帧重新添加,否则会被React合并导致不生效。优点是简单直接,性能好。对于大多数简单场景,重置类名是性能和复杂度平衡的最佳选择。

动画回放演示

相关推荐
小小小小宇17 小时前
普通 H5 新版本部署后通知用户更新方案
前端
小陈工18 小时前
Python异步编程进阶:asyncio高级模式与性能调优
开发语言·前端·数据库·人工智能·python·flask·numpy
小小小小宇18 小时前
App 内嵌 H5 秒开技术方案
前端
烛阴18 小时前
TEngine 入门系列(二):三件套环境搭建 -- Unity + TEngine + AI 助手
前端·c#·unity3d
逍遥归来18 小时前
如何在 Jenkins 打包流程中接入 SwiftLint 自动化扫描
前端
wuxianda103018 小时前
uniapp项目上架苹果商店4.3a被拒,3天极速解决方案2026.5.8
前端·人工智能·flutter·uni-app·ios上架·苹果上架·苹果4.3a
前端毕业班18 小时前
前端"枚举"管理指南
前端·javascript
yuandiv18 小时前
告别"薛定谔的测试":Flaky Test 全链路治理实战
前端
明月_清风18 小时前
Claude Code 保姆级入门教程:零基础到 AI 编程高手,看这一篇就够了
前端·后端·claude
ricardo197319 小时前
手写一个虚拟列表,万级数据滚动 FPS 稳定 60 帧
前端