当前位置:首页 > React

react 实现动画

2026-01-26 13:20:05React

使用 CSS Transition 实现简单动画

在 React 中可以通过 CSS Transition 实现元素状态变化的平滑过渡效果。通过 className 或 style 属性的变化触发 CSS 动画。

import { useState } from 'react';

function FadeInOut() {
  const [isVisible, setIsVisible] = useState(false);

  return (
    <div>
      <button onClick={() => setIsVisible(!isVisible)}>
        Toggle
      </button>
      <div 
        className={`box ${isVisible ? 'fade-in' : 'fade-out'}`}
      >
        Content
      </div>
    </div>
  );
}
.box {
  transition: opacity 0.5s ease;
}
.fade-in {
  opacity: 1;
}
.fade-out {
  opacity: 0;
}

使用 React Spring 实现物理动画

React Spring 是基于物理的动画库,适合需要自然运动效果的场景。它支持弹簧动画而非传统的时间曲线。

react 实现动画

import { useSpring, animated } from 'react-spring';

function SpringDemo() {
  const props = useSpring({
    opacity: 1,
    from: { opacity: 0 },
    config: { duration: 1000 }
  });

  return <animated.div style={props}>I will fade in</animated.div>;
}

使用 Framer Motion 实现复杂动画

Framer Motion 提供了声明式的动画 API,支持手势动画、布局动画和复杂的关键帧动画。

react 实现动画

import { motion } from 'framer-motion';

function MotionDemo() {
  return (
    <motion.div
      initial={{ scale: 0 }}
      animate={{ scale: 1 }}
      transition={{ duration: 0.5 }}
      whileHover={{ scale: 1.2 }}
      whileTap={{ scale: 0.8 }}
    >
      Interactive
    </motion.div>
  );
}

使用 React Transition Group 实现组件过渡

React Transition Group 帮助管理组件的挂载和卸载动画,特别适合路由过渡或列表项动画。

import { CSSTransition } from 'react-transition-group';

function TransitionDemo() {
  const [inProp, setInProp] = useState(false);

  return (
    <div>
      <CSSTransition
        in={inProp}
        timeout={300}
        classNames="alert"
        unmountOnExit
      >
        <div>Content</div>
      </CSSTransition>
      <button onClick={() => setInProp(!inProp)}>
        Toggle
      </button>
    </div>
  );
}
.alert-enter {
  opacity: 0;
}
.alert-enter-active {
  opacity: 1;
  transition: opacity 300ms;
}
.alert-exit {
  opacity: 1;
}
.alert-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

使用 requestAnimationFrame 实现自定义动画

对于需要完全控制的复杂动画,可以直接使用 requestAnimationFrame API。

import { useRef, useEffect } from 'react';

function CustomAnimation() {
  const ref = useRef(null);

  useEffect(() => {
    let start;
    const element = ref.current;

    function step(timestamp) {
      if (!start) start = timestamp;
      const progress = timestamp - start;
      element.style.transform = `translateX(${Math.min(progress/10, 200)}px)`;
      if (progress < 2000) {
        window.requestAnimationFrame(step);
      }
    }

    window.requestAnimationFrame(step);
  }, []);

  return <div ref={ref}>Moving</div>;
}

每种方法适用于不同场景:CSS Transition 适合简单状态变化,React Spring 适合物理动画,Framer Motion 适合复杂交互动画,React Transition Group 适合组件过渡,requestAnimationFrame 提供最低层的控制。

标签: 动画react
分享给朋友:

相关文章

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

如何运行react

如何运行react

运行 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过官网 Node.js 下载并安装最新稳定版本。安装完成后,验证版本: node…

react 如何操作cookie

react 如何操作cookie

安装依赖 在React项目中操作cookie通常需要第三方库的支持,推荐使用js-cookie。通过npm或yarn安装: npm install js-cookie # 或 yarn add js…

如何读react源码

如何读react源码

理解React源码的结构 React源码托管在GitHub上,主要分为几个核心模块:react、react-dom、react-reconciler等。react包包含核心API和组件逻辑,react…

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…

react如何修改值

react如何修改值

修改 React 组件的值 在 React 中修改值通常涉及状态管理。根据组件的类型(类组件或函数组件)和状态管理方式(本地状态或全局状态),方法有所不同。 使用 useState(函数组件) 在函…