当前位置:首页 > 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中实现拖拽效果可以通过原生HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明。 使用HTML5拖拽API HTML5提供…

css制作卷边效果

css制作卷边效果

使用伪元素和渐变实现卷边效果 通过CSS伪元素和线性渐变可以模拟纸张卷边的视觉效果。这种方法不需要额外元素,仅通过::before或::after伪元素实现。 .element { positi…

vue实现放大效果

vue实现放大效果

使用 CSS 过渡实现放大效果 通过 Vue 的 v-bind:class 或 v-bind:style 动态绑定 CSS 类或样式,结合 CSS 的 transform: scale() 实现平滑过…

vue实现对话框效果

vue实现对话框效果

Vue 对话框实现方法 使用组件化方式封装对话框 创建一个独立的对话框组件(如Dialog.vue),通过v-model控制显示隐藏: <template> <div cla…

jquery 效果

jquery 效果

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。jQuery 提供了丰富的效果(Effects)功能,可以轻松实现元素的动态显…

vue实现翻页效果

vue实现翻页效果

使用Vue实现翻页效果 在Vue中实现翻页效果通常需要结合分页组件和数据处理逻辑。以下是几种常见方法: 基础分页组件实现 <template> <div> &l…