在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合并导致不生效。优点是简单直接,性能好。对于大多数简单场景,重置类名是性能和复杂度平衡的最佳选择。

动画回放演示

相关推荐
福兮说6 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6667 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)8 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan8 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_9 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒9 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技9 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu10 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
weixin_4482902510 小时前
书庐开发实战教学
javascript·css·html