css制作蝴蝶飞
CSS制作蝴蝶飞动画
使用CSS动画和关键帧(@keyframes)可以轻松实现蝴蝶飞舞的效果。以下是一个完整的实现方案:
HTML结构
<div class="butterfly">
<div class="left-wing"></div>
<div class="right-wing"></div>
<div class="body"></div>
</div>
CSS样式
.butterfly {
position: absolute;
width: 100px;
height: 80px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.body {
position: absolute;
width: 10px;
height: 40px;
background-color: #333;
left: 45px;
top: 20px;
border-radius: 5px;
}
.left-wing, .right-wing {
position: absolute;
width: 40px;
height: 30px;
background-color: #f06;
border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
}
.left-wing {
left: 5px;
top: 10px;
transform-origin: right center;
animation: flap 0.5s infinite alternate;
}
.right-wing {
right: 5px;
top: 10px;
transform-origin: left center;
animation: flap 0.5s infinite alternate-reverse;
}
@keyframes flap {
0% {
transform: rotateY(0deg);
}
100% {
transform: rotateY(60deg);
}
}
.butterfly {
animation: fly 10s infinite linear;
}
@keyframes fly {
0% {
transform: translate(-50%, -50%) rotate(0deg);
}
25% {
transform: translate(200px, 100px) rotate(90deg);
}
50% {
transform: translate(400px, -50px) rotate(180deg);
}
75% {
transform: translate(200px, -100px) rotate(270deg);
}
100% {
transform: translate(-50%, -50%) rotate(360deg);
}
}
实现原理
翅膀动画通过@keyframes flap实现扇动效果,利用transform: rotateY()创造3D旋转感。左翼和右翼分别使用alternate和alternate-reverse使运动方向相反。

蝴蝶整体飞行路径由@keyframes fly控制,通过在不同关键帧设置transform属性的变化,实现蝴蝶在页面上的飞行轨迹。translate()控制位置移动,rotate()控制飞行方向。
进阶优化
增加翅膀渐变效果:

.left-wing, .right-wing {
background: linear-gradient(45deg, #f06, #f9a);
}
添加蝴蝶触角:
.body::before, .body::after {
content: '';
position: absolute;
width: 2px;
height: 10px;
background: #333;
top: -10px;
}
.body::before {
left: 2px;
transform: rotate(-30deg);
}
.body::after {
right: 2px;
transform: rotate(30deg);
}
调整飞行路径为更自然的曲线:
@keyframes fly {
0% {
transform: translate(0, 0) rotate(0deg);
}
25% {
transform: translate(200px, 150px) rotate(45deg);
}
50% {
transform: translate(400px, 0) rotate(0deg);
}
75% {
transform: translate(200px, -150px) rotate(-45deg);
}
100% {
transform: translate(0, 0) rotate(0deg);
}
}






