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

(图片来源网络,侵删)
最终效果预览
我们来看一下最终实现的效果,它会像一本真实的书一样,有封面和内页,点击封面会翻开,显示内容页。
完整代码
你可以直接将以下代码保存为 .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)来让动画更接近真实书本翻页的“快-慢-快”节奏。
如何扩展和自定义?
-
添加多页:要创建一本多页的书,你需要为每一页都创建一个
.page元素,并精确控制它们的z-index和transition-delay(延迟),以确保它们按顺序翻页,这会让 CSS 变得非常复杂,通常需要 JavaScript 来辅助管理状态。
(图片来源网络,侵删) -
改变样式:你可以轻松修改
.cover和.page-content的背景色、边框、阴影等,来创建不同风格的书本。 -
动画方向:如果你想实现从右向左翻页(如日文书籍),只需将
transform-origin改为right center,并将所有rotateY的角度符号取反即可。
希望这个详细的解释和代码能帮助你理解并掌握 CSS3 翻页效果!
