前言
生命不止,摸鱼不止 ————尼古拉斯·赵四
效果展示
实现思路
我们通过两个偏移了一定位置的圆以及一个旋转了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)。