CSS100Day(9)-纯元素制作雨滴下到地面
2471 字
12 分钟
CSS100Day(9)-纯元素制作雨滴下到地面
设计简介
下面是纯元素设计的雨滴,关键在于0%~85%~100%,变化scaleX、scaleY、totate等实现雨滴落到地面效果
效果展示
12°
风力: 东 2 km/h
湿度: 87%
湿度: 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); }}分享给其他人
如果该文章对您有帮助,欢迎分享给其他人阅读!
复制链接
相关文章
推荐筛选
1
CSS100Day(18)-3D实现弹性元素
设计灵感 3D实现弹性元素
2
CSS100Day(19)-纯css实现滑动radio轮播图
设计灵感 纯css使用translateX实现轮播图
3
CSS100Day(16)-利用before、after伪元素完成长方形散花动画
设计灵感 伪元素实现长方形散花动画
4
CSS100Day(13)-图片hover上方出现蒙层和元素
设计灵感 图片hover常规出现蒙层和元素,点击后过渡呈现卡片内容
5
CSS100Day(17)-svg实现彭罗斯三角
设计灵感 三个svg实现彭罗斯三角
随机文章
随机推荐