我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!
源码:code.juejin.cn/pen/7146957…
设计一个下雨效果,主要的实现就是雷电和雨丝
闪电是使用每10秒改变一次背景色实现
雨丝是利用函数创建相应元素实现的。
做出的效果很简陋哈哈。
1.html文件
在html文件里引入css文件和js文件。
代码如下:
<!DOCTYPE html>
<html >
<head>
<meta charset="UTF-8">
<title>下雨效果</title>
<link rel="stylesheet" type="text/css" href="./css/style.css" />
</head>
<body>
<script src="./js/script.js"></script>
</body>
</html>
2.css文件
设置窗口参数:
代码如下:
background-image: linear-gradient(to bottom, #030420, #000000 70%);
display: flex;
justify-content: center;
align-items: center;
width: 100vw;
height: 100vh;
overflow: hidden;
}
闪电相关样式:
代码如下:
hr.thunder {
border: unset;
position: absolute;
width: 100vw;
height: 100vh;
animation-name: thunder;
animation-duration: var(--thunder-duration);
animation-timing-function: linear;
animation-delay: var(--thunder-delay);
animation-iteration-count: infinite;
}
hr:not(.thunder) {
width: 50px;
border-color: transparent;
border-right-color: rgba(255, 255, 255, 0.7);
border-right-width: 50px;
position: absolute;
bottom: 100%;
transform-origin: 100% 50%;
animation-name: rain;
animation-duration: 1s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
雨相关样式:
代码如下:
@keyframes rain {
from {
transform: rotate(105deg) translateX(0);
}
to {
transform: rotate(105deg) translateX(calc(100vh + 20px));
}
}
3.js文件
js文件里是主要的代码逻辑,主要就是利用函数创建多个雨滴元素:
let hrElement;
let counter = 100;
for (let i = 0; i < counter; i++) {
hrElement = document.createElement("HR");
if (i == counter - 1) {
hrElement.className = "thunder";
} else {
hrElement.style.left = Math.floor(Math.random() * window.innerWidth) + "px";
hrElement.style.animationDuration = 0.2 + Math.random() * 0.3 + "s";
hrElement.style.animationDelay = Math.random() * 5 + "s";
}
document.body.appendChild(hrElement);
}
雷声效果利用定期触发的背景实现。