下面我将为你提供一个完整、可运行的代码示例,并详细解释其实现原理。

css3 网页翻页效果代码
(图片来源网络,侵删)

最终效果预览

我们来看一下最终实现的效果,它会像一本真实的书一样,有封面和内页,点击封面会翻开,显示内容页。


完整代码

你可以直接将以下代码保存为 .html 文件,然后在浏览器中打开即可看到效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">CSS3 3D 翻页效果</title>
    <style>
        /* --- 全局样式和重置 --- */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            font-family: 'Arial', sans-serif;
            background: linear-gradient(135deg, #1e3c72, #2a5298);
            height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            perspective: 2000px; /* 关键:为 3D 变换设置透视距离 */
            overflow: hidden;
        }
        /* --- 书本容器 --- */
        .book {
            position: relative;
            width: 300px;
            height: 400px;
            transform-style: preserve-3d; /* 关键:让子元素也应用 3D 变换 */
            transition: transform 0.5s;
        }
        /* --- 书本的每一页 --- */
        .page {
            position: absolute;
            width: 100%;
            height: 100%;
            background-color: #fff;
            border-radius: 0 15px 15px 0;
            box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
            transform-origin: left center; /* 关键:设置变换的原点在左侧中心,模拟书本装订线 */
            transform-style: preserve-3d;
            transition: transform 1.5s cubic-bezier(0.645, 0.045, 0.355, 1); /* 使用贝塞尔曲线模拟真实的翻页效果 */
            backface-visibility: hidden; /* 关键:隐藏元素的背面,防止翻页时看到内容镜像 */
        }
        /* --- 封面 --- */
        .cover {
            background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 50%, #fecfef 100%);
            z-index: 2; /* 确保封面在最上层 */
            cursor: pointer;
        }
        .cover h1 {
            text-align: center;
            padding-top: 180px;
            font-size: 2.5em;
            color: #333;
            text-shadow: 2px 2px 4px rgba(0,0,0,0.1);
        }
        /* --- 第一页内容 --- */
        .page-content {
            background-color: #f9f9f9;
            padding: 40px;
            z-index: 1; /* 初始时在封面下方 */
        }
        .page-content h2 {
            color: #333;
            margin-bottom: 20px;
        }
        .page-content p {
            color: #555;
            line-height: 1.6;
            text-align: justify;
        }
        /* --- 翻转状态 --- */
        /* 当书本被添加 'flipped' 类时,封面和内容页的样式 */
        .book.flipped .cover {
            transform: rotateY(-180deg); /* 封面向后翻转 180 度 */
        }
        .book.flipped .page-content {
            transform: rotateY(-180deg); /* 内容页也向后翻转 180 度,从而展示正面 */
        }
        /* --- 装饰性阴影 --- */
        .book::before {
            content: '';
            position: absolute;
            top: 0;
            left: -5px;
            width: 5px;
            height: 100%;
            background: #000;
            opacity: 0.1;
            transform: rotateY(90deg);
            transform-origin: right;
        }
    </style>
</head>
<body>
    <div class="book" id="book">
        <div class="page cover">
            <h1>点击翻开</h1>
        </div>
        <div class="page page-content">
            <h2>欢迎来到 3D 世界</h2>
            <p>
                这是一个使用纯 CSS3 实现的 3D 翻页效果,我们利用了 `perspective`、`transform-style`、`transform-origin` 和 `backface-visibility` 等强大的属性。
            </p>
            <p>
                核心思想是:将书本的每一页看作一个独立的平面,通过改变其旋转角度(`rotateY`)和旋转轴心(`transform-origin`)来模拟真实的翻页动作。
            </p>
        </div>
    </div>
    <script>
        // 获取书本元素
        const book = document.getElementById('book');
        // 为书本添加点击事件
        book.addEventListener('click', function() {
            // 切换 'flipped' 类
            this.classList.toggle('flipped');
        });
    </script>
</body>
</html>

代码核心原理解释

实现这个效果的关键在于理解以下几个 CSS3 属性:

perspective (透视)

  • 作用:设置 3D 元素的透视距离,你可以把它想象成你的眼睛和屏幕之间的距离。
  • :一个像素值,值越大,透视效果越弱(看起来越“平”);值越小,透视效果越强(物体变形越厉害,越有立体感)。
  • 位置:通常设置在 3D 场景的父元素上(本例中的 body)。
  • 示例body { perspective: 2000px; }

transform-style: preserve-3d (保留 3D 空间)

  • 作用:这是一个至关重要的属性,它告诉浏览器,其子元素应该在 3D 空间中进行变换,而不是被“压扁”到 2D 平面上。
  • 位置:需要应用在直接参与 3D 变换的元素的父元素上(本例中的 .book.page)。
  • 示例.book { transform-style: preserve-3d; }

transform-origin (变换原点)

  • 作用:定义元素变换(如旋转、缩放)的中心点。
  • 位置:对于翻页效果,我们必须将原点设置在书本的装订线,也就是左侧中间,这样,页面就会围绕这条线进行旋转,而不是围绕页面中心。
  • 示例.page { transform-origin: left center; }

backface-visibility: hidden (隐藏背面)

  • 作用:当元素旋转到背面时(rotateY(180deg)),默认情况下你仍然能看到它的镜像图像,这个属性可以确保在元素背对我们时,它完全不可见。
  • 位置:应用在会旋转的页面上(本例中的 .page)。
  • 示例.page { backface-visibility: hidden; }

rotateY() (Y轴旋转)

  • 作用:这是实现翻页动画的核心,它让元素围绕垂直轴(Y轴)进行旋转。
  • 逻辑
    • 封面:初始状态是 rotateY(0deg),正面朝向我们,当添加 .flipped 类时,它变为 rotateY(-180deg),就翻到了背面,我们看不到它了。
    • 内容页:初始状态也是 rotateY(0deg),但因为它在封面的“背面”(通过 z-index 控制层级),所以看不到,当封面翻转到背面时,内容页也被 rotateY(-180deg) 翻转过来,它的正面就朝向我们了。

transition (过渡)

  • 作用:让 transform 属性的变化不再是瞬间完成,而是在一段时间内平滑过渡,形成动画效果。
  • 示例transition: transform 1.5s cubic-bezier(...); 我们使用了一个特殊的贝塞尔曲线(cubic-bezier)来让动画更接近真实书本翻页的“快-慢-快”节奏。

如何扩展和自定义?

  1. 添加多页:要创建一本多页的书,你需要为每一页都创建一个 .page 元素,并精确控制它们的 z-indextransition-delay(延迟),以确保它们按顺序翻页,这会让 CSS 变得非常复杂,通常需要 JavaScript 来辅助管理状态。

    css3 网页翻页效果代码
    (图片来源网络,侵删)
  2. 改变样式:你可以轻松修改 .cover.page-content 的背景色、边框、阴影等,来创建不同风格的书本。

  3. 动画方向:如果你想实现从右向左翻页(如日文书籍),只需将 transform-origin 改为 right center,并将所有 rotateY 的角度符号取反即可。

希望这个详细的解释和代码能帮助你理解并掌握 CSS3 翻页效果!