CSS100Day(9)-纯元素制作雨滴下到地面

2471 字
12 分钟
CSS100Day(9)-纯元素制作雨滴下到地面

设计简介#

下面是纯元素设计的雨滴,关键在于0%~85%~100%,变化scaleX、scaleY、totate等实现雨滴落到地面效果

效果展示#

12°
风力: 东 2 km/h
湿度: 87%
星期二 28°/19°
星期三 30°/19°

实现代码和步骤#

HTML部分#

雨滴就是drop开头的

<div class="frame">
<div class="moon">
<div class="crater-1"></div>
<div class="crater-2"></div>
<div class="crater-3"></div>
<div class="crater-4"></div>
<div class="crater-5"></div>
<div class="crater-6"></div>
<div class="crater-7"></div>
<div class="crater-8"></div>
<div class="crater-9"></div>
<div class="crater-10"></div>
<div class="crater-11"></div>
</div>
<div class="hill-bg-1"></div>
<div class="hill-bg-2"></div>
<div class="hill-fg-1"></div>
<div class="hill-fg-2"></div>
<div class="hill-fg-3"></div>
<div class="front">
<div class="temperature">12°</div>
<div class="info">
风力: 东 2 km/h <br />
湿度: 87%
</div>
<table class="preview">
<tr>
<td>星期二</td>
<td>28°/19°</td>
</tr>
<tr>
<td>星期三</td>
<td>30°/19°</td>
</tr>
</table>
</div>
<div class="drop-big-1"></div>
<div class="drop-big-2"></div>
<div class="drop-big-3"></div>
<div class="drop-big-4"></div>
<div class="drop-big-5"></div>
<div class="drop-big-6"></div>
<div class="drop-big-7"></div>
<div class="drop-big-8"></div>
<div class="drop-big-9"></div>
<div class="drop-big-10"></div>
<div class="drop-medium-1"></div>
<div class="drop-medium-2"></div>
<div class="drop-medium-3"></div>
<div class="drop-medium-4"></div>
<div class="drop-medium-5"></div>
<div class="drop-medium-6"></div>
<div class="drop-medium-7"></div>
<div class="drop-medium-8"></div>
<div class="drop-medium-9"></div>
<div class="drop-medium-10"></div>
<div class="drop-small-1"></div>
<div class="drop-small-2"></div>
<div class="drop-small-3"></div>
<div class="drop-small-4"></div>
<div class="drop-small-5"></div>
<div class="drop-small-6"></div>
<div class="drop-small-7"></div>
<div class="drop-small-8"></div>
<div class="drop-small-9"></div>
<div class="drop-small-10"></div>
</div>

CSS部分#

关键看雨滴是由三部分组成、div、div::before、div::after,看@keyframes

为了避免css重复,这里使用less预编译器

