会下 ‘钱’ 的雨云!手把手教你实现它

1,920 阅读4分钟

前言

这次带来的效果十分有趣,可以把它比作为“下钱的雨云”,就是一种哗哗哗地从天空中的云里落钱的画面。话不多说,大家直接看到下面的效果预览。

效果预览

以上就是最终的实现效果了,咱们接下来便一步一步来实现它。

HTML

我们首先看到HTML部分,相关代码如下。

 <div class="container">
      <div class="cloud">
        <h2>Data Clouds Rain</h2>
      </div>
    </div>

这里是一个简单的HTML结构,包含一个具有类名 container<div> 元素中嵌套了一个具有类名 cloud<div> 元素。

这一段简单的代码用于展示包含标题的“云”容器,后面将会添加CSS样式和JavaScript动态效果,以实现更丰富的页面设计和交互体验。

JS

然后我们来看到JS部分,这里是实现动态交互效果的关键。

<script>
      const randomText = () => {
        const text = "!@#$%^&*()_+",
          letters = text[Math.floor(Math.random() * text.length)];
        return letters;
      };
      const rain = () => {
        const cloud = document.querySelector(".cloud"),
          e = document.createElement("div");
        e.classList.add("drop");
        cloud.appendChild(e);
        const left = Math.floor(Math.random() * 290),
          size = Math.random() * 1.5,
          duration = Math.random() * 1;
        e.innerText = randomText();
        e.style.left = left + "px";
        e.style.fontSize = 0.5 + size + "em";
        e.style.animationDuration = 1 + duration + "s";
        setTimeout(() => {
          cloud.removeChild(e);
        }, 2000);
      };
      setInterval(() => {
        rain();
      }, 20);
    </script>

下面我们对这段代码一一做出讲解。首先通过const randomText = () => { ... }定义一个函数 randomText,用于随机选择一组特定符号中的一个字母,并返回它。再通过const rain = () => { ... }定义一个函数 rain,用于创建和控制单个雨滴的动画效果。

然后选取具有类名 cloud 的元素,通过const e = document.createElement("div")创建一个 <div> 元素,用于表示雨滴。e.classList.add("drop")表示将雨滴元素添加 drop 类。cloud.appendChild(e)表示将雨滴元素添加到云元素中。

最后生成随机的左侧位置、大小和动画持续时间,并根据这些随机值设置雨滴元素的属性,并且在2秒后,移除雨滴元素,实现雨滴的消失效果。通过setInterval(() => { rain(); }, 20)20毫秒调用一次 rain 函数,实现雨滴效果的连续下落。

整体上,我们利用 JavaScript 创建和控制雨滴元素,随机化它们的属性,使它们在页面上连续下落,每隔一段时间生成新的雨滴,从而实现类似下雨效果的动画。

CSS

接下来我们就要给整个效果添砖加瓦了。相关代码如下。

.container {
......
}
@keyframes animateColor {
  0% {
    filter: hue-rotate(0);
  }
  100% {
    filter: hue-rotate(360deg);
  }
}
.container .cloud {
  position: relative;
  width: 300px;
  z-index: 100;
  filter: drop-shadow(0 0 35px var(--clr));
}
.container .cloud h2 {
......
}
.container .cloud h2::before {
 ......
}
.container .cloud h2::after {
......
}
.container .cloud .drop {
  position: absolute;
  top: 60px;
  height: 20px;
  line-height: 20px;
  color: var(--clr);
  transform-origin: bottom;
  animation: animate 2s linear infinite;
}
@keyframes animate {
  0% {
    transform: translateY(0) scaleY(0);
    transform-origin: top;
  }
  10% {
    transform: translateY(0) scaleY(0.25);
    transform-origin: top;
  }
  20% {
    transform: translateY(0) scaleY(1);
  }
  70% {
    transform: translateY(300px) scaleY(1);
    transform-origin: bottom;
  }
  80% {
    transform: translateY(300px) scaleY(1);
    transform-origin: bottom;
  }
  100% {
    transform: translateY(300px) scaleY(0);
    transform-origin: bottom;
    text-shadow: -180px 0 0 var(--clr), 180px 0 0 var(--clr);
  }
}

这里我们主要实现了一个动态的云和雨滴效果,只展示了部分关键代码,详细代码可以前往码上掘金查看。

首先是.container { ... }元素,设置了容器的样式,包括背景颜色的动画变化,实现了颜色的循环过渡效果。并且添加@keyframes animateColor { ... }动画,定义了颜色变化的关键帧动画,从 0%100% 在色相上进行360度旋转变化。

然后是云元素样式。.container .cloud { ... }定义了云的样式,包括阴影和整体效果。.container .cloud h2 { ... }:设置标题的样式,包括文本样式、居中显示和背景颜色。

最后是雨滴元素样式和动画。.container .cloud .drop { ... }定义了雨滴元素的样式,包括位置、颜色和动画特效。并且添加@keyframes animate { ... }动画,定义了雨滴动画的关键帧,实现了雨滴垂直落下的效果,以及在落下期间的动画变化。

整体来看,这里利用 CSS 动画和关键帧设置,实现了页面元素的视觉动态变化。

总结

以上就是整个效果的实现过程了,代码简单易懂,另外,感兴趣的小伙伴们还可以在现有基础上发散思维,比如增加点其他效果等等。关于该效果如果大家有更好的想法欢迎在评论区分享,互相学习。最后,完整代码在码上掘金里可以查看,如果有什么问题大家在评论区里讨论~