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

动画回放演示

相关推荐
葡萄城技术团队1 分钟前
AI 不会淘汰电子表格,反而会让电子表格成为 AI 操作系统
前端·人工智能
BigTopOne1 分钟前
Short Put and Short Call
前端
Cache技术分享13 分钟前
465. Java 反射 - 获取类的简单名
前端·后端
BigTopOne21 分钟前
什么是行权价,什么是权利金,什么是行权?
前端
xlxxy_23 分钟前
sap获取批次特性报表
java·linux·开发语言·前端·数据库·abap·mm
BigTopOne24 分钟前
Long put and Long call
前端
石像鬼₧魂石33 分钟前
【Y2Ksoft】贵阳陈桥饭店ERP管理系统
大数据·前端·物联网·html·数据库架构
TheITSea39 分钟前
4、React+Tailwind CSS
前端·css·react.js
我是大卫42 分钟前
【图】React源码解析-从源码数据结构、依赖算法、调度流水线到内存管理,深挖useEffect的全部核心机制
react.js·源码
weedsfly1 小时前
前端开发中的代理模式——从 Vue 3 响应式到日常开发
前端·javascript·面试