有趣的蜡烛吹灭动画的HTML+CSS源代码

用 HTML+CSS 实现蜡烛吹灭动画,通过纯 CSS 技术创建复杂互动效果,无需 JavaScript。
直达下载
回到上一页
clickgpt_line.png_noView
介绍

今天我们来聊一个非常有趣的前端动效:用 HTML+CSS 实现一个蜡烛吹灭的动画效果。这个动画效果不仅仅是视觉上的小花样,还展示了如何利用纯 CSS 实现复杂的交互效果,既不依赖 JavaScript,也不需要额外的库,纯纯就是 CSS 的魔法。

web_effect_candle_1

这个动画效果看似简单,但实际上它包含了多个部分的协同运作,比如蜡烛的身体、眼睛、火焰的跳动、烟雾的飘散等。那么,我们就一起来看看这段代码是怎么实现这个效果的吧!

1. 页面结构

首先,我们来看一下 HTML 的结构。整个页面的结构很简单,基本上就是一个包含两个蜡烛的 div 容器。为了方便管理和控制每个蜡烛的动画效果,蜡烛的每个部分都被细分成了多个 div 元素。

    
<div class="wrapper">
    <div class="candles">
        <div class="light_wave"></div>

        <div class="candle1">
            <div class="candle1_body">
                <div class="candle1_eyes">
                    <span class="candle1_eyes-left"></span>
                    <span class="candle1_eyes-right"></span>
                </div>
                <div class="candle1_mouth"></div>
            </div>
            <div class="candle1_stick"></div>
        </div>

        <div class="candle2">
            <div class="candle2_body">
                <div class="candle2_eyes">
                    <span class="candle2_eyes-left"></span>
                    <span class="candle2_eyes-right"></span>
                </div>
            </div>
            <div class="candle2_stick"></div>
        </div>

        <div class="candle2_fire"></div>
        <div class="candle_smoke1"></div>
        <div class="candle_smoke2"></div>
    </div>

    <div class="floor"></div>
</div>

这里有两个主要的蜡烛元素:candle1candle2candle1 还有嘴巴和眼睛的细节,而 candle2 则稍微简单一些,仅有眼睛。这个简单的结构通过不同的 div 元素实现了蜡烛的不同部分:蜡烛的身体、火焰、烟雾等等。

二、蜡烛身体的设计

蜡烛的身体是整个动画的基础部分,使用简单的 div 元素配合 CSS 样式来实现。我们通过设置 widthheight 以及 background 来定义蜡烛的形状和颜色,并使用 border-radius 来圆润蜡烛的顶部。

    
.candle1 {
    position: absolute;
    left: 50%;
    top: 50%;
    width: 35px;
    height: 100px;
    background: #fff;
    border: 3px solid #673C63;
    border-bottom: 0px;
    border-radius: 3px;
    transform-origin: center right;
    transform: translate(60%, -25%);
    box-shadow: -2px 0px 0px #95c6f2 inset;
    animation: expand-body 3s infinite linear;
}

在这个代码片段中,我们定义了第一支蜡烛的外观。蜡烛的身体(candle1)被放置在屏幕的中心位置,并通过 transformtranslate 来微调其位置。同时,通过 box-shadow 给蜡烛添加了内阴影效果,使得蜡烛看起来更加立体。

三、火焰的实现

蜡烛火焰是这个动画的亮点之一。火焰的形状通过一个带有椭圆边框的 div 来实现,背景颜色则选择了橙色到黄色的渐变色,以模拟真实的火焰效果。火焰的跳动效果使用 @keyframes 动画来实现。

    
.candle2_fire {
    position: absolute;
    top: 50%;
    left: 40%;
    display: block;
    width: 16px;
    height: 20px;
    background-color: red;
    border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
    background: #ff9800;
    transform: translate(-50%, -50%);
    animation: dance-fire 3s infinite linear;
}

这个代码片段中,火焰的形状通过 border-radius 来定义,并通过 background 设置了火焰的颜色。animation 属性应用了一个名为 dance-fire 的关键帧动画,使火焰在页面加载时自动进行跳动。

