当前位置:首页 > React

react实现翻书动画效果

2026-01-27 09:28:14React

React 实现翻书动画效果

在 React 中实现翻书动画效果可以通过 CSS 动画和状态管理结合实现。以下是两种常见的方法:

使用 CSS 3D 变换和过渡

通过 CSS 的 transformtransition 属性实现翻页的 3D 效果。

react实现翻书动画效果

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

const BookPage = ({ isFlipped, content }) => {
  return (
    <div className={`page ${isFlipped ? 'flipped' : ''}`}>
      <div className="front">{content.front}</div>
      <div className="back">{content.back}</div>
    </div>
  );
};

const Book = () => {
  const [flipped, setFlipped] = useState(false);
  const content = {
    front: 'Front Content',
    back: 'Back Content'
  };

  return (
    <div className="book">
      <BookPage isFlipped={flipped} content={content} />
      <button onClick={() => setFlipped(!flipped)}>Flip Page</button>
    </div>
  );
};

export default Book;

对应的 CSS 文件(Book.css):

react实现翻书动画效果

.book {
  perspective: 1000px;
  width: 200px;
  height: 300px;
}

.page {
  width: 100%;
  height: 100%;
  position: relative;
  transform-style: preserve-3d;
  transition: transform 1s;
}

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

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

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

使用第三方动画库(如 Framer Motion)

Framer Motion 提供了更高级的动画控制,适合复杂的翻书效果。

import React, { useState } from 'react';
import { motion } from 'framer-motion';

const BookPage = ({ isFlipped, content }) => {
  return (
    <motion.div
      style={{
        width: '200px',
        height: '300px',
        position: 'relative',
        transformStyle: 'preserve-3d'
      }}
      animate={{ rotateY: isFlipped ? 180 : 0 }}
      transition={{ duration: 1 }}
    >
      <div
        style={{
          position: 'absolute',
          width: '100%',
          height: '100%',
          backfaceVisibility: 'hidden',
          background: 'white',
          border: '1px solid #ccc'
        }}
      >
        {content.front}
      </div>
      <div
        style={{
          position: 'absolute',
          width: '100%',
          height: '100%',
          backfaceVisibility: 'hidden',
          background: 'white',
          border: '1px solid #ccc',
          transform: 'rotateY(180deg)'
        }}
      >
        {content.back}
      </div>
    </motion.div>
  );
};

const Book = () => {
  const [flipped, setFlipped] = useState(false);
  const content = {
    front: 'Front Content',
    back: 'Back Content'
  };

  return (
    <div style={{ perspective: '1000px' }}>
      <BookPage isFlipped={flipped} content={content} />
      <button onClick={() => setFlipped(!flipped)}>Flip Page</button>
    </div>
  );
};

export default Book;

实现多页翻书效果

对于多页翻书效果,可以通过动态渲染多个页面并管理其翻转状态实现。

const MultiPageBook = () => {
  const [flippedPages, setFlippedPages] = useState([]);
  const pages = [
    { front: 'Page 1 Front', back: 'Page 1 Back' },
    { front: 'Page 2 Front', back: 'Page 2 Back' }
  ];

  const flipPage = (index) => {
    setFlippedPages(prev => {
      const newFlipped = [...prev];
      newFlipped[index] = !newFlipped[index];
      return newFlipped;
    });
  };

  return (
    <div style={{ perspective: '1000px' }}>
      {pages.map((page, index) => (
        <div key={index} style={{ marginBottom: '20px' }}>
          <BookPage
            isFlipped={flippedPages[index]}
            content={page}
          />
          <button onClick={() => flipPage(index)}>
            Flip Page {index + 1}
          </button>
        </div>
      ))}
    </div>
  );
};

注意事项

  1. 性能优化:避免频繁触发重渲染,尤其是多页场景下。
  2. 浏览器兼容性:CSS 3D 变换在某些旧浏览器中可能不支持。
  3. 触摸事件:如需支持移动端触摸翻页,可以结合 onTouchStartonTouchEnd 事件实现。

以上方法提供了从基础到高级的翻书动画实现方案,可根据实际需求选择适合的方式。

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

相关文章

vue实现气泡效果

vue实现气泡效果

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

h5页面滑动效果实现

h5页面滑动效果实现

实现H5页面滑动效果的方法 H5页面滑动效果可以通过多种方式实现,包括原生JavaScript、CSS动画或第三方库。以下是几种常见的方法: 使用CSS Scroll Snap CSS Scroll…

react如何添加效果

react如何添加效果

React 添加动画效果的方法 使用 CSS 过渡动画 在 React 组件中直接通过 className 或 style 属性应用 CSS 过渡效果。定义 CSS 类包含 transition 属性…

vue 实现分页效果

vue 实现分页效果

使用 Element UI 实现分页 Element UI 提供了现成的分页组件 el-pagination,适合快速集成到 Vue 项目中。 安装 Element UI: npm install…

vue 实现动画效果

vue 实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置过渡系统 Vue 的 <trans…

vue 实现拖动效果

vue 实现拖动效果

使用 Vue 实现拖动效果 Vue 提供了多种方式实现拖动效果,可以通过原生 HTML5 的拖放 API,也可以使用第三方库如 vuedraggable。以下是两种常见的方法: 使用 HTML5 拖…