耽误你一杯咖啡的时间,教你用纯 CSS 来实现这个翻书效果

2,332 阅读5分钟

前言

翻书,想必大伙都有过。但是如何使用纯 CSS 来实现这样一个效果呢?于是,抱着试一试的心态,使用纯 CSS 做了一个翻书的效果来体验一下。下面是最终效果。

码上掘金

过程分析

现在我们来分析一下这个效果是如何实现的。从效果上猜测,这个翻书少不了动画的帮助,因此我们需要使用到 CSS 动画效果。

image.png

我们可以将整个翻书分为以上几个部分:封面 + 内容。然后通过加入 CSS 动画效果让它翻转起来,就可以达到一个翻书效果了。接下来我们便来实现一下它们吧。

封面 + 内容

这一部分就是 HTML 结构的设计了,需要将书的基本结构和样式完成。

<div class="book preserve-3d">
	<div class="book-page-box book-page-4 preserve-3d">
		<div class="book-page page-front">
			<p>第三页</p>
		</div>
	</div>
	<div class="book-page-box book-page-3 preserve-3d flip-animation-3">
		<div class="book-page page-front">
			<p>第二页</p>
		</div>
	</div>
	<div class="book-page-box book-page-2 preserve-3d flip-animation-2">
		<div class="book-page page-front">
			<p>第一页</p>
		</div>
	</div>
	<div class="book-page-box book-page-1 preserve-3d flip-animation-1">
		<div class="book-page page-front">
			<p>
			  翻页特效
			</p>
		</div>
	</div>
</div>

我们先设置第一个类名为 bookdiv 元素,表示这是一个书本的容器。接下来的四个 div 元素都有一个类名为 book-page-box,表示它们是书本的页面容器,其中包含一个类名为 book-pagediv 元素,用于显示页面内容。我们需要为每个元素设置多个类名,用于控制翻页动画的序号。

在页面容器里,碰到类名 book-page-XX 表示这是第几页,碰到类名 preserve-3d 表示保持 3D 效果,碰到类名 flip-animation-XX 表示在翻页时会使用第几个动画。

类名一旦多起来,相关样式就会变得复杂,这时候类名的语义化就显得极为重要,因为这样我们就可以通过类名来知道我们的样式是何作用。下面就将介绍相关动画的书写了。

CSS 动画

这里就到了整个过程最关键的部分了 —— CSS 动画。

body, html {
	height: 100%;
}
body {
	perspective: 1000px;
	background-color: #212121;
	font-family: '微软雅黑';
}
.book {
	position: absolute;
	top: 50%;
	left: 50%;
	margin-top: -150px;
	width: 300px;
	height: 300px;
	background-color: #fff;
	transform: rotateX(30deg);
}
.preserve-3d {
	transform-style: preserve-3d;
}
.book-page {
	position: absolute;
	top: 0;
	left: 0;
	width: 300px;
	height: 300px;
	border: 1px solid #1976D2;
	text-align: center;
}
.book-page-box {
	transform-origin: 0 50%;
	transform: rotateY(0deg);
}
.book-page-1 .page-front {
	background-color: #1976D2;
}
.book-page-1 .page-back {
	background-color: #fff;
}
.book-page-1 .page-front p {
	font-size: 30px;
	color: #fff;
	margin-top: 100px;
}
.flip-animation-1 {
	animation: flipBook1 17s;
}
.book-page-2 .page-back, .book-page-2 .page-front {
	background-color: #fff;
}
.book-page-2 .page-front p {
	font-size: 30px;
	color: #1976D2;
	margin-top: 100px;
}
.flip-animation-2 {
	animation: flipBook2 13s 2s;
}
.book-page-3 .page-back, .book-page-3 .page-front {
	background-color: #fff;
}
.book-page-3 .page-front p {
	font-size: 30px;
	color: #1976D2;
	margin-top: 100px;
}
.flip-animation-3 {
	animation: flipBook3 10s 3s;
}
.book-page-4 .page-front p {
	font-size: 30px;
	color: #1976D2;
	margin-top: 100px;
}

整个页面被设置为 100% 高度,并使用 perspective 属性来创建透视效果。perspective 属性指定了观察者与 z=0 平面的距离,使具有三维位置变换的元素产生透视效果。z>0 的三维元素比正常大,而 z<0 时则比正常小,大小程度由该属性的值决定。

书设置为绝对定位,并在 X 轴上旋转 30 度,同时使用 transform-style 属性来保持 3D 效果。这里的 30 度是怎么体现的?其实就是将整个书往上“ 翘了30 度。

image.png

每一页设置为绝对定位,并在 Y 轴上旋转,使用不同的动画效果来模拟翻页的效果,这里的动画效果后面都会介绍。每一页的正反面都被设置了不同的背景颜色,并在前面的页面上添加了文本。每个页面都有一个独立的类名,用于在 CSS 中定义不同的动画效果。

下面是不同的动画效果代码。这是三个不同的 CSS 动画,每个动画都使用了 @keyframes 规则来定义动画的关键帧。

@keyframes flipBook1 {
	0% {
		transform: rotateY(0deg);
	}
	50% {
		transform: rotateY(-160deg);
	}
	100% {
		transform: rotateY(0deg);
	}
}
@keyframes flipBook2 {
	0% {
		transform: rotateY(0deg);
	}
	50% {
		transform: rotateY(-150deg);
	}
	100% {
		transform: rotateY(0deg);
	}
}
@keyframes flipBook3 {
	0% {
		transform: rotateY(0deg);
	}
	50% {
		transform: rotateY(-140deg);
	}
	100% {
		transform: rotateY(0deg);
	}
}

这里每个动画都有三个关键帧,分别是 0%50%100%。在每个关键帧中,都定义了一个旋转变换,使元素绕 Y 轴旋转一定角度,这样就实现翻转效果了。其中在我们这段代码中,第一个动画旋转角度为 160 度,第二个动画旋转角度为 150 度,第三个动画旋转角度为 140 度。这里的度数可以自定义,通过这样的旋转来达成翻书的效果。

以上这里所有的代码省略了以 -webkit- 等为前缀的属性,这些前缀的作用是为了兼容旧版本的浏览器,如果想参考更详细的代码,可以进入码上掘金查看。

码上掘金

总结

以上就是整个效果的实现过程了,总的来说就是使用 CSS 动画效果来实现一个这样的简易翻书效果。如果大家还有更好的实现方式的话,欢迎各位在评论区告诉我~

本文正在参加「金石计划」