前言:CSS 不只是"样式",更是"表达"
你是否认为 CSS 只是用来排版和配色的工具?
今天,我们将用纯 CSS 打造一个浪漫的"亲吻动画" ,让两个小球"一见钟情",最终"深情一吻"。
这不仅是一次技术实践,更是一场前端艺术的表达 。
通过这个案例,你将深入掌握 CSS 动画、盒模型、伪元素、定位、关键帧 等核心技能。
一、需求分析:动画的"剧本"设计
我们要实现一个 4 秒循环的动画:
- 女主球(左) :轻微晃动,表达"羞涩"。
- 男主球(右) :主动靠近,旋转"献吻"。
- 亲吻瞬间:出现"爱心"特效,嘴巴闭合。
- 回归原位:循环播放。
💡 CSS 动画的本质是"时间轴上的状态变化" 。
二、HTML 结构:面向对象的 DOM 设计
xml
<div class="container">
<!-- 女主 -->
<div class="ball" id="l-ball">
<div class="face face-l">
<div class="eye eye-l"></div>
<div class="eye eye-r"></div>
<div class="mouth"></div>
</div>
</div>
<!-- 男主 -->
<div class="ball" id="r-ball">
<div class="face face-r">
<div class="eye eye-l eye-l-p"></div>
<div class="eye eye-r eye-r-p"></div>
<div class="mouth mouth-r"></div>
<div class="kiss-m">
<div class="kiss"></div>
<div class="kiss"></div>
</div>
</div>
</div>
</div>
面向对象思想:
.ball:球体基类,定义通用样式(圆形、边框、背景)。.face:面部基类,控制表情位置。.face-l/.face-r:多态实现,左右脸不同表情。.eye-l-p/.eye-r-p:特殊状态,右眼"睁大"表达惊喜。
💡 结构清晰,便于后期维护和扩展。
三、CSS 核心技术拆解
1. 水平垂直居中:transform 的妙用
css
.container {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
top: 50%:上边缘距顶部 50%。transform: translate(-50%, -50%):自身向左上移动 50%,实现精准居中。
💡 这是最常用且兼容性最好的居中方案之一。
2. 画一个"球":盒模型与圆角
css
.ball {
width: 100px;
height: 100px;
border-radius: 50%; /* 关键:正方形变圆形 */
border: 8px solid;
background-color: #fff;
}
border-radius: 50%:将正方形变成完美的圆形。border:为球体添加轮廓,增强立体感。
3. 伪元素 ::before 和 ::after:无中生有
css
.face::before, .face::after {
content: ""; /* 必须有 content */
position: absolute;
width: 18px;
height: 8px;
background-color: plum;
top: 20px;
border-radius: 50%;
}
.face::before { right: -8px; }
.face::after { left: -5px; }
💡 伪元素可以创建额外的 DOM 节点,而无需修改 HTML。
- 这里用来画"耳朵"或"装饰",增加趣味性。
content是伪元素的"开关",缺一不可。
4. 画"眼睛"与"嘴巴":定位与边框技巧
css
.eye {
width: 15px;
height: 14px;
border-radius: 50%;
border-bottom: 5px solid; /* 用边框画半圆 */
position: absolute;
}
.eye-l { left: 10px; }
.eye-r { right: 5px; }
.mouth {
width: 30px;
height: 14px;
border-radius: 50px;
border-bottom: 5px solid;
position: absolute;
bottom: -5px;
left: 0;
right: 0;
margin: auto; /* 水平居中 */
}
- 眼睛 :利用
border-bottom实现半圆形。 - 嘴巴 :
margin: auto让其在父容器中水平居中。
四、CSS 动画:@keyframes 与 animation
1. 女主球动画:#l-ball
css
#l-ball {
animation: close 4s ease infinite;
z-index: 100; /* 确保在最上层 */
}
@keyframes close {
0% { transform: translate(0); }
20% { transform: translate(20px); }
35% { transform: translate(20px); }
55% { transform: translate(0); }
100% { transform: translate(0); }
}
- 含义:从 0% 到 20%,向右移动 20px;保持到 35%;55% 回到原位。
infinite:无限循环。
2. 女主脸动画:face-l
css
.face-l {
animation: face 4s ease infinite;
}
@keyframes face {
0% { transform: translate(0) rotate(0deg); }
20% { transform: translate(5px) rotate(-2deg); }
28% { transform: translate(0) rotate(0deg); }
/* ... */
}
- 微表情:轻微左右晃动 + 小幅度旋转,表现"害羞"。
- 多关键帧控制,动画更细腻。
3. 男主球动画:#r-ball
css
#r-ball {
animation: kiss 4s ease infinite;
}
@keyframes kiss {
50% { transform: translate(-30px) rotate(20deg); } /* 靠近并旋转 */
60% { transform: translate(33px); } /* 快速后退 */
67% { transform: translate(-33px); } /* 再次靠近 */
77% { transform: translate(0); } /* 回归 */
}
- 主动出击:先靠近(-30px),再快速"亲吻"(33px → -33px),最后回归。
rotate(20deg):增加动态感。
4. 亲吻特效:爱心与闭嘴
(1) 爱心出现 kiss-m
css
.kiss-m {
opacity: 0;
animation: kiss-m 4s ease infinite;
}
@keyframes kiss-m {
60% { opacity: 1; } /* 60% 时出现 */
66.1% { opacity: 0; } /* 66.1% 时消失 */
}
- 两个
.kiss元素叠加,形成"双爱心"效果。 border-left: 5px solid+border-radius: 50%:画出心形的一半。
(2) 嘴巴闭合 mouth-r
css
.mouth-r {
animation: mouth-m 4s ease infinite;
}
@keyframes mouth-m {
55% { transform: translate(0); } /* 闭嘴 */
60% { transform: translate(0); }
66.1% { transform: translate(1); } /* 张嘴 */
}
translate(0)表示闭合,translate(1)表示微张。- 与爱心动画同步,营造"亲吻"瞬间。
五、动画时间轴对齐:精确到毫秒
| 时间点 | 左球 | 右球 | 爱心 | 嘴巴 |
|---|---|---|---|---|
| 0% | 静止 | 静止 | 隐藏 | 张开 |
| 50% | - | 靠近 | - | - |
| 60% | - | 亲吻 | 出现 | 闭合 |
| 66.1% | - | 分离 | 消失 | 张开 |
💡 动画的精髓在于"同步" 。
通过精确控制
@keyframes的百分比,让所有元素在同一时刻"上演大戏"。
六、优化与思考
1. z-index 层级控制
css
#l-ball { z-index: 100; }
确保女主球在最上层,避免被男主球遮挡。
2. ease 缓动函数
ease:先快后慢,更符合自然运动。- 可尝试
ease-in-out或cubic-bezier()获得更细腻效果。
3. 响应式考虑
- 可添加
@media查询,适配小屏幕。 - 使用
vw/vh替代px,实现相对布局。
结语:CSS 的无限可能
这个"亲吻动画"看似简单,却融合了 盒模型、定位、伪元素、变换、动画 等 CSS 核心技术。
它告诉我们:
CSS 不仅能构建页面,更能讲述故事,传递情感。