关键帧动画的定义如下:

    
@keyframes dance-fire {
    59%,
    89% {
        left: 40%;
        width: 0px;
        height: 0px;
    }
    90%,
    0%,
    7%,
    15%,
    23%,
    31%,
    39%,
    47%,
    55% {
        left: 40.8%;
        width: 16px;
        height: 20px;
        background: #FFC107;
    }
    94%,
    3%,
    11%,
    19%,
    27%,
    35%,
    43%,
    51%,
    58% {
        left: 41.2%;
        width: 16px;
        height: 20px;
        background: #FF9800;
    }
}

四、眼睛的眨动

为了使蜡烛看起来更加生动,我们为蜡烛添加了眼睛,并且眼睛会定期眨动。这个效果同样是通过 @keyframes 动画来实现的。

    
.candle1_eyes-left, .candle1_eyes-right {
    position: absolute;
    left: 30%;
    top: 20%;
    width: 5px;
    height: 5px;
    border-radius: 100%;
    background: #673C63;
    transform: translate(-70%, 0%);
    animation: blink-eyes 3s infinite linear;
}

这里定义了眼睛的样式和位置,关键帧动画 blink-eyes 则控制眼睛的眨动效果:

    
@keyframes blink-eyes {
    0%, 35% {
        opacity: 1;
        transform: translate(-70%, 0%);
    }
    36%, 39% {
        opacity: 0;
        transform: translate(-70%, 0%);
    }
    40% {
        opacity: 1;
        transform: translate(-70%, 0%);
    }
    50%, 65% {
        transform: translate(-140%, 0%);
    }
    66% {
        transform: translate(-70%, 0%);
    }
}

在这个动画中,眼睛会在不同时刻淡出和淡入,从而模拟出眨眼的效果。

五、烟雾的飘动

蜡烛熄灭后烟雾的飘动是整个动画的点睛之笔。我们通过两个小的 div 来表示烟雾,并使用 @keyframes 动画来控制它们的移动和消失。

    
.candle_smoke1 {
    position: absolute;
    left: 30%;
    top: 50%;
    width: 30px;
    height: 3px;
    background: grey;
    transform: translate(-50%, -50%);
    animation: move-left 3s infinite linear;
}

.candle_smoke2 {
    position: absolute;
    left: 30%;
    top: 40%;
    width: 10px;
    height: 10px;
    border-radius: 10px;
    background: grey;
    transform: translate(-50%, -50%);
    animation: move-top 3s infinite linear;
}

两个烟雾块分别定义了大小和位置,并应用了不同的动画效果:

    
@keyframes move-left {
    0%, 59%, 100% {
        width: 0px;
        left: 40%;
    }
    60% {
        width: 30px;
        left: 30%;
    }
    68% {
        width: 0px;
        left: 20%;
    }
}

@keyframes move-top {
    0%, 64%, 100% {
        width: 0px;
        height: 0px;
        top: 0%;
    }
    65% {
        width: 10px;
        height: 10px;
        top: 40%;
        left: 40%;
    }
    80% {
        width: 0px;
        height: 0px;
        top: 20%;
    }
}

这两个动画分别控制了烟雾的水平和垂直移动,使得烟雾在蜡烛熄灭后逐渐消散。

六、背景颜色的变化

为了让动画更加逼真,我们还需要实现背景颜色的变化,当背景颜色从白色变为黑色时,蜡烛逐渐熄灭。我们使用 @keyframes 来控制背景颜色的变化:

    
body {
    background-color: #FFF;
    animation: change-background 3s infinite linear;
}

@keyframes change-background {
    0%, 59%, 98%, 100% {
        background: #fff;
    }
    61%, 97% {
        background: #000;
    }
}

通过这个动画,页面的背景颜色会在一定时间内从白色渐变为黑色,再从黑色渐变回白色,形成循环。

结语

通过 HTML 和 CSS,我们成功地实现了一个有趣的蜡烛吹灭动画效果。这个项目展示了如何使用简单的 CSS 属性和动画来创建复杂的效果,整个过程不需要任何 JavaScript,完全依赖于 CSS 的强大功能。

这个蜡烛动画展示了 CSS 在动画制作上的潜力,如果你有兴趣,不妨试着将这个项目做一些修改,比如增加更多的蜡烛、改变火焰的颜色,甚至可以尝试为蜡烛加上一些音效。

编程学习
编程学习 免费领取编程学习资料 进编程学习交流群
订阅号
视频号
公众号 关注公众号,回复关键字java领取大厂最新面试题
×
编程学习
免费领取编程学习资料 进编程学习交流群