You Might Also Like
Aurora Gradient Footer — Free HTML CSS Animated Background Footer
Aurora Gradient Footer · Footers · Plain HTML & CSS · Live preview
What's included
Features
About this UI Snippet
Aurora Gradient Footer — A Living Background Behind a Static CTA

A footer's final CTA competes for attention with everything the user just scrolled past. This snippet borrows the ambient-glow trick from modern SaaS hero sections — three large, blurred, slowly drifting colour blobs — and puts it behind the footer's closing pitch instead, so the last thing on the page feels alive rather than like an afterthought bolted on once the content ran out.
Three blobs, three independent drift paths
.agf-aurora is an absolutely positioned layer holding three radial-gradient circles, each roughly 350–420px, positioned to overlap loosely across the top and bottom of the footer. Each blob runs its own @keyframes — drift1, drift2, drift3 — translating and scaling on a different duration (16s, 20s, 18s) and a different path. Giving each blob its own timing is what stops the animation from reading as one thing pulsing; three independent, slightly-out-of-sync motions is what makes it feel organic rather than mechanical, the same principle behind aurora background hero effects.
One `blur()` on the parent, not three
Rather than blurring each blob individually, filter: blur(60px) sits on the .agf-aurora wrapper and applies to all three children at once. This is both simpler to tune — one blur radius controls the whole effect's softness — and cheaper: the browser composites the blurred layer once rather than filtering three separate elements every frame. opacity: .55 on the same wrapper keeps the effect ambient rather than distracting from the text sitting above it.
Content sits in its own stacking layer
Everything the user actually reads — the CTA, the link columns, the bottom bar — lives inside .agf-inner at position: relative; z-index: 1, one paint layer above the aurora. This is the same content-above-effect separation used in the glare card: the ambient motion never has to fight for legibility because it is structurally behind the text, not blended with it.
A CTA that earns the space, then a real footer beneath it
The upper half is a single centred call to action — the loudest, simplest moment on the page. Below it, a conventional three-column link grid and a slim bottom bar handle the actual navigational duty, separated by a hairline border. Splitting the footer this way means the aurora effect only has to carry the emotional close of the page; it doesn't have to compete with a dense link directory sitting in the same visual field.
Build with AI
Build, Understand, Optimize, and Extend It With AI
Paste this snippet's HTML and CSS into an AI assistant like Claude and ask it to explain why each blob uses a different animation-duration rather than all three sharing one timing — and what the footer would look like (and why it would look worse) if all three moved in perfect sync. It's also a good candidate for a performance pass: ask the assistant to identify whether any properties beyond transform and opacity are being animated per-frame that could be moved to composited-only properties, and whether reducing blob count or blur radius would meaningfully help on low-end mobile GPUs. For extending it, ask for a prefers-reduced-motion variant that freezes the blobs while keeping their gradients visible, or for the blob colours to be driven by CSS custom properties so an entire theme swap is a single JavaScript-set variable rather than editing each gradient by hand.
Prompt to recreate it
Copy this into your AI assistant of choice to build the effect from scratch, or as a jumping-off point for your own variant:
Build an "aurora gradient" website footer in plain HTML and CSS only — no JavaScript, no canvas, no external library.
Requirements:
- A dark footer container with an absolutely positioned background layer holding three large radial-gradient circular blobs (roughly 350-420px each), each in a different accent colour (e.g. indigo, pink, cyan), fading to transparent at their edges.
- Give each blob its own @keyframes animation with a distinct duration (in the 16-20 second range) and a distinct translate/scale drift path, so the three blobs move independently and never synchronize — this is essential to the effect reading as organic rather than mechanical.
- Apply a single shared blur filter (around 60px) and a reduced opacity to the parent background layer rather than blurring each blob individually, for both simplicity and performance.
- Above the aurora layer, in its own stacked z-index context, place real footer content: a centred call-to-action section (headline, subtext, a white pill button with an arrow that shifts right on hover), followed by a three-column link grid separated by a hairline border, and a slim bottom bar with a brand mark and copyright.
- Make it fully responsive: the link columns should collapse from three to two per row below 640px, and the bottom bar should stack on narrow screens.
- Keep all animation restricted to transform and opacity so it stays smooth and GPU-composited.Want to tighten it up first? Run this prompt through the AI Prompt Studio to score it across 8 quality dimensions, catch anti-patterns, and tune the wording for Claude, ChatGPT, or Gemini before you paste it in.
Step by step
How to Use
- 1Paste HTML and CSSThe aurora blobs start drifting immediately on load — no JavaScript is used.
- 2Adjust the blob coloursEach .agf-blob's radial-gradient starts with a hex colour — change b1/b2/b3 to match your brand palette.
- 3Tune the drift speed and blurEdit the animation-duration on each keyframe for faster or slower movement, and blur(60px) on .agf-aurora for a sharper or softer glow.
- 4Update the CTA and link columnsReplace the headline, subtext, button text, and the three link columns with your own content.
- 5Check performance on a low-end deviceThe blur is GPU-composited but still worth testing — if it stutters on older hardware, reduce blob size or blur radius rather than removing the animation entirely.
- 6Export in your formatClick HTML, JSX, or Tailwind to download the version you need.
Real-world uses
Common Use Cases
Got questions?
Frequently Asked Questions
It should be lightweight on any reasonably modern device — the blobs animate transform and the blur is applied once to a parent wrapper rather than per element, so the browser compositor handles most of the work off the main thread. If you notice stutter on low-end hardware, reduce blob size or blur radius before removing the animation, and consider gating it behind prefers-reduced-motion.
Filtering three separate elements individually is more expensive than filtering one shared parent layer once. It also means a single blur(60px) value controls the softness of the entire effect, rather than needing to keep three blur values in sync.
It already cannot — the aurora layer is position: absolute with no z-index, and all real content lives inside .agf-inner at position: relative; z-index: 1, placing it in a higher paint layer. The effect is structurally behind the content, not blended with it.
Yes. Each blob is an independent span with its own keyframe animation, so you can add a fourth with a new drift path and duration, or remove one — just keep each blob's timing distinct from the others so the motion continues to read as organic rather than synchronized.
Not out of the box — add a @media (prefers-reduced-motion: reduce) block that sets animation: none on each .agf-blob to freeze the blobs in place for users who have that OS setting enabled, while keeping the static gradient colours visible.
Click JSX, Vue, or Angular to download the converted component. The animation is pure CSS keyframes, so no lifecycle code is needed — the conversion is a direct markup and class-name translation.