:root {
--drop-color: #7fc1f9;
--big-space-base: -20px;
}
.frame {
width: 400px;
height: 400px;
border-radius: 2px;
box-shadow: 1px 2px 10px 0 rgba(0, 0, 0, 0.3);
font-weight: 300;
overflow: hidden;
background: #1a2238;
position: relative;
color: #394568;
}
.moon {
position: absolute;
width: 67px;
height: 67px;
background: #f6edbd;
top: 60px;
left: 66px;
border-radius: 50%;
animation: rise 1s ease-out;
overflow: hidden;
}
.crater-1 {
position: absolute;
width: 11px;
height: 11px;
top: 9px;
left: 28px;
border-radius: 10px;
background: #ece1a8;
}
.crater-2 {
&:extend(.crater-1);
top: 12px;
left: 0;
}
.crater-3 {
&:extend(.crater-1);
top: 56px;
left: 10px;
}
.crater-4 {
&:extend(.crater-1);
width: 6px;
height: 6px;
top: 37px;
left: 49px;
}
.crater-5 {
&:extend(.crater-4);
top: 24px;
left: 61px;
}
.crater-6 {
&:extend(.crater-4);
top: 55px;
left: 33px;
}
.crater-7 {
&:extend(.crater-4);
top: 17px;
left: 46px;
}
.crater-8 {
&:extend(.crater-4);
top: 28px;
left: 27px;
}
.crater-9 {
&:extend(.crater-4);
top: 39px;
left: 17px;
}
.crater-10 {
&:extend(.crater-1);
width: 4px;
height: 4px;
top: 25px;
left: 15px;
}
.crater-11 {
&:extend(.crater-10);
top: 37px;
left: 37px;
}
.front {
position: absolute;
z-index: 10;
width: 100%;
height: 90px;
left: 0px;
bottom: 0px;
background: #fff;
display: flex;
justify-content: space-between;
align-items: center;
.temperature {
line-height: 90px;
font-size: 2rem;
padding: 10px;
margin: 0 10px;
}
.info {
flex: 1;
}
.preview {
float: right;
font-weight: 400;
text-align: right;
font-size: 15px;
line-height: 20px;
margin-right: 25px;
}
}
.hill-bg-1 {
position: absolute;
z-index: 2;
width: 337px;
height: 281px;
top: 201px;
left: -57px;
background-color: #26314f;
border-radius: 50%;
}
.hill-bg-2 {
&:extend(.hill-bg-1);
top: 197px;
left: 177px;
}
.hill-fg-1 {
&:extend(.hill-bg-1);
background: #303c5d;
top: 248px;
left: -137px;
}
.hill-fg-2 {
&:extend(.hill-fg-1);
top: 221px;
left: 63px;
}
.hill-fg-3 {
&:extend(.hill-fg-1);
top: 248px;
left: 292px;
}
// 下雨特效
.drop-big-1 {
position: absolute;
z-index: 20;
background: var(--drop-color);
width: 8px;
height: 8px;
border-radius: 50%;
animation: drop 0.8s linear 0s infinite;
transform-origin: 50% 100%;
left: calc(var(--big-space-base) + 38 * 1px);
bottom: 90px;
animation-fill-mode: both;
&::before {
position: absolute;
content: "";
display: block;
top: -2px;
left: 1px;
width: 6px;
height: 6px;
background: var(--drop-color);
border-radius: 3px;
}
&::after {
position: absolute;
content: "";
display: block;
top: -5px;
left: 2px;
width: 4px;
height: 10px;
background: var(--drop-color);
border-radius: 50%;
}
}
.drop-big-2 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 2px);
animation: drop 0.8s linear 1s infinite;
animation-fill-mode: both;
}
// animation-duration 0.7~0.9s animation-delay 0~2s
.drop-big-3 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 3px);
animation: drop 0.9s linear 0.16s infinite;
animation-fill-mode: both;
}
.drop-big-4 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 4px);
animation: drop 0.74s linear 0.9s infinite;
animation-fill-mode: both;
}
.drop-big-5 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 5px);
animation: drop 0.77s linear 1.3s infinite;
animation-fill-mode: both;
}
.drop-big-6 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 6px);
animation: drop 0.89s linear 1.8s infinite;
animation-fill-mode: both;
}
.drop-big-7 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 7px);
animation: drop 0.81s linear 0.5s infinite;
animation-fill-mode: both;
}
.drop-big-8 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 8px);
animation: drop 0.76s linear 1.6s infinite;
animation-fill-mode: both;
}
.drop-big-9 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 9px);
animation: drop 0.86s linear 0.4s infinite;
animation-fill-mode: both;
}
.drop-big-10 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 10px);
animation: drop 0.82s linear 1.1s infinite;
animation-fill-mode: both;
}
.drop-medium-1 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 1px);
opacity: 0.6;
width: 6px;
height: 6px;
animation: drop 1.3s linear 1s infinite;
animation-fill-mode: both;
&::before {
top: -2px;
left: 1px;
width: 4px;
height: 4px;
}
&::after {
top: -4px;
left: 2px;
width: 2px;
height: 6px;
}
}
.drop-medium-2 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 2px);
animation: drop 1.4s linear 0.7s infinite;
animation-fill-mode: both;
}
.drop-medium-3 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 3px);
animation: drop 1.5s linear 0.3s infinite;
animation-fill-mode: both;
}
.drop-medium-4 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 4px);
animation: drop 1.32s linear 0.7s infinite;
animation-fill-mode: both;
}
.drop-medium-5 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 5px);
animation: drop 1.48s linear 1.1s infinite;
animation-fill-mode: both;
}
.drop-medium-6 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 6px);
animation: drop 1.37s linear 0.5s infinite;
animation-fill-mode: both;
}
.drop-medium-7 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 7px);
animation: drop 1.45s linear 1.8s infinite;
animation-fill-mode: both;
}
.drop-medium-8 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 8px);
animation: drop 1.42s linear 1.1s infinite;
animation-fill-mode: both;
}
.drop-medium-9 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 9px);
animation: drop 1.35s linear 1.2s infinite;
animation-fill-mode: both;
}
.drop-medium-10 {
&:extend(.drop-medium-1 all);
left: calc(var(--big-space-base) + 38 * 10px);
animation: drop 1.5s linear 0.4s infinite;
animation-fill-mode: both;
}
.drop-small-1 {
&:extend(.drop-big-1 all);
left: calc(var(--big-space-base) + 38 * 1px);
opacity: 0.3;
width: 4px;
height: 4px;
animation: drop 1.9s linear 1s infinite;
animation-fill-mode: both;
&::before {
top: -2px;
left: 1px;
width: 2px;
height: 2px;
}
&::after {
top: -3px;
left: 1px;
width: 2px;
height: 4px;
}
}
.drop-small-2 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 2px);
animation: drop 1.98s linear 0.7s infinite;
animation-fill-mode: both;
}
.drop-small-3 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 3px);
animation: drop 2.08s linear 1.3s infinite;
animation-fill-mode: both;
}
.drop-small-4 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 4px);
animation: drop 1.92s linear 1.7s infinite;
animation-fill-mode: both;
}
.drop-small-5 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 5px);
animation: drop 2.01s linear 0.1s infinite;
animation-fill-mode: both;
}
.drop-small-6 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 6px);
animation: drop 1.98s linear 1.7s infinite;
animation-fill-mode: both;
}
.drop-small-7 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 7px);
animation: drop 2.1s linear 0.8s infinite;
animation-fill-mode: both;
}
.drop-small-8 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 8px);
animation: drop 1.42s linear 0.1s infinite;
animation-fill-mode: both;
}
.drop-small-9 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 9px);
animation: drop 1.95s linear 1.9s infinite;
animation-fill-mode: both;
}
.drop-small-10 {
&:extend(.drop-small-1 all);
left: calc(var(--big-space-base) + 38 * 10px);
animation: drop 2.09s linear 1.4s infinite;
animation-fill-mode: both;
}
@keyframes drop {
0% {
transform: translate3d(40px, -320px, 0) scaleX(1) scaleY(1) rotate(17deg);
}
85% {
transform: translate3d(0, 0, 0) scaleX(1) scaleY(1) rotate(17deg);
}
100% {
transform: translate3d(0, 0, 0) scaleX(3) scaleY(0) rotate(0deg);
}
}
@keyframes rise {
0% {
transform: translate(-10px, 220px);
}
100% {
transform: translate(0, 0);
}
}
分享给其他人
如果该文章对您有帮助,欢迎分享给其他人阅读!
复制链接

评论区

图片
犟哟
Hello, I'm Juyial.
公告
欢迎来到我的博客,在这里可以一起进步,一起学习!2026年起航!
分类
站点统计
文章
20
分类
1
标签
3
总字数
37,015
运行时长
0
最后活动
0 天前

目录