代码 🚀纯CSS实现3D翻书特效!无JavaScript也能玩出花

2025-05-15 10:22:08 +0800 CST views 538

🚀纯CSS实现3D翻书特效!无JavaScript也能玩出花

想要实现翻书效果,但不想写JavaScript?那你一定不能错过这个纯CSS打造的3D翻页特效!不仅炫酷,还能让你对 CSS 3D 有更深刻的理解!


🌟 效果亮点

  • 逼真3D翻页:页面翻动就像真实的纸质书一样顺滑自然。
  • 完全纯CSS实现:不依赖 JavaScript,性能出众、逻辑简单。
  • 优秀交互体验:通过点击实现翻页,简单直观。

💡 技术揭秘

这个酷炫效果的核心依赖于 CSS 的几个高级特性:

技术说明
transform-style: preserve-3d创建真正的 3D 空间
perspective设置视觉透视深度
rotateY控制页面绕Y轴翻转
transition实现平滑翻转动画
:checked 伪类利用隐藏单选按钮实现翻页状态控制

这意味着:只要 HTML + CSS,就能实现真正意义上的 3D 翻书效果!


📦 完整源码

下面是一个可以直接复制使用的完整HTML页面:

📁 无依赖,一张 HTML 文件即可跑起来!

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>纯CSS 3D翻书特效</title>
  <style>
    :root {
      --body-bg: #FAFAFA;
      --page-bg: #F5F5F5;
      --dark-text: #2A2935;
      --baseline: 10px;
      --title: "Cormorant Garamond", serif;
      --base-size: calc(var(--baseline) * 1.2);
    }

    * {
      box-sizing: border-box;
    }

    body {
      background-color: var(--body-bg);
      height: 100vh;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
    }

    .cover {
      width: calc(var(--baseline) * 60);
      height: calc(var(--baseline) * 42.6);
      box-shadow: 0 0 100px rgba(0, 0, 0, 0.3);
    }

    .book {
      width: 100%;
      height: 100%;
      display: flex;
      perspective: 1200px;
    }

    .book__page {
      position: relative;
      width: 50%;
      height: 100%;
      display: grid;
      transform: rotateY(0deg);
      transition: transform 0.9s cubic-bezier(0.645, 0.045, 0.355, 1);
      transform-origin: 0% 0%;
      background-color: var(--page-bg);
      background-image: linear-gradient(90deg, rgb(227, 227, 227) 0%, rgba(247, 247, 247, 0) 18%);
    }

    .book__page:nth-of-type(1) {
      background-image: linear-gradient(-90deg, rgb(227, 227, 227) 0%, rgba(247, 247, 247, 0) 18%);
    }

    .book__page img {
      max-width: 100%;
      max-height: 100%;
      object-fit: contain;
    }

    .book__page--1 {
      cursor: pointer;
      overflow: hidden;
    }

    .book__page--1 img {
      width: 100%;
      height: auto;
    }

    .book__page--2 {
      position: absolute;
      right: 0;
      pointer-events: none;
      transform-style: preserve-3d;
      background-color: var(--page-bg);
    }

    .book__page--4 {
      cursor: pointer;
      padding: 0 calc(var(--baseline) * 3);
    }

    .book__page-front,
    .book__page-back {
      position: absolute;
      width: 100%;
      height: 100%;
    }

    .book__page-front {
      transform: rotateY(0deg) translateZ(1px);
    }

    .book__page-back {
      padding: 0 calc(var(--baseline) * 1.8);
      transform: rotateY(180deg) translateZ(1px);
    }

    .book__page .page__content {
      padding: var(--baseline);
      height: 100%;
      text-align: center;
      overflow: hidden;
      padding-bottom: calc(var(--baseline) * 2.5);
    }

    .page__number {
      position: absolute;
      bottom: var(--baseline);
      width: calc(100% - var(--baseline) * 2);
      font-family: var(--title);
      font-size: calc(var(--base-size) * 0.67);
      text-align: center;
    }

    .book input[type=radio] {
      display: none;
    }

    .book input[type=radio]:checked + .book__page {
      transform: rotateY(-180deg);
    }
  </style>
</head>
<body>
  <div class="cover">
    <div class="book">
      <!-- 封面页 -->
      <label for="page-1" class="book__page book__page--1">
        <img src="https://pic4.zhimg.com/100/v2-9954c8b4d3a25100ec107aff1c1c7737_r.jpg" alt="封面图片">
      </label>

      <!-- 第四页 -->
      <label for="page-2" class="book__page book__page--4">
        <div class="page__content">
          <img src="https://picx.zhimg.com/100/v2-a5cbc5244d3c660093390b26c7f4a8c7_r.jpg" alt="内容图片">
          <div class="page__number">3</div>
        </div>
      </label>

      <!-- 控制按钮 -->
      <input type="radio" name="page" id="page-1" />
      <input type="radio" name="page" id="page-2" />

      <!-- 第二页(翻转页) -->
      <label class="book__page book__page--2">
        <div class="book__page-front">
          <div class="page__content">
            <img src="https://picx.zhimg.com/v2-faaaa787399a99d96953af8b6e578b2a_r.jpg" alt="正面图片">
            <div class="page__number">1</div>
          </div>
        </div>
        <div class="book__page-back">
          <div class="page__content">
            <img src="https://pic1.zhimg.com/100/v2-2c46c59eb7aecf6618b52b0ac86e98a4_r.jpg" alt="背面图片">
            <div class="page__number">2</div>
          </div>
        </div>
      </label>
    </div>
  </div>
</body>
</html>

🔚 总结

虽然这个小项目可能不会直接应用于正式产品中,但它是一个非常适合练习 CSS3 变换与 3D 动画的案例。通过它你可以:

  • 掌握 perspectivetransform-style 的用法
  • 利用 :checked 实现无 JS 状态切换
  • 制作视觉吸引力强的交互动效

喜欢的话不妨点个赞或收藏,也欢迎动手尝试更复杂的翻页逻辑!😉


📎 衍生玩法建议

  • 加入更多页,实现完整书本
  • 页面内添加文字内容
  • 自动翻页动画(可配合 JS 后续扩展)

推荐文章

Vue3 实现页面上下滑动方案
2025-06-28 17:07:57 +0800 CST
`Blob` 与 `File` 的关系
2025-05-11 23:45:58 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
JS 箭头函数
2024-11-17 19:09:58 +0800 CST
如何在 Vue 3 中使用 TypeScript?
2024-11-18 22:30:18 +0800 CST
Vue中的异步更新是如何实现的?
2024-11-18 19:24:29 +0800 CST
Vue3中如何进行异步组件的加载?
2024-11-17 04:29:53 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
H5抖音商城小黄车购物系统
2024-11-19 08:04:29 +0800 CST
Vue3中如何扩展VNode?
2024-11-17 19:33:18 +0800 CST
底部导航栏
2024-11-19 01:12:32 +0800 CST
JavaScript 异步编程入门
2024-11-19 07:07:43 +0800 CST
程序员茄子在线接单