很多刚接触 CSS 动画的同学都会觉得它很难,其实就像学开车一样,先掌握油门刹车(基础属性),再练习复杂路况(组合动画),最后就能玩出漂移(惊艳效果)。今天咱们就按这个节奏,从最基础的动画属性讲起,一步步做出能让人眼前一亮的动画效果。
第一步:认识动画的 "油门和方向盘"
CSS 动画的核心就两个基础工具:transition(过渡)和@keyframes(关键帧)。咱们先从transition开始,它就像给元素的样式变化装了个 "缓冲器"。
比如一个普通的 div,默认状态是这样的:
css
.box {
width: 100px;
height: 100px;
background: #42b983;
}
当我们用 hover 改变它的样式时,没加 transition 会很生硬:
css
/* 生硬的变化 */
.box:hover {
width: 200px;
background: #ff4400;
}
加上transition后,变化就会变得平滑:
css
.box {
width: 100px;
height: 100px;
background: #42b983;
/* 关键代码:所有样式变化在0.5秒内完成 */
transition: all 0.5s;
}
这里的all表示所有样式变化都应用过渡,我们也可以指定具体属性,比如只让宽度变化有过渡:
css
transition: width 0.5s; /* 只有width变化会平滑过渡 */
transition还有两个重要参数:timing-function(时间函数)和delay(延迟)。时间函数就像控制动画的 "节奏",比如:
-
ease:默认值,先慢再快最后慢(适合按钮 hover)
-
linear:匀速(适合加载动画)
-
ease-in:开始慢(适合下拉菜单)
-
ease-out:结束慢(适合弹出提示)
试试这个带节奏的按钮效果:
css
.btn {
padding: 8px 16px;
background: #2c3e50;
color: white;
border: none;
border-radius: 4px;
/* 0.3秒过渡,节奏是ease-out */
transition: all 0.3s ease-out;
}
.btn:hover {
background: #3498db;
transform: translateY(-2px); /* 向上移动2px */
}

