12 CSS Ripple Effects12 / 12
CSS Aurora Borealis Ripple Background
A night-sky hero with four drifting blur-filtered aurora blob layers (mix-blend-mode: screen), concentric ripple rings expanding from multiple anchor points in teal, indigo and cyan, 80 JS-seeded twinkling stars and floating editorial badges. Cormorant Garamond + Outfit on deep #020617 midnight.
Published
This is a full-page demo — interact inside the frame above, or open it in the playground for the full-screen experience.
The code
<div class="rpl-12">
<!-- Aurora blobs -->
<div class="rpl-12__aurora">
<div class="rpl-12__blob rpl-12__blob--a"></div>
<div class="rpl-12__blob rpl-12__blob--b"></div>
<div class="rpl-12__blob rpl-12__blob--c"></div>
<div class="rpl-12__blob rpl-12__blob--d"></div>
</div>
<!-- Ripple rings -->
<div class="rpl-12__ripple-field">
<div class="rpl-12__arc rpl-12__arc--t1"></div>
<div class="rpl-12__arc rpl-12__arc--t2"></div>
<div class="rpl-12__arc rpl-12__arc--t3"></div>
<div class="rpl-12__arc rpl-12__arc--t4"></div>
<div class="rpl-12__arc rpl-12__arc--i1"></div>
<div class="rpl-12__arc rpl-12__arc--i2"></div>
<div class="rpl-12__arc rpl-12__arc--i3"></div>
<div class="rpl-12__arc rpl-12__arc--c1"></div>
<div class="rpl-12__arc rpl-12__arc--c2"></div>
</div>
<!-- Stars -->
<div class="rpl-12__stars" id="rpl-12-stars"></div>
<!-- Floating labels -->
<div class="rpl-12__badge rpl-12__badge--1">Pure CSS</div>
<div class="rpl-12__badge rpl-12__badge--2">No Canvas</div>
<div class="rpl-12__badge rpl-12__badge--3">CSS Ripple</div>
<div class="rpl-12__badge rpl-12__badge--4">Keyframes</div>
<!-- Main content -->
<div class="rpl-12__content">
<div class="eyebrow">Aurora Ripple Effect</div>
<h1>Where<br>light <em>ripples</em><br>endlessly.</h1>
<p>Aurora blobs drift across a starfield while concentric rings expand outward — layered CSS gradients, blur filters and keyframe animations. Zero JavaScript for the background.</p>
<div class="rpl-12__ctas">
<a href="#" class="rpl-12__cta rpl-12__cta--primary">Explore Effect →</a>
<a href="#" class="rpl-12__cta rpl-12__cta--ghost">View Source</a>
</div>
</div>
</div><div class="rpl-12">
<!-- Aurora blobs -->
<div class="rpl-12__aurora">
<div class="rpl-12__blob rpl-12__blob--a"></div>
<div class="rpl-12__blob rpl-12__blob--b"></div>
<div class="rpl-12__blob rpl-12__blob--c"></div>
<div class="rpl-12__blob rpl-12__blob--d"></div>
</div>
<!-- Ripple rings -->
<div class="rpl-12__ripple-field">
<div class="rpl-12__arc rpl-12__arc--t1"></div>
<div class="rpl-12__arc rpl-12__arc--t2"></div>
<div class="rpl-12__arc rpl-12__arc--t3"></div>
<div class="rpl-12__arc rpl-12__arc--t4"></div>
<div class="rpl-12__arc rpl-12__arc--i1"></div>
<div class="rpl-12__arc rpl-12__arc--i2"></div>
<div class="rpl-12__arc rpl-12__arc--i3"></div>
<div class="rpl-12__arc rpl-12__arc--c1"></div>
<div class="rpl-12__arc rpl-12__arc--c2"></div>
</div>
<!-- Stars -->
<div class="rpl-12__stars" id="rpl-12-stars"></div>
<!-- Floating labels -->
<div class="rpl-12__badge rpl-12__badge--1">Pure CSS</div>
<div class="rpl-12__badge rpl-12__badge--2">No Canvas</div>
<div class="rpl-12__badge rpl-12__badge--3">CSS Ripple</div>
<div class="rpl-12__badge rpl-12__badge--4">Keyframes</div>
<!-- Main content -->
<div class="rpl-12__content">
<div class="eyebrow">Aurora Ripple Effect</div>
<h1>Where<br>light <em>ripples</em><br>endlessly.</h1>
<p>Aurora blobs drift across a starfield while concentric rings expand outward — layered CSS gradients, blur filters and keyframe animations. Zero JavaScript for the background.</p>
<div class="rpl-12__ctas">
<a href="#" class="rpl-12__cta rpl-12__cta--primary">Explore Effect →</a>
<a href="#" class="rpl-12__cta rpl-12__cta--ghost">View Source</a>
</div>
</div>
</div>@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,600;1,300;1,600&family=Outfit:wght@300;400;500&display=swap');
.rpl-12,
.rpl-12 *,
.rpl-12 *::before,
.rpl-12 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-12 ::selection {
background: #a5f3fc;
color: #020617;
}
.rpl-12 {
font-family: 'Outfit', sans-serif;
background: #020617;
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 60px 24px;
}
/* ─── Aurora layers: radial blobs that drift and pulse ─── */
.rpl-12__aurora {
position: absolute;
inset: 0;
pointer-events: none;
}
/* Blob A — teal/green */
.rpl-12__blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
mix-blend-mode: screen;
animation: rpl-12-drift ease-in-out infinite alternate;
}
.rpl-12__blob--a {
width: 70vw;
height: 50vh;
top: -10%;
left: -10%;
background: radial-gradient(ellipse, rgba(52,211,153,0.4) 0%, rgba(16,185,129,0.2) 50%, transparent 100%);
animation-duration: 12s;
}
.rpl-12__blob--b {
width: 60vw;
height: 60vh;
top: 20%;
right: -15%;
background: radial-gradient(ellipse, rgba(99,102,241,0.35) 0%, rgba(79,70,229,0.15) 50%, transparent 100%);
animation-duration: 16s;
animation-delay: -4s;
}
.rpl-12__blob--c {
width: 55vw;
height: 45vh;
bottom: -10%;
left: 20%;
background: radial-gradient(ellipse, rgba(6,182,212,0.3) 0%, rgba(14,165,233,0.15) 50%, transparent 100%);
animation-duration: 10s;
animation-delay: -7s;
}
.rpl-12__blob--d {
width: 40vw;
height: 35vh;
top: 30%;
left: 30%;
background: radial-gradient(ellipse, rgba(167,243,208,0.25) 0%, rgba(52,211,153,0.1) 50%, transparent 100%);
animation-duration: 20s;
animation-delay: -10s;
}
@keyframes rpl-12-drift {
0% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(4%, 6%) scale(1.08);
}
66% {
transform: translate(-3%, 4%) scale(0.95);
}
100% {
transform: translate(6%, -4%) scale(1.05);
}
}
/* ─── Ripple rings that expand from center ─── */
.rpl-12__ripple-field {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__arc {
position: absolute;
border-radius: 50%;
border: 1px solid;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
animation: rpl-12-ring ease-out infinite;
}
/* Teal rings */
.rpl-12__arc--t1 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.6);
animation-duration: 6s;
animation-delay: 0s;
}
.rpl-12__arc--t2 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.35);
animation-duration: 6s;
animation-delay: 1.5s;
}
.rpl-12__arc--t3 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.18);
animation-duration: 6s;
animation-delay: 3.0s;
}
.rpl-12__arc--t4 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.08);
animation-duration: 6s;
animation-delay: 4.5s;
}
/* Indigo rings */
.rpl-12__arc--i1 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.5);
animation-duration: 8s;
animation-delay: 2s;
}
.rpl-12__arc--i2 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.25);
animation-duration: 8s;
animation-delay: 4s;
}
.rpl-12__arc--i3 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.12);
animation-duration: 8s;
animation-delay: 6s;
}
/* Cyan rings — slightly offset */
.rpl-12__arc--c1 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.45);
animation-duration: 9s;
animation-delay: 1s;
top: 40%;
left: 55%;
}
.rpl-12__arc--c2 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.22);
animation-duration: 9s;
animation-delay: 3.5s;
top: 40%;
left: 55%;
}
@keyframes rpl-12-ring {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
100% {
transform: translate(-50%,-50%) scale(14);
opacity: 0;
}
}
/* Stars */
.rpl-12__stars {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__star {
position: absolute;
border-radius: 50%;
background: #fff;
animation: rpl-12-twinkle ease-in-out infinite alternate;
}
@keyframes rpl-12-twinkle {
to {
opacity: 0.1;
transform: scale(0.6);
}
}
/* Content */
.rpl-12__content {
position: relative;
z-index: 10;
text-align: center;
max-width: 600px;
}
.rpl-12__content .eyebrow {
display: inline-block;
font-size: 0.72rem;
letter-spacing: 0.28em;
text-transform: uppercase;
color: rgba(165,243,252,0.6);
margin-bottom: 20px;
border: 1px solid rgba(165,243,252,0.2);
border-radius: 40px;
padding: 6px 16px;
}
.rpl-12__content h1 {
font-family: 'Cormorant Garamond';
font-size: clamp(3rem, 10vw, 6rem);
font-weight: 300;
line-height: 0.9;
color: #f0fdff;
letter-spacing: -0.01em;
}
.rpl-12__content h1 em {
font-style: italic;
font-weight: 600;
background: linear-gradient(135deg, #5eead4, #22d3ee, #818cf8);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.rpl-12__content p {
margin-top: 24px;
font-size: 1rem;
color: rgba(240,253,255,0.5);
line-height: 1.7;
font-weight: 300;
max-width: 440px;
margin-left: auto;
margin-right: auto;
}
.rpl-12__ctas {
display: flex;
gap: 14px;
justify-content: center;
flex-wrap: wrap;
margin-top: 36px;
}
.rpl-12__cta {
padding: 14px 30px;
border-radius: 40px;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
letter-spacing: 0.02em;
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-12__cta--primary {
background: linear-gradient(135deg, #14b8a6, #6366f1);
color: #fff;
box-shadow: 0 8px 32px rgba(99,102,241,0.35), 0 0 0 1px rgba(255,255,255,0.1) inset;
}
.rpl-12__cta--primary:hover {
transform: translateY(-2px);
box-shadow: 0 16px 48px rgba(99,102,241,0.5);
}
.rpl-12__cta--ghost {
border: 1px solid rgba(165,243,252,0.25);
color: rgba(240,253,255,0.75);
background: rgba(255,255,255,0.04);
}
.rpl-12__cta--ghost:hover {
border-color: rgba(165,243,252,0.5);
background: rgba(255,255,255,0.06);
transform: translateY(-2px);
}
/* Floating badges */
.rpl-12__badge {
position: absolute;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(165,243,252,0.15);
border-radius: 40px;
padding: 8px 16px;
font-size: 0.72rem;
color: rgba(165,243,252,0.5);
letter-spacing: 0.12em;
text-transform: uppercase;
z-index: 5;
animation: rpl-12-float ease-in-out infinite alternate;
}
.rpl-12__badge--1 {
top: 14%;
left: 8%;
animation-duration: 6s;
}
.rpl-12__badge--2 {
top: 20%;
right: 6%;
animation-duration: 8s;
animation-delay: -2s;
}
.rpl-12__badge--3 {
bottom: 18%;
left: 6%;
animation-duration: 7s;
animation-delay: -4s;
}
.rpl-12__badge--4 {
bottom: 14%;
right: 8%;
animation-duration: 5s;
animation-delay: -1s;
}
@keyframes rpl-12-float {
to {
transform: translateY(-10px);
}
}
@media (max-width: 640px) {
.rpl-12__badge {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-12__blob,
.rpl-12__arc,
.rpl-12__star,
.rpl-12__badge {
animation: none !important;
}
.rpl-12__cta {
transition: none;
}
}@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,600;1,300;1,600&family=Outfit:wght@300;400;500&display=swap');
.rpl-12,
.rpl-12 *,
.rpl-12 *::before,
.rpl-12 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-12 ::selection {
background: #a5f3fc;
color: #020617;
}
.rpl-12 {
font-family: 'Outfit', sans-serif;
background: #020617;
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 60px 24px;
}
/* ─── Aurora layers: radial blobs that drift and pulse ─── */
.rpl-12__aurora {
position: absolute;
inset: 0;
pointer-events: none;
}
/* Blob A — teal/green */
.rpl-12__blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
mix-blend-mode: screen;
animation: rpl-12-drift ease-in-out infinite alternate;
}
.rpl-12__blob--a {
width: 70vw;
height: 50vh;
top: -10%;
left: -10%;
background: radial-gradient(ellipse, rgba(52,211,153,0.4) 0%, rgba(16,185,129,0.2) 50%, transparent 100%);
animation-duration: 12s;
}
.rpl-12__blob--b {
width: 60vw;
height: 60vh;
top: 20%;
right: -15%;
background: radial-gradient(ellipse, rgba(99,102,241,0.35) 0%, rgba(79,70,229,0.15) 50%, transparent 100%);
animation-duration: 16s;
animation-delay: -4s;
}
.rpl-12__blob--c {
width: 55vw;
height: 45vh;
bottom: -10%;
left: 20%;
background: radial-gradient(ellipse, rgba(6,182,212,0.3) 0%, rgba(14,165,233,0.15) 50%, transparent 100%);
animation-duration: 10s;
animation-delay: -7s;
}
.rpl-12__blob--d {
width: 40vw;
height: 35vh;
top: 30%;
left: 30%;
background: radial-gradient(ellipse, rgba(167,243,208,0.25) 0%, rgba(52,211,153,0.1) 50%, transparent 100%);
animation-duration: 20s;
animation-delay: -10s;
}
@keyframes rpl-12-drift {
0% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(4%, 6%) scale(1.08);
}
66% {
transform: translate(-3%, 4%) scale(0.95);
}
100% {
transform: translate(6%, -4%) scale(1.05);
}
}
/* ─── Ripple rings that expand from center ─── */
.rpl-12__ripple-field {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__arc {
position: absolute;
border-radius: 50%;
border: 1px solid;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
animation: rpl-12-ring ease-out infinite;
}
/* Teal rings */
.rpl-12__arc--t1 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.6);
animation-duration: 6s;
animation-delay: 0s;
}
.rpl-12__arc--t2 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.35);
animation-duration: 6s;
animation-delay: 1.5s;
}
.rpl-12__arc--t3 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.18);
animation-duration: 6s;
animation-delay: 3.0s;
}
.rpl-12__arc--t4 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.08);
animation-duration: 6s;
animation-delay: 4.5s;
}
/* Indigo rings */
.rpl-12__arc--i1 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.5);
animation-duration: 8s;
animation-delay: 2s;
}
.rpl-12__arc--i2 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.25);
animation-duration: 8s;
animation-delay: 4s;
}
.rpl-12__arc--i3 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.12);
animation-duration: 8s;
animation-delay: 6s;
}
/* Cyan rings — slightly offset */
.rpl-12__arc--c1 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.45);
animation-duration: 9s;
animation-delay: 1s;
top: 40%;
left: 55%;
}
.rpl-12__arc--c2 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.22);
animation-duration: 9s;
animation-delay: 3.5s;
top: 40%;
left: 55%;
}
@keyframes rpl-12-ring {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
100% {
transform: translate(-50%,-50%) scale(14);
opacity: 0;
}
}
/* Stars */
.rpl-12__stars {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__star {
position: absolute;
border-radius: 50%;
background: #fff;
animation: rpl-12-twinkle ease-in-out infinite alternate;
}
@keyframes rpl-12-twinkle {
to {
opacity: 0.1;
transform: scale(0.6);
}
}
/* Content */
.rpl-12__content {
position: relative;
z-index: 10;
text-align: center;
max-width: 600px;
}
.rpl-12__content .eyebrow {
display: inline-block;
font-size: 0.72rem;
letter-spacing: 0.28em;
text-transform: uppercase;
color: rgba(165,243,252,0.6);
margin-bottom: 20px;
border: 1px solid rgba(165,243,252,0.2);
border-radius: 40px;
padding: 6px 16px;
}
.rpl-12__content h1 {
font-family: 'Cormorant Garamond';
font-size: clamp(3rem, 10vw, 6rem);
font-weight: 300;
line-height: 0.9;
color: #f0fdff;
letter-spacing: -0.01em;
}
.rpl-12__content h1 em {
font-style: italic;
font-weight: 600;
background: linear-gradient(135deg, #5eead4, #22d3ee, #818cf8);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.rpl-12__content p {
margin-top: 24px;
font-size: 1rem;
color: rgba(240,253,255,0.5);
line-height: 1.7;
font-weight: 300;
max-width: 440px;
margin-left: auto;
margin-right: auto;
}
.rpl-12__ctas {
display: flex;
gap: 14px;
justify-content: center;
flex-wrap: wrap;
margin-top: 36px;
}
.rpl-12__cta {
padding: 14px 30px;
border-radius: 40px;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
letter-spacing: 0.02em;
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-12__cta--primary {
background: linear-gradient(135deg, #14b8a6, #6366f1);
color: #fff;
box-shadow: 0 8px 32px rgba(99,102,241,0.35), 0 0 0 1px rgba(255,255,255,0.1) inset;
}
.rpl-12__cta--primary:hover {
transform: translateY(-2px);
box-shadow: 0 16px 48px rgba(99,102,241,0.5);
}
.rpl-12__cta--ghost {
border: 1px solid rgba(165,243,252,0.25);
color: rgba(240,253,255,0.75);
background: rgba(255,255,255,0.04);
}
.rpl-12__cta--ghost:hover {
border-color: rgba(165,243,252,0.5);
background: rgba(255,255,255,0.06);
transform: translateY(-2px);
}
/* Floating badges */
.rpl-12__badge {
position: absolute;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(165,243,252,0.15);
border-radius: 40px;
padding: 8px 16px;
font-size: 0.72rem;
color: rgba(165,243,252,0.5);
letter-spacing: 0.12em;
text-transform: uppercase;
z-index: 5;
animation: rpl-12-float ease-in-out infinite alternate;
}
.rpl-12__badge--1 {
top: 14%;
left: 8%;
animation-duration: 6s;
}
.rpl-12__badge--2 {
top: 20%;
right: 6%;
animation-duration: 8s;
animation-delay: -2s;
}
.rpl-12__badge--3 {
bottom: 18%;
left: 6%;
animation-duration: 7s;
animation-delay: -4s;
}
.rpl-12__badge--4 {
bottom: 14%;
right: 8%;
animation-duration: 5s;
animation-delay: -1s;
}
@keyframes rpl-12-float {
to {
transform: translateY(-10px);
}
}
@media (max-width: 640px) {
.rpl-12__badge {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-12__blob,
.rpl-12__arc,
.rpl-12__star,
.rpl-12__badge {
animation: none !important;
}
.rpl-12__cta {
transition: none;
}
}(function() {
const stars = document.getElementById('rpl-12-stars');
for (let i = 0; i < 80; i++) {
const s = document.createElement('div');
s.className = 'rpl-12__star';
const size = Math.random() * 2.5 + 0.5;
const delay = Math.random() * 4;
const dur = Math.random() * 3 + 2;
s.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
opacity:${Math.random()*0.8+0.1};
animation-duration:${dur}s;
animation-delay:${delay}s;
`;
stars.appendChild(s);
}
})();(function() {
const stars = document.getElementById('rpl-12-stars');
for (let i = 0; i < 80; i++) {
const s = document.createElement('div');
s.className = 'rpl-12__star';
const size = Math.random() * 2.5 + 0.5;
const delay = Math.random() * 4;
const dur = Math.random() * 3 + 2;
s.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
opacity:${Math.random()*0.8+0.1};
animation-duration:${dur}s;
animation-delay:${delay}s;
`;
stars.appendChild(s);
}
})();Here's a working CSS Ripple Effect from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: CSS Aurora Borealis Ripple Background
Source: https://codefronts.com/motion/css-ripple-designs/css-aurora-borealis-ripple-background/
A night-sky hero with four drifting blur-filtered aurora blob layers (mix-blend-mode: screen), concentric ripple rings expanding from multiple anchor points in teal, indigo and cyan, 80 JS-seeded twinkling stars and floating editorial badges. Cormorant Garamond + Outfit on deep #020617 midnight.
## HTML
```html
<div class="rpl-12">
<!-- Aurora blobs -->
<div class="rpl-12__aurora">
<div class="rpl-12__blob rpl-12__blob--a"></div>
<div class="rpl-12__blob rpl-12__blob--b"></div>
<div class="rpl-12__blob rpl-12__blob--c"></div>
<div class="rpl-12__blob rpl-12__blob--d"></div>
</div>
<!-- Ripple rings -->
<div class="rpl-12__ripple-field">
<div class="rpl-12__arc rpl-12__arc--t1"></div>
<div class="rpl-12__arc rpl-12__arc--t2"></div>
<div class="rpl-12__arc rpl-12__arc--t3"></div>
<div class="rpl-12__arc rpl-12__arc--t4"></div>
<div class="rpl-12__arc rpl-12__arc--i1"></div>
<div class="rpl-12__arc rpl-12__arc--i2"></div>
<div class="rpl-12__arc rpl-12__arc--i3"></div>
<div class="rpl-12__arc rpl-12__arc--c1"></div>
<div class="rpl-12__arc rpl-12__arc--c2"></div>
</div>
<!-- Stars -->
<div class="rpl-12__stars" id="rpl-12-stars"></div>
<!-- Floating labels -->
<div class="rpl-12__badge rpl-12__badge--1">Pure CSS</div>
<div class="rpl-12__badge rpl-12__badge--2">No Canvas</div>
<div class="rpl-12__badge rpl-12__badge--3">CSS Ripple</div>
<div class="rpl-12__badge rpl-12__badge--4">Keyframes</div>
<!-- Main content -->
<div class="rpl-12__content">
<div class="eyebrow">Aurora Ripple Effect</div>
<h1>Where<br>light <em>ripples</em><br>endlessly.</h1>
<p>Aurora blobs drift across a starfield while concentric rings expand outward — layered CSS gradients, blur filters and keyframe animations. Zero JavaScript for the background.</p>
<div class="rpl-12__ctas">
<a href="#" class="rpl-12__cta rpl-12__cta--primary">Explore Effect →</a>
<a href="#" class="rpl-12__cta rpl-12__cta--ghost">View Source</a>
</div>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,600;1,300;1,600&family=Outfit:wght@300;400;500&display=swap');
.rpl-12,
.rpl-12 *,
.rpl-12 *::before,
.rpl-12 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-12 ::selection {
background: #a5f3fc;
color: #020617;
}
.rpl-12 {
font-family: 'Outfit', sans-serif;
background: #020617;
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 60px 24px;
}
/* ─── Aurora layers: radial blobs that drift and pulse ─── */
.rpl-12__aurora {
position: absolute;
inset: 0;
pointer-events: none;
}
/* Blob A — teal/green */
.rpl-12__blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
mix-blend-mode: screen;
animation: rpl-12-drift ease-in-out infinite alternate;
}
.rpl-12__blob--a {
width: 70vw;
height: 50vh;
top: -10%;
left: -10%;
background: radial-gradient(ellipse, rgba(52,211,153,0.4) 0%, rgba(16,185,129,0.2) 50%, transparent 100%);
animation-duration: 12s;
}
.rpl-12__blob--b {
width: 60vw;
height: 60vh;
top: 20%;
right: -15%;
background: radial-gradient(ellipse, rgba(99,102,241,0.35) 0%, rgba(79,70,229,0.15) 50%, transparent 100%);
animation-duration: 16s;
animation-delay: -4s;
}
.rpl-12__blob--c {
width: 55vw;
height: 45vh;
bottom: -10%;
left: 20%;
background: radial-gradient(ellipse, rgba(6,182,212,0.3) 0%, rgba(14,165,233,0.15) 50%, transparent 100%);
animation-duration: 10s;
animation-delay: -7s;
}
.rpl-12__blob--d {
width: 40vw;
height: 35vh;
top: 30%;
left: 30%;
background: radial-gradient(ellipse, rgba(167,243,208,0.25) 0%, rgba(52,211,153,0.1) 50%, transparent 100%);
animation-duration: 20s;
animation-delay: -10s;
}
@keyframes rpl-12-drift {
0% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(4%, 6%) scale(1.08);
}
66% {
transform: translate(-3%, 4%) scale(0.95);
}
100% {
transform: translate(6%, -4%) scale(1.05);
}
}
/* ─── Ripple rings that expand from center ─── */
.rpl-12__ripple-field {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__arc {
position: absolute;
border-radius: 50%;
border: 1px solid;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
animation: rpl-12-ring ease-out infinite;
}
/* Teal rings */
.rpl-12__arc--t1 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.6);
animation-duration: 6s;
animation-delay: 0s;
}
.rpl-12__arc--t2 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.35);
animation-duration: 6s;
animation-delay: 1.5s;
}
.rpl-12__arc--t3 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.18);
animation-duration: 6s;
animation-delay: 3.0s;
}
.rpl-12__arc--t4 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.08);
animation-duration: 6s;
animation-delay: 4.5s;
}
/* Indigo rings */
.rpl-12__arc--i1 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.5);
animation-duration: 8s;
animation-delay: 2s;
}
.rpl-12__arc--i2 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.25);
animation-duration: 8s;
animation-delay: 4s;
}
.rpl-12__arc--i3 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.12);
animation-duration: 8s;
animation-delay: 6s;
}
/* Cyan rings — slightly offset */
.rpl-12__arc--c1 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.45);
animation-duration: 9s;
animation-delay: 1s;
top: 40%;
left: 55%;
}
.rpl-12__arc--c2 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.22);
animation-duration: 9s;
animation-delay: 3.5s;
top: 40%;
left: 55%;
}
@keyframes rpl-12-ring {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
100% {
transform: translate(-50%,-50%) scale(14);
opacity: 0;
}
}
/* Stars */
.rpl-12__stars {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__star {
position: absolute;
border-radius: 50%;
background: #fff;
animation: rpl-12-twinkle ease-in-out infinite alternate;
}
@keyframes rpl-12-twinkle {
to {
opacity: 0.1;
transform: scale(0.6);
}
}
/* Content */
.rpl-12__content {
position: relative;
z-index: 10;
text-align: center;
max-width: 600px;
}
.rpl-12__content .eyebrow {
display: inline-block;
font-size: 0.72rem;
letter-spacing: 0.28em;
text-transform: uppercase;
color: rgba(165,243,252,0.6);
margin-bottom: 20px;
border: 1px solid rgba(165,243,252,0.2);
border-radius: 40px;
padding: 6px 16px;
}
.rpl-12__content h1 {
font-family: 'Cormorant Garamond';
font-size: clamp(3rem, 10vw, 6rem);
font-weight: 300;
line-height: 0.9;
color: #f0fdff;
letter-spacing: -0.01em;
}
.rpl-12__content h1 em {
font-style: italic;
font-weight: 600;
background: linear-gradient(135deg, #5eead4, #22d3ee, #818cf8);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.rpl-12__content p {
margin-top: 24px;
font-size: 1rem;
color: rgba(240,253,255,0.5);
line-height: 1.7;
font-weight: 300;
max-width: 440px;
margin-left: auto;
margin-right: auto;
}
.rpl-12__ctas {
display: flex;
gap: 14px;
justify-content: center;
flex-wrap: wrap;
margin-top: 36px;
}
.rpl-12__cta {
padding: 14px 30px;
border-radius: 40px;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
letter-spacing: 0.02em;
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-12__cta--primary {
background: linear-gradient(135deg, #14b8a6, #6366f1);
color: #fff;
box-shadow: 0 8px 32px rgba(99,102,241,0.35), 0 0 0 1px rgba(255,255,255,0.1) inset;
}
.rpl-12__cta--primary:hover {
transform: translateY(-2px);
box-shadow: 0 16px 48px rgba(99,102,241,0.5);
}
.rpl-12__cta--ghost {
border: 1px solid rgba(165,243,252,0.25);
color: rgba(240,253,255,0.75);
background: rgba(255,255,255,0.04);
}
.rpl-12__cta--ghost:hover {
border-color: rgba(165,243,252,0.5);
background: rgba(255,255,255,0.06);
transform: translateY(-2px);
}
/* Floating badges */
.rpl-12__badge {
position: absolute;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(165,243,252,0.15);
border-radius: 40px;
padding: 8px 16px;
font-size: 0.72rem;
color: rgba(165,243,252,0.5);
letter-spacing: 0.12em;
text-transform: uppercase;
z-index: 5;
animation: rpl-12-float ease-in-out infinite alternate;
}
.rpl-12__badge--1 {
top: 14%;
left: 8%;
animation-duration: 6s;
}
.rpl-12__badge--2 {
top: 20%;
right: 6%;
animation-duration: 8s;
animation-delay: -2s;
}
.rpl-12__badge--3 {
bottom: 18%;
left: 6%;
animation-duration: 7s;
animation-delay: -4s;
}
.rpl-12__badge--4 {
bottom: 14%;
right: 8%;
animation-duration: 5s;
animation-delay: -1s;
}
@keyframes rpl-12-float {
to {
transform: translateY(-10px);
}
}
@media (max-width: 640px) {
.rpl-12__badge {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-12__blob,
.rpl-12__arc,
.rpl-12__star,
.rpl-12__badge {
animation: none !important;
}
.rpl-12__cta {
transition: none;
}
}
```
## JavaScript
```js
(function() {
const stars = document.getElementById('rpl-12-stars');
for (let i = 0; i < 80; i++) {
const s = document.createElement('div');
s.className = 'rpl-12__star';
const size = Math.random() * 2.5 + 0.5;
const delay = Math.random() * 4;
const dur = Math.random() * 3 + 2;
s.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
opacity:${Math.random()*0.8+0.1};
animation-duration:${dur}s;
animation-delay:${delay}s;
`;
stars.appendChild(s);
}
})();
```Paste this into ChatGPT, Claude, Cursor, or any coding assistant. The block below is pre-framed with everything the AI needs to integrate this demo into your project — markup, styles, scoping notes, and the source URL. Hit Copy and paste straight into your chat.
Here's a working CSS Ripple Effect from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: CSS Aurora Borealis Ripple Background
Source: https://codefronts.com/motion/css-ripple-designs/css-aurora-borealis-ripple-background/
A night-sky hero with four drifting blur-filtered aurora blob layers (mix-blend-mode: screen), concentric ripple rings expanding from multiple anchor points in teal, indigo and cyan, 80 JS-seeded twinkling stars and floating editorial badges. Cormorant Garamond + Outfit on deep #020617 midnight.
## HTML
```html
<div class="rpl-12">
<!-- Aurora blobs -->
<div class="rpl-12__aurora">
<div class="rpl-12__blob rpl-12__blob--a"></div>
<div class="rpl-12__blob rpl-12__blob--b"></div>
<div class="rpl-12__blob rpl-12__blob--c"></div>
<div class="rpl-12__blob rpl-12__blob--d"></div>
</div>
<!-- Ripple rings -->
<div class="rpl-12__ripple-field">
<div class="rpl-12__arc rpl-12__arc--t1"></div>
<div class="rpl-12__arc rpl-12__arc--t2"></div>
<div class="rpl-12__arc rpl-12__arc--t3"></div>
<div class="rpl-12__arc rpl-12__arc--t4"></div>
<div class="rpl-12__arc rpl-12__arc--i1"></div>
<div class="rpl-12__arc rpl-12__arc--i2"></div>
<div class="rpl-12__arc rpl-12__arc--i3"></div>
<div class="rpl-12__arc rpl-12__arc--c1"></div>
<div class="rpl-12__arc rpl-12__arc--c2"></div>
</div>
<!-- Stars -->
<div class="rpl-12__stars" id="rpl-12-stars"></div>
<!-- Floating labels -->
<div class="rpl-12__badge rpl-12__badge--1">Pure CSS</div>
<div class="rpl-12__badge rpl-12__badge--2">No Canvas</div>
<div class="rpl-12__badge rpl-12__badge--3">CSS Ripple</div>
<div class="rpl-12__badge rpl-12__badge--4">Keyframes</div>
<!-- Main content -->
<div class="rpl-12__content">
<div class="eyebrow">Aurora Ripple Effect</div>
<h1>Where<br>light <em>ripples</em><br>endlessly.</h1>
<p>Aurora blobs drift across a starfield while concentric rings expand outward — layered CSS gradients, blur filters and keyframe animations. Zero JavaScript for the background.</p>
<div class="rpl-12__ctas">
<a href="#" class="rpl-12__cta rpl-12__cta--primary">Explore Effect →</a>
<a href="#" class="rpl-12__cta rpl-12__cta--ghost">View Source</a>
</div>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,600;1,300;1,600&family=Outfit:wght@300;400;500&display=swap');
.rpl-12,
.rpl-12 *,
.rpl-12 *::before,
.rpl-12 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-12 ::selection {
background: #a5f3fc;
color: #020617;
}
.rpl-12 {
font-family: 'Outfit', sans-serif;
background: #020617;
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 60px 24px;
}
/* ─── Aurora layers: radial blobs that drift and pulse ─── */
.rpl-12__aurora {
position: absolute;
inset: 0;
pointer-events: none;
}
/* Blob A — teal/green */
.rpl-12__blob {
position: absolute;
border-radius: 50%;
filter: blur(80px);
mix-blend-mode: screen;
animation: rpl-12-drift ease-in-out infinite alternate;
}
.rpl-12__blob--a {
width: 70vw;
height: 50vh;
top: -10%;
left: -10%;
background: radial-gradient(ellipse, rgba(52,211,153,0.4) 0%, rgba(16,185,129,0.2) 50%, transparent 100%);
animation-duration: 12s;
}
.rpl-12__blob--b {
width: 60vw;
height: 60vh;
top: 20%;
right: -15%;
background: radial-gradient(ellipse, rgba(99,102,241,0.35) 0%, rgba(79,70,229,0.15) 50%, transparent 100%);
animation-duration: 16s;
animation-delay: -4s;
}
.rpl-12__blob--c {
width: 55vw;
height: 45vh;
bottom: -10%;
left: 20%;
background: radial-gradient(ellipse, rgba(6,182,212,0.3) 0%, rgba(14,165,233,0.15) 50%, transparent 100%);
animation-duration: 10s;
animation-delay: -7s;
}
.rpl-12__blob--d {
width: 40vw;
height: 35vh;
top: 30%;
left: 30%;
background: radial-gradient(ellipse, rgba(167,243,208,0.25) 0%, rgba(52,211,153,0.1) 50%, transparent 100%);
animation-duration: 20s;
animation-delay: -10s;
}
@keyframes rpl-12-drift {
0% {
transform: translate(0, 0) scale(1);
}
33% {
transform: translate(4%, 6%) scale(1.08);
}
66% {
transform: translate(-3%, 4%) scale(0.95);
}
100% {
transform: translate(6%, -4%) scale(1.05);
}
}
/* ─── Ripple rings that expand from center ─── */
.rpl-12__ripple-field {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__arc {
position: absolute;
border-radius: 50%;
border: 1px solid;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(0);
animation: rpl-12-ring ease-out infinite;
}
/* Teal rings */
.rpl-12__arc--t1 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.6);
animation-duration: 6s;
animation-delay: 0s;
}
.rpl-12__arc--t2 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.35);
animation-duration: 6s;
animation-delay: 1.5s;
}
.rpl-12__arc--t3 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.18);
animation-duration: 6s;
animation-delay: 3.0s;
}
.rpl-12__arc--t4 {
width: 100px;
height: 100px;
border-color: rgba(52,211,153,0.08);
animation-duration: 6s;
animation-delay: 4.5s;
}
/* Indigo rings */
.rpl-12__arc--i1 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.5);
animation-duration: 8s;
animation-delay: 2s;
}
.rpl-12__arc--i2 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.25);
animation-duration: 8s;
animation-delay: 4s;
}
.rpl-12__arc--i3 {
width: 100px;
height: 100px;
border-color: rgba(129,140,248,0.12);
animation-duration: 8s;
animation-delay: 6s;
}
/* Cyan rings — slightly offset */
.rpl-12__arc--c1 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.45);
animation-duration: 9s;
animation-delay: 1s;
top: 40%;
left: 55%;
}
.rpl-12__arc--c2 {
width: 100px;
height: 100px;
border-color: rgba(34,211,238,0.22);
animation-duration: 9s;
animation-delay: 3.5s;
top: 40%;
left: 55%;
}
@keyframes rpl-12-ring {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
100% {
transform: translate(-50%,-50%) scale(14);
opacity: 0;
}
}
/* Stars */
.rpl-12__stars {
position: absolute;
inset: 0;
pointer-events: none;
}
.rpl-12__star {
position: absolute;
border-radius: 50%;
background: #fff;
animation: rpl-12-twinkle ease-in-out infinite alternate;
}
@keyframes rpl-12-twinkle {
to {
opacity: 0.1;
transform: scale(0.6);
}
}
/* Content */
.rpl-12__content {
position: relative;
z-index: 10;
text-align: center;
max-width: 600px;
}
.rpl-12__content .eyebrow {
display: inline-block;
font-size: 0.72rem;
letter-spacing: 0.28em;
text-transform: uppercase;
color: rgba(165,243,252,0.6);
margin-bottom: 20px;
border: 1px solid rgba(165,243,252,0.2);
border-radius: 40px;
padding: 6px 16px;
}
.rpl-12__content h1 {
font-family: 'Cormorant Garamond';
font-size: clamp(3rem, 10vw, 6rem);
font-weight: 300;
line-height: 0.9;
color: #f0fdff;
letter-spacing: -0.01em;
}
.rpl-12__content h1 em {
font-style: italic;
font-weight: 600;
background: linear-gradient(135deg, #5eead4, #22d3ee, #818cf8);
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.rpl-12__content p {
margin-top: 24px;
font-size: 1rem;
color: rgba(240,253,255,0.5);
line-height: 1.7;
font-weight: 300;
max-width: 440px;
margin-left: auto;
margin-right: auto;
}
.rpl-12__ctas {
display: flex;
gap: 14px;
justify-content: center;
flex-wrap: wrap;
margin-top: 36px;
}
.rpl-12__cta {
padding: 14px 30px;
border-radius: 40px;
font-size: 0.88rem;
font-weight: 500;
text-decoration: none;
letter-spacing: 0.02em;
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-12__cta--primary {
background: linear-gradient(135deg, #14b8a6, #6366f1);
color: #fff;
box-shadow: 0 8px 32px rgba(99,102,241,0.35), 0 0 0 1px rgba(255,255,255,0.1) inset;
}
.rpl-12__cta--primary:hover {
transform: translateY(-2px);
box-shadow: 0 16px 48px rgba(99,102,241,0.5);
}
.rpl-12__cta--ghost {
border: 1px solid rgba(165,243,252,0.25);
color: rgba(240,253,255,0.75);
background: rgba(255,255,255,0.04);
}
.rpl-12__cta--ghost:hover {
border-color: rgba(165,243,252,0.5);
background: rgba(255,255,255,0.06);
transform: translateY(-2px);
}
/* Floating badges */
.rpl-12__badge {
position: absolute;
background: rgba(255,255,255,0.04);
border: 1px solid rgba(165,243,252,0.15);
border-radius: 40px;
padding: 8px 16px;
font-size: 0.72rem;
color: rgba(165,243,252,0.5);
letter-spacing: 0.12em;
text-transform: uppercase;
z-index: 5;
animation: rpl-12-float ease-in-out infinite alternate;
}
.rpl-12__badge--1 {
top: 14%;
left: 8%;
animation-duration: 6s;
}
.rpl-12__badge--2 {
top: 20%;
right: 6%;
animation-duration: 8s;
animation-delay: -2s;
}
.rpl-12__badge--3 {
bottom: 18%;
left: 6%;
animation-duration: 7s;
animation-delay: -4s;
}
.rpl-12__badge--4 {
bottom: 14%;
right: 8%;
animation-duration: 5s;
animation-delay: -1s;
}
@keyframes rpl-12-float {
to {
transform: translateY(-10px);
}
}
@media (max-width: 640px) {
.rpl-12__badge {
display: none;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-12__blob,
.rpl-12__arc,
.rpl-12__star,
.rpl-12__badge {
animation: none !important;
}
.rpl-12__cta {
transition: none;
}
}
```
## JavaScript
```js
(function() {
const stars = document.getElementById('rpl-12-stars');
for (let i = 0; i < 80; i++) {
const s = document.createElement('div');
s.className = 'rpl-12__star';
const size = Math.random() * 2.5 + 0.5;
const delay = Math.random() * 4;
const dur = Math.random() * 3 + 2;
s.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
opacity:${Math.random()*0.8+0.1};
animation-duration:${dur}s;
animation-delay:${delay}s;
`;
stars.appendChild(s);
}
})();
```