DEV Community

Play Button Pause Button
Prince
Prince

Posted on

BLACK HOLE ANIMATION WITH HTML CSS AND JAVASCRIPT

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Black Hole Animation</title>
  <style>
    body {
      margin: 0;
      overflow: hidden;
      background: radial-gradient(ellipse at center, black, #1a1a1a);
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .black-hole-container {
      position: relative;
      width: 300px;
      height: 300px;
    }

    .black-hole {
      position: absolute;
      bottom: 20px;
      left: 50%;
      width: 200px;
      height: 200px;
      background: black;
      border-radius: 50%;
      border: 10px solid transparent;
      /* background-image: conic-gradient(pink 0% 33%, purple 33% 66%, blue 66% 100%); */
      box-shadow: 
        0 0 20px 5px pink,
        0 0 40px 10px purple,
        0 0 60px 15px blue;
      animation: neon-glow 3s infinite ease-in-out;
      transform: translateX(-50%);
    }

    .purple-shadow {
      position: absolute;
      top: 30px;
      left: 50%;
      width: 450px;
      height: 450px;
      background: radial-gradient(circle, rgba(128, 0, 128, 0.2), transparent 70%);
      border-radius: 50%;
      transform: translate(-50%);
      animation: wave-color-motion 5s infinite ease-in-out;
    }

    .stars {
      position: absolute;
      width: 100%;
      height: 100%;
      z-index: -1;
    }

    .star {
      position: absolute;
      width: 4px;
      height: 4px;
      background: purple;
      border-radius: 50%;
      animation: twinkle 3s infinite ease-in-out;
    }

    /* Animations */
    @keyframes neon-glow {
      0%, 100% {
        box-shadow: 
          0 0 20px 5px pink,
          0 0 40px 10px purple,
          0 0 60px 15px blue;
      }
      50% {
        box-shadow: 
          0 0 30px 10px pink,
          0 0 50px 15px purple,
          0 0 70px 20px blue;
      }
    }

    @keyframes wave-color-motion {
      0% {
        transform: translate(-50%) scale(1);
        background: radial-gradient(circle, rgba(59, 3, 59, 0.2), transparent 70%);
      }
      25% {
        transform: translate(-50%) scale(1.1);
        background: radial-gradient(circle, rgba(170, 0, 170, 0.4), transparent 70%);
      }
      50% {
        transform: translate(-50%) scale(1.2);
        background: radial-gradient(circle, rgba(200, 0, 200, 0.6), transparent 70%);
      }
      75% {
        transform: translate(-50%) scale(1.1);
        background: radial-gradient(circle, rgba(170, 0, 170, 0.4), transparent 70%);
      }
      100% {
        transform: translate(-50%) scale(1);
        background: radial-gradient(circle, rgba(128, 0, 128, 0.2), transparent 70%);
      }
    }

    @keyframes twinkle {
      0%, 100% {
        opacity: 1;
      }
      50% {
        opacity: 0.2;
      }
    }
  </style>
</head>
<body>
  <div class="black-hole-container">
    <div class="purple-shadow"></div>
    <div class="black-hole"></div>
  </div>
  <div class="stars"></div>

  <script>
    const starsContainer = document.querySelector('.stars');

    // Generate random stars
    for (let i = 0; i < 200; i++) {
      const star = document.createElement('div');
      star.classList.add('star');
      star.style.left = `${Math.random() * 100}vw`;
      star.style.top = `${Math.random() * 100}vh`;
      star.style.animationDelay = `${Math.random() * 5}s`;
      starsContainer.appendChild(star);
    }
  </script>
</body>
</html>

Enter fullscreen mode Exit fullscreen mode

Top comments (0)