【摸鱼小技巧】一个心形加载动画

607 阅读1分钟

前言

生命不止,摸鱼不止 ————尼古拉斯·赵四

效果展示

GIF 2021-8-23 22-21-28.gif

实现思路

我们通过两个偏移了一定位置的圆以及一个旋转了45deg的正方形拼凑出一个❤的图案。
紧接着我们就需要让这三个元素随着动画的播放而缩放,放大,同时背景也需要不停的旋转从而产生不断加载的效果。
最后我们只需要为整个心形加载添加一个不断缩放放大的 "阴影" 效果就可以啦~

代码如下

//HTML
<div class="container">
    <div class="preloader">
        <span></span>
        <span></span>
        <span></span>
    </div>
    <div class="shadow"></div>
 </div>

 //CSS
 .container {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
  }

.preloader {
    animation: rotate 2.3s cubic-bezier(0.75, 0, 0.5, 1) infinite;
}

.preloader span {
    height: 64px;
    width: 64px;
    display: block;
    position: absolute;
    background: #3fc1f2;
    border: 1px solid #3fc1f2;
    border-radius: 50%;
}

.preloader span:nth-child(1) {
    transform: translate(-28px, -28px);
    animation: shape_1 2.3s cubic-bezier(0.75, 0, 0.5, 1) infinite;
}

.preloader span:nth-child(2) {
    transform: translate(28px, -28px);
    animation: shape_2 2.3s cubic-bezier(0.75, 0, 0.5, 1) infinite;
}

.preloader span:nth-child(3) {
    position: relative;
    border-radius: 0;
    transform: scale(0.98) rotate(-45deg);
    animation: shape_3 2.3s cubic-bezier(0.75, 0, 0.5, 1) infinite;
}

@keyframes rotate {
    50% {
        transform: rotate(360deg);
    }

    100% {
        transform: rotate(720deg);
    }
}

@keyframes shape_1 {
    60% {
        transform: scale(0.4);
    }
}

@keyframes shape_2 {
    40% {
        transform: scale(0.4);
    }
}

@keyframes shape_3 {
    50% {
        border-radius: 50%;
        transform: scale(0.5) rotate(-45deg);
    }

    100% {
        transform: scale(0.98) rotate(-45deg);
    }
}

.container .shadow {
    background: #d9d9d9;
    display: block;
    width: 64px;
    height: 16px;
    border: 1px solid #d9d9d9;
    border-radius: 50%;
    position: relative;
    top: 30px;
    animation: shadow 2.3s cubic-bezier(0.75, 0, 0.5, 1) infinite;
}

@keyframes shadow {
    50% {
        border-color: #f2f2f2;
        transform: scale(0.6);
    }
}

其中使用了cubic-bezier(x1,y1,x2,y2)函数来控制不同速度的过渡效果,该函数定义了一个贝塞尔曲线,由P0,P1,P2,P3四个点定义。
其中P0(0,0)定义了曲线的初始时间和初始状态,P3定义了曲线的最终时间和最终状态,p1为(x1,y1);p2为(x2,y2)。