下“雨”啦

Published on
/
/趣玩前端
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>下“雨”啦</title>
    <style>
      @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
      * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        font-family: 'Poppins', sans-serif;
      }

      :root {
        --clr: #0f0;
      }

      body {
        display: flex;
        justify-content: center;
        align-items: center;
        min-height: 100vh;
        background: #000;
        transform: scale(0.6);
      }

      .container {
        position: relative;
        top: 100px;
        height: 400px;
        width: 100%;
        display: flex;
        justify-content: center;
        animation: animateColor 5s linear infinite;
      }

      @keyframes animateColor {
        0% {
          filter: hue-rotate(0deg);
        }
        100% {
          filter: hue-rotate(360deg);
        }
      }

      .container .cloud {
        position: relative;
        width: 300px;
        /* height: 300px; */
        z-index: 100;
        filter: drop-shadow(0 0 35px var(--clr));
      }

      .container .cloud h2 {
        position: absolute;
        left: 50%;
        transform: translateX(-50%);
        white-space: nowrap;
        color: #000;
        font-size: 2em;
        z-index: 1000;
        font-weight: 400;
        padding: 0 10px;
        border-radius: 10px;
        text-transform: uppercase;
        background: var(--clr);
      }

      .container .cloud h2::before {
        content: '';
        position: absolute;
        top: -115px;
        left: 50%;
        transform: translateX(-50%);
        border-radius: 100px;
        width: 120%;
        height: 100px;
        background: var(--clr);
      }

      .container .cloud h2::after {
        content: '';
        position: absolute;
        top: -150px;
        left: 25px;
        width: 120px;
        height: 120px;
        border-radius: 50%;
        background: var(--clr);
        box-shadow: 120px -30px 0 10px var(--clr);
      }

      .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);
          /* transform-origin: top; */
        }

        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 var(--clr);
        }
      }
    </style>
  </head>
  <body>
    <div class="container">
      <div class="cloud">
        <h2>Matrix Rain</h2>
      </div>
    </div>

    <script>
      function randomText() {
        var text = '!@#$%^*()';
        letters = text[Math.floor(Math.random() * text.length)];
        return letters;
      }

      function rain() {
        let cloud = document.querySelector('.cloud');
        let e = document.createElement('div');
        e.classList.add('drop');
        cloud.appendChild(e);

        let left = Math.floor(Math.random() * 300);
        let size = Math.random() * 1.5;
        let 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(function () {
          cloud.removeChild(e);
        }, 2000);
      }

      setInterval(function () {
        rain();
      }, 20);
    </script>
  </body>
</html>