当前位置:首页 > React

react实现翻页切换效果

2026-01-27 17:15:25React

使用React实现翻页切换效果

React中实现翻页切换效果可以通过多种方式完成,包括使用CSS动画、第三方库或自定义组件。以下是几种常见方法:

基于CSS过渡的翻页效果

利用React状态管理和CSS过渡实现基础翻页动画:

import React, { useState } from 'react';
import './PageFlip.css';

function PageFlip() {
  const [currentPage, setCurrentPage] = useState(0);
  const pages = ['Page 1', 'Page 2', 'Page 3'];

  const nextPage = () => {
    setCurrentPage((prev) => (prev + 1) % pages.length);
  };

  const prevPage = () => {
    setCurrentPage((prev) => (prev - 1 + pages.length) % pages.length);
  };

  return (
    <div className="page-container">
      <div className={`page ${currentPage ? 'flipped' : ''}`}>
        {pages[currentPage]}
      </div>
      <button onClick={prevPage}>Previous</button>
      <button onClick={nextPage}>Next</button>
    </div>
  );
}

配套CSS样式:

.page-container {
  perspective: 1000px;
}

.page {
  width: 300px;
  height: 400px;
  background: #fff;
  border: 1px solid #ddd;
  transition: transform 0.6s;
  transform-style: preserve-3d;
}

.page.flipped {
  transform: rotateY(180deg);
}

使用React Transition Group

React Transition Group提供更精细的过渡控制:

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

function PageTransition() {
  const [page, setPage] = useState(0);
  const pages = ['Page A', 'Page B', 'Page C'];

  return (
    <div>
      <CSSTransition
        in={true}
        key={page}
        timeout={500}
        classNames="page"
        unmountOnExit
      >
        <div className="page-content">{pages[page]}</div>
      </CSSTransition>
      <button onClick={() => setPage((p) => (p + 1) % pages.length)}>
        Next
      </button>
    </div>
  );
}

配套CSS:

.page-content {
  transition: opacity 500ms, transform 500ms;
}

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

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

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

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

使用Framer Motion动画库

Framer Motion提供声明式动画API:

import { motion, AnimatePresence } from 'framer-motion';

function FramerPageFlip() {
  const [[page, direction], setPage] = useState([0, 0]);
  const pages = ['Page X', 'Page Y', 'Page Z'];

  const paginate = (newDirection) => {
    setPage([(page + newDirection + pages.length) % pages.length, newDirection]);
  };

  return (
    <div className="framer-container">
      <AnimatePresence initial={false} custom={direction}>
        <motion.div
          key={page}
          custom={direction}
          variants={{
            enter: (direction) => ({
              x: direction > 0 ? 1000 : -1000,
              opacity: 0
            }),
            center: {
              x: 0,
              opacity: 1
            },
            exit: (direction) => ({
              x: direction < 0 ? 1000 : -1000,
              opacity: 0
            })
          }}
          initial="enter"
          animate="center"
          exit="exit"
          transition={{
            x: { type: 'spring', stiffness: 300, damping: 30 },
            opacity: { duration: 0.2 }
          }}
        >
          {pages[page]}
        </motion.div>
      </AnimatePresence>
      <button onClick={() => paginate(-1)}>Previous</button>
      <button onClick={() => paginate(1)}>Next</button>
    </div>
  );
}

实现3D翻页效果

结合CSS 3D变换创建更真实的翻页效果:

function PageFlip3D() {
  const [flipped, setFlipped] = useState(false);

  return (
    <div className="book">
      <div className={`page ${flipped ? 'flipped' : ''}`}>
        <div className="front">Front Content</div>
        <div className="back">Back Content</div>
      </div>
      <button onClick={() => setFlipped(!flipped)}>Flip Page</button>
    </div>
  );
}

配套CSS:

.book {
  perspective: 1500px;
}

.page {
  width: 200px;
  height: 300px;
  position: relative;
  transform-style: preserve-3d;
  transition: transform 1s;
}

.page .front,
.page .back {
  position: absolute;
  width: 100%;
  height: 100%;
  backface-visibility: hidden;
}

.page .back {
  transform: rotateY(180deg);
}

.page.flipped {
  transform: rotateY(180deg);
}

以上方法可根据具体需求选择,从简单过渡到复杂3D效果均可实现。关键点在于合理管理组件状态,配合CSS或动画库实现平滑过渡效果。

react实现翻页切换效果

标签: 翻页效果
分享给朋友:

相关文章

vue实现效果展示

vue实现效果展示

Vue 实现效果展示的方法 动态数据绑定展示 通过 Vue 的响应式特性,实时展示数据变化。例如,表单输入与预览同步: <template> <div> <…

vue翻页实现

vue翻页实现

Vue 翻页实现方法 在 Vue 中实现翻页功能通常需要结合分页组件和数据处理逻辑。以下是几种常见的实现方式: 使用 Element UI 分页组件 Element UI 提供了现成的分页组件 &l…

js实现滚动条效果

js实现滚动条效果

实现滚动条效果的方法 使用原生JavaScript实现滚动条 通过监听滚动事件,可以动态调整滚动条的位置和样式。以下是一个基础实现示例: // 获取DOM元素 const container =…

js实现图片滚动效果

js实现图片滚动效果

使用CSS动画实现图片滚动 通过CSS的@keyframes和animation属性实现无缝滚动效果。将图片容器设置为横向排列,通过动画平移位置。 <style> .scroll-c…

vue实现框架效果

vue实现框架效果

Vue实现框架效果的方法 使用Vue实现框架效果可以通过多种方式完成,包括使用Vue Router、动态组件或第三方UI库。以下是几种常见的方法: 使用Vue Router实现布局框架 Vue R…

vue实现气泡效果

vue实现气泡效果

实现气泡效果的方法 在Vue中实现气泡效果可以通过CSS动画、第三方库或自定义组件完成。以下是几种常见方法: 使用纯CSS动画 通过CSS的@keyframes和transform属性创建气泡上升…