Project Gallery

Explore 3D Orbit Loading Animation – Clean & Elegant UI in detail
1 /1

Project Overview

3D Orbit Loading Animation – Clean & Elegant UI

Project Description

A modern and visually engaging loading animation built using pure HTML and CSS. Featuring orbiting particles, smooth transitions, and glowing effects, this loader enhances user experience with a premium and elegant design.

HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
  <title>Orbit Pulse | Premium Loading Animation</title>
 
</head>
<body>
  <div class="loading-bar">
    <div class="load-section">
      <!-- 6 orbiting particles that create hypnotic loading sequence -->
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="circle">
        <div class="dot"></div>
      </div>
      <div class="loading-text">Loading...</div>
    </div>
  </div>
</body>
</html>
CSS
<style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      display: flex;
      background: linear-gradient(145deg, #c20000 0%, #8b0000 100%);
      min-height: 100vh;
      text-align: center;
      align-items: center;
      justify-content: center;
      font-family: system-ui, 'Segoe UI', 'Verdana', sans-serif;
      overflow: hidden;
      position: relative;
    }

    /* subtle animated background grain / shimmer (optional premium touch) */
    body::before {
      content: "";
      position: absolute;
      inset: 0;
      background: radial-gradient(circle at 20% 40%, rgba(255,255,200,0.08) 0%, rgba(0,0,0,0) 70%);
      pointer-events: none;
      animation: softGlow 6s infinite alternate;
    }

    @keyframes softGlow {
      0% { opacity: 0.3; }
      100% { opacity: 0.8; }
    }

    .loading-bar {
      width: 100%;
      display: flex;
      position: relative;
      justify-content: center;
      align-items: center;
      perspective: 800px;
    }

    .load-section {
      top: -35px;
      position: absolute;
      transform: scale(1.5);
      transform-style: preserve-3d;
    }

    /* circle container for each orbiting dot */
    .circle {
      width: 1px;
      height: 5px;
      position: absolute;
      animation: rotate 3.5s cubic-bezier(0.55, 0.15, 0.35, 0.95) infinite;
      transform-origin: center;
    }

    /* glowing dot with subtle shadow */
    .circle .dot {
      top: 30px;
      width: 7px;
      height: 7px;
      background: #fff;
      border-radius: 50%;
      position: relative;
      box-shadow: 0 0 6px rgba(255, 255, 255, 0.8), 0 0 12px rgba(255, 220, 100, 0.5);
      transition: all 0.1s ease;
    }

    /* loading text style with smooth tracking & elegance */
    .loading-text {
      color: #fff;
      bottom: -85px;
      font-size: 26px;
      font-weight: 500;
      letter-spacing: 2px;
      margin-left: -50px;
      position: absolute;
      font-family: 'Segoe UI', 'Verdana', 'Geneva', sans-serif;
      text-transform: uppercase;
      background: linear-gradient(135deg, #ffffff, #ffdd99);
      background-clip: text;
      -webkit-background-clip: text;
      color: transparent;
      text-shadow: 0 2px 5px rgba(0,0,0,0.2);
      backdrop-filter: blur(2px);
      animation: textPulse 1.8s infinite alternate;
      white-space: nowrap;
    }

    @keyframes textPulse {
      0% {
        opacity: 0.65;
        letter-spacing: 1px;
        background: linear-gradient(135deg, #fff, #ffcc88);
        background-clip: text;
        -webkit-background-clip: text;
      }
      100% {
        opacity: 1;
        letter-spacing: 3px;
        background: linear-gradient(135deg, #fffaec, #ffaa66);
        background-clip: text;
        -webkit-background-clip: text;
      }
    }

    /* 
      Enhanced keyframe: 
      smooth rotation with orbiting momentum + fade-out/fade-in effect 
      to give "loading loop" dynamic style. 
      The original creative timing keeps the dots rotating elegantly.
    */
    @keyframes rotate {
      0% {
        transform: rotate(0deg);
        opacity: 0;
      }
      10% {
        opacity: 1;
      }
      30% {
        transform: rotate(220deg);
        opacity: 1;
      }
      40% {
        transform: rotate(450deg);
        opacity: 1;
      }
      70% {
        transform: rotate(700deg);
        opacity: 1;
      }
      75% {
        transform: rotate(720deg);
        opacity: 1;
      }
      76% {
        opacity: 0;
      }
      95% {
        opacity: 0;
        transform: rotate(0deg);
      }
      100% {
        opacity: 0;
        transform: rotate(0deg);
      }
    }

    /* Delay cascade: creates wave-like orbital motion */
    .circle:nth-child(1) {
      animation-delay: 0.15s;
    }
    .circle:nth-child(2) {
      animation-delay: 0.3s;
    }
    .circle:nth-child(3) {
      animation-delay: 0.45s;
    }
    .circle:nth-child(4) {
      animation-delay: 0.6s;
    }
    .circle:nth-child(5) {
      animation-delay: 0.75s;
    }
    .circle:nth-child(6) {
      animation-delay: 0.9s;
    }

    /* responsive & maintain perfect centering on any device */
    @media (max-width: 550px) {
      .load-section {
        transform: scale(1.2);
        top: -30px;
      }
      .loading-text {
        font-size: 22px;
        margin-left: -40px;
        bottom: -75px;
        white-space: nowrap;
      }
      .circle .dot {
        width: 6px;
        height: 6px;
        top: 28px;
      }
    }

    @media (max-width: 380px) {
      .load-section {
        transform: scale(1);
        top: -20px;
      }
      .loading-text {
        font-size: 18px;
        margin-left: -35px;
        bottom: -65px;
      }
    }

    /* optional: add small smooth focus ring removal, just for aesthetics */
    :focus-visible {
      outline: none;
    }
  </style>
JavaScript