CSS AURORA BACKGROUND GENERATOR

Drift blurred, glowing color blobs across a dark background and copy the HTML and CSS.

Blob 1
Blob 2
Blob 3
<div class="aurora-bg">
  <span class="aurora-blob aurora-blob-1"></span>
  <span class="aurora-blob aurora-blob-2"></span>
  <span class="aurora-blob aurora-blob-3"></span>
  <div class="aurora-content">Your content here</div>
</div>
.aurora-bg {
  position: relative;
  overflow: hidden;
  background: #04120f;
}

.aurora-blob {
  position: absolute;
  border-radius: 50%;
  filter: blur(60px);
  mix-blend-mode: screen;
}

.aurora-blob-1 {
  left: -12%;
  top: -15%;
  width: 62%;
  height: 62%;
  background: #00ffb2;
  animation: aurora-drift-1 10s ease-in-out infinite alternate;
  animation-delay: 0s;
}

.aurora-blob-2 {
  left: 42%;
  top: -8%;
  width: 58%;
  height: 58%;
  background: #22e39a;
  animation: aurora-drift-2 13s ease-in-out infinite alternate;
  animation-delay: -1.6s;
}

.aurora-blob-3 {
  left: 8%;
  top: 38%;
  width: 60%;
  height: 60%;
  background: #7cffcb;
  animation: aurora-drift-3 8.5s ease-in-out infinite alternate;
  animation-delay: -0.8s;
}

@keyframes aurora-drift-1 {
  0% { transform: translate(0%, 0%) scale(1); } 50% { transform: translate(14%, -10%) scale(1.15); } 100% { transform: translate(-10%, 10%) scale(0.92); }
}

@keyframes aurora-drift-2 {
  0% { transform: translate(0%, 0%) scale(1); } 50% { transform: translate(-16%, 12%) scale(0.9); } 100% { transform: translate(10%, -8%) scale(1.1); }
}

@keyframes aurora-drift-3 {
  0% { transform: translate(0%, 0%) scale(1); } 50% { transform: translate(10%, 14%) scale(1.1); } 100% { transform: translate(-14%, -6%) scale(0.9); }
}

.aurora-content {
  position: relative;
  z-index: 1;
}

/* Each blob has its own duration multiplier and a negative animation-delay
   so they start mid-cycle and never move in lockstep — intentional. */
@media (prefers-reduced-motion: reduce) {
  .aurora-blob-1 { animation: none; }
  .aurora-blob-2 { animation: none; }
  .aurora-blob-3 { animation: none; }
}

How to build a CSS aurora background

  1. 1

    Pick a preset or set your own dark base background color.

  2. 2

    Add aurora-colored blobs and set each one's color.

  3. 3

    Adjust blur strength for how soft and diffuse the light looks.

  4. 4

    Set the drift speed for how fast the blobs move.

  5. 5

    Copy the HTML and CSS — each blob animates independently for a natural, non-repeating drift.

Questions

How is the aurora effect built without canvas or WebGL?
A few large, softly-shaped div elements are given a strong filter: blur() and a saturated color, then layered over a dark background with mix-blend-mode: screen so overlapping colors add light together instead of covering each other — the blur and blend are what turn simple shapes into a glowing, diffuse light field.
Why mix-blend-mode: screen instead of just semi-transparent colors?
Screen blending lightens colors where layers overlap the way light does (similar to shining two colored spotlights on the same spot), which reads as a genuine glow; plain opacity just dims and grays out the overlap instead of brightening it, which looks flat rather than luminous.
Why does each blob need its own animation delay?
If every blob ran the exact same keyframes on the same timeline, they'd all move in lockstep and the pattern would look mechanical and repeat in an obvious loop; staggering each blob's animation-delay and duration slightly makes their combined motion look organic and non-repeating, closer to how real aurora light drifts.
Will a heavy blur radius slow down the page?
filter: blur() on large, animated elements is one of the more expensive CSS effects to repaint, so on lower-end devices or when used across a full viewport it's worth keeping the blur radius and number of blobs modest, and testing on mobile before shipping it as a full-page background.
Does this respect reduced-motion settings, and is it computed locally?
Yes to both — the drift animations are wrapped in @media (prefers-reduced-motion: reduce) so blobs hold still for visitors who've opted out of motion, and the whole preview and CSS are generated client-side with nothing uploaded.