当前位置:首页 > React

react 实现页面切换动画

2026-01-27 13:37:59React

使用 React Router 和 CSS 过渡动画

在 React 中实现页面切换动画可以通过结合 React Router 和 CSS 过渡效果来完成。React Router 提供了路由切换的钩子,而 CSS 可以定义动画效果。

安装必要的依赖:

npm install react-router-dom

定义路由和动画组件:

import { Switch, Route, useLocation } from 'react-router-dom';
import { AnimatePresence, motion } from 'framer-motion';

function App() {
  const location = useLocation();

  return (
    <AnimatePresence exitBeforeEnter>
      <Switch location={location} key={location.pathname}>
        <Route exact path="/">
          <motion.div
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
          >
            <HomePage />
          </motion.div>
        </Route>
        <Route path="/about">
          <motion.div
            initial={{ opacity: 0 }}
            animate={{ opacity: 1 }}
            exit={{ opacity: 0 }}
          >
            <AboutPage />
          </motion.div>
        </Route>
      </Switch>
    </AnimatePresence>
  );
}

使用 Framer Motion 库

Framer Motion 是一个专门为 React 设计的动画库,可以轻松实现复杂的页面过渡效果。

安装 Framer Motion:

npm install framer-motion

实现页面过渡:

react 实现页面切换动画

import { motion } from 'framer-motion';

const PageTransition = ({ children }) => (
  <motion.div
    initial={{ x: 300, opacity: 0 }}
    animate={{ x: 0, opacity: 1 }}
    exit={{ x: -300, opacity: 0 }}
    transition={{ type: 'spring', stiffness: 100 }}
  >
    {children}
  </motion.div>
);

function HomePage() {
  return (
    <PageTransition>
      <h1>Home Page</h1>
    </PageTransition>
  );
}

使用 React Transition Group

React Transition Group 提供了组件进入和离开的过渡管理,适合需要更精细控制的场景。

安装 React Transition Group:

npm install react-transition-group

配置 CSS 过渡:

.page-enter {
  opacity: 0;
  transform: translateX(100%);
}

.page-enter-active {
  opacity: 1;
  transform: translateX(0);
  transition: all 300ms ease-in;
}

.page-exit {
  opacity: 1;
  transform: translateX(0);
}

.page-exit-active {
  opacity: 0;
  transform: translateX(-100%);
  transition: all 300ms ease-out;
}

实现组件:

react 实现页面切换动画

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

function App() {
  return (
    <TransitionGroup>
      <CSSTransition
        key={location.key}
        classNames="page"
        timeout={300}
      >
        <Switch location={location}>
          <Route exact path="/" component={HomePage} />
          <Route path="/about" component={AboutPage} />
        </Switch>
      </CSSTransition>
    </TransitionGroup>
  );
}

自定义 Hook 实现动画

对于需要更灵活控制的场景,可以创建自定义 Hook 来管理页面动画。

实现自定义 Hook:

import { useState, useEffect } from 'react';

function usePageAnimation() {
  const [animate, setAnimate] = useState(false);

  useEffect(() => {
    setAnimate(true);
    return () => setAnimate(false);
  }, []);

  return {
    style: {
      opacity: animate ? 1 : 0,
      transform: animate ? 'translateY(0)' : 'translateY(20px)',
      transition: 'all 0.3s ease'
    }
  };
}

function PageComponent() {
  const animation = usePageAnimation();

  return (
    <div style={animation.style}>
      <h1>Animated Page</h1>
    </div>
  );
}

性能优化建议

页面动画可能会影响性能,特别是在移动设备上。确保动画使用硬件加速,避免使用可能引起重排的属性。

优化 CSS:

.optimized-animation {
  will-change: transform, opacity;
  transform: translateZ(0);
  backface-visibility: hidden;
  perspective: 1000px;
}

限制动画复杂度,避免同时运行多个复杂动画。使用 requestAnimationFrame 替代 setTimeout 进行 JavaScript 动画。

标签: 页面动画
分享给朋友:

相关文章

vue加载动画实现

vue加载动画实现

Vue 加载动画的实现方法 在 Vue 中实现加载动画可以通过多种方式完成,以下是一些常见的方法: 使用 CSS 动画 通过 CSS 定义动画效果,结合 Vue 的动态类绑定或条件渲染控制动画的显示…

vue实现共享动画

vue实现共享动画

Vue 共享动画实现方法 使用 Vue Transition 组件 Vue 内置的 Transition 组件可以实现元素进入/离开的过渡效果。通过命名过渡和 mode 属性可以控制多个元素的过渡顺序…

vue实现页面切换

vue实现页面切换

Vue 实现页面切换的方法 在 Vue 中实现页面切换通常可以通过以下几种方式完成,具体选择取决于项目需求和架构设计。 使用 Vue Router Vue Router 是 Vue.js 官方推荐的…

vue页面实现日历

vue页面实现日历

实现基础日历布局 使用Vue的模板语法构建日历的基本HTML结构,通常需要包含星期标题和日期格子。月份切换按钮可以通过v-on绑定事件。 <template> <div cla…

vue实现共享动画

vue实现共享动画

Vue 实现共享动画的方法 在 Vue 中实现共享动画(即多个元素间平滑过渡的动画效果)可以通过 Vue 的过渡系统和第三方库(如 GSAP)来实现。以下是几种常见方法: 使用 Vue 的 <…

h5页面如何实现

h5页面如何实现

实现H5页面的方法 H5页面是基于HTML5技术的网页,通常用于移动端和响应式设计。以下是实现H5页面的关键步骤和技术要点。 基础结构 使用HTML5的DOCTYPE声明作为页面的起始。HTML5简…