第二步:用关键帧制作 "自动播放" 的动画
transition需要触发(比如 hover),但很多时候我们需要动画自动播放,这时候就需要@keyframes了。它就像拍电影时的分镜脚本,定义了动画的关键画面。
比如制作一个不停旋转的加载图标:
css
/* 定义关键帧:从0度转到360度 */
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loader {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
/* 应用动画:使用spin关键帧,1秒完成,匀速,无限循环 */
animation: spin 1s linear infinite;
}
@keyframes里可以定义多个关键帧,让动画更丰富。比如做一个 "呼吸灯" 效果:
css
@keyframes breathe {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(1.1); /* 放大到1.1倍 */
opacity: 0.7; /* 半透明 */
}
100% {
transform: scale(1);
opacity: 1;
}
}
.light {
width: 20px;
height: 20px;
background: #e74c3c;
border-radius: 50%;
animation: breathe 2s ease-in-out infinite;
}
animation属性还有很多实用参数,比如:
-
animation-iteration-count: 3:只播放 3 次
-
animation-direction: alternate:播放完反向再播
-
animation-fill-mode: forwards:动画结束后保持最后状态
第三步:打造惊艳的 3D 翻书动画
掌握了基础属性,我们来做一个能撑场面的 3D 翻书动画。这个效果的关键是利用transform-style: preserve-3d开启 3D 空间,配合perspective设置透视感。
HTML 结构
html
<div class="book-container">
<div class="book">
<div class="book-page front">封面</div>
<div class="book-page back">内页</div>
</div>
</div>
CSS 样式
css
/* 容器:设置透视,让3D效果更真实 */
.book-container {
perspective: 1200px; /* 数值越小,透视感越强 */
width: 300px;
height: 400px;
margin: 50px auto;
}
/* 书本容器:开启3D空间 */
.book {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d; /* 关键:让子元素保持3D关系 */
transition: transform 1s cubic-bezier(0.645, 0.045, 0.355, 1);
}
/* 书页样式 */
.book-page {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden; /* 隐藏背面,避免翻转时穿帮 */
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
font-weight: bold;
color: white;
}
/* 封面 */
.front {
background: #3498db;
}
/* 内页:初始翻转180度,让背面朝上 */
.back {
background: #2ecc71;
transform: rotateY(180deg);
}
/* 鼠标悬停时翻转书本 */
.book-container:hover .book {
transform: rotateY(-180deg);
}
让动画更惊艳的细节处理
1. 3D 透视增强
css
.book-container {
perspective: 1500px;
}
- 效果:设置更大的透视值(1500px),使 3D 效果更自然,避免视角过近导致的变形感
- 原理:perspective 值越大,观察者与物体的距离越远,3D 效果越平缓
2. 旋转轴心调整
css
.book {
transform-origin: left center;
}
- 效果:将旋转中心设为左侧边缘,模拟真实书本的翻页效果
- 对比:默认旋转中心为元素中心,会产生 "悬浮" 翻页的不真实感
3. 翻页角度优化
css
.book:hover {
transform: rotateY(-160deg);
}
- 效果:设置略小于 180° 的旋转角度(-160°),模拟真实翻书时的最大角度
- 细节:角度过大会导致背面书页看起来 "贴脸",破坏立体感
4. 书页厚度模拟
css
.book::before {
content: '';
position: absolute;
width: 10px;
background: linear-gradient(to right, #1a5276, #1e8449);
transform: rotateY(90deg) translateX(-5px);
}
- 效果:通过伪元素创建书脊,增加书本的真实厚度感
- 技巧:使用渐变让书脊颜色与封面封底自然过渡
5. 动态阴影效果
css
.book:hover .front {
box-shadow: -15px 5px 30px rgba(0,0,0,0.3);
}
- 效果:翻页时封面产生向左偏移的阴影,增强空间层次感
- 原理:阴影方向与翻页方向相反,模拟光线照射下的真实投影
6. 不对称圆角设计
css
.book-page {
border-radius: 5px 15px 15px 5px;
}
- 效果:右侧圆角更大,模拟真实书本右侧边缘的自然弯曲
- 细节:左侧圆角小,避免与书脊重叠时产生视觉冲突
7. 渐变背景增强
css
.front {
background: linear-gradient(135deg, #3498db, #2980b9);
}
.back {
background: linear-gradient(135deg, #2ecc71, #27ae60);
}
- 效果:使用渐变代替纯色背景,增加书页的光影质感
- 技巧:135° 渐变方向与翻页方向一致,增强立体感
8. 过渡时间优化
css
.book {
transition: transform 1.2s ease-in-out;
}
- 效果:设置较长的过渡时间(1.2 秒),使翻页动作更显优雅从容
- 对比:过短的时间(如 0.5 秒)会让动画显得急促生硬
这个 3D 翻书动画结合了我们学过的所有知识:transition控制整体过渡,transform实现 3D 旋转,@keyframes(如果加自动翻页效果)控制播放,再加上细节处理,就能做出让人眼前一亮的效果。

完整css代码如下:
css
body {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
background: #f5f5f5;
}
.book-container {
perspective: 1500px;
width: 300px;
height: 450px;
}
.book {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: transform 1.2s ease-in-out;
transform-origin: left center;
}
.book:hover {
transform: rotateY(-160deg);
}
.book-page {
position: absolute;
width: 100%;
height: 100%;
backface-visibility: hidden;
border-radius: 5px 15px 15px 5px;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
font-weight: bold;
color: white;
box-shadow: 0 5px 25px rgba(0,0,0,0.3);
transition: all 0.5s ease;
}
.front {
background: linear-gradient(135deg, #3498db, #2980b9);
transform: rotateY(0deg);
z-index: 2;
}
.back {
background: linear-gradient(135deg, #2ecc71, #27ae60);
transform: rotateY(180deg);
}
/* 书脊效果 */
.book::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 10px;
height: 100%;
background: linear-gradient(to right, #1a5276, #1e8449);
transform: rotateY(90deg) translateX(-5px);
z-index: 3;
}
/* 翻页时的阴影效果 */
.book:hover .front {
box-shadow: -15px 5px 30px rgba(0,0,0,0.3);
}
其实所有复杂动画都是基础属性的组合,关键在于理解每个属性的作用,然后像搭积木一样把它们组合起来。试着修改上面的参数,看看会有什么变化 ------ 动手尝试是学好动画的最好方法。如果有更棒的创意,欢迎在评论区分享!