下雨效果实现

360 阅读1分钟

我正在参加「码上掘金挑战赛」详情请看:码上掘金挑战赛来了!

源码: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);
}

雷声效果利用定期触发的背景实现。