12 CSS Ripple Effects03 / 12
CSS Pond Ripple Background Animation
A multi-origin pond ripple hero with four separate drop-sources — each triggering 2–4 staggered ring keyframes at different radii and speeds — plus pulsing drop-center dots, a frosted-glass editorial card and drifting leaf particles, all pure CSS. DM Serif Display + DM Sans on a deep emerald gradient.
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-03">
<div class="rpl-03__fog"></div>
<!-- Ripple groups -->
<div class="rpl-03__ring rpl-03__ring--a1"></div>
<div class="rpl-03__ring rpl-03__ring--a2"></div>
<div class="rpl-03__ring rpl-03__ring--a3"></div>
<div class="rpl-03__ring rpl-03__ring--a4"></div>
<div class="rpl-03__ring rpl-03__ring--b1"></div>
<div class="rpl-03__ring rpl-03__ring--b2"></div>
<div class="rpl-03__ring rpl-03__ring--b3"></div>
<div class="rpl-03__ring rpl-03__ring--c1"></div>
<div class="rpl-03__ring rpl-03__ring--c2"></div>
<div class="rpl-03__ring rpl-03__ring--d1"></div>
<div class="rpl-03__ring rpl-03__ring--d2"></div>
<!-- Drop-point centers -->
<div class="rpl-03__drop rpl-03__drop--a"></div>
<div class="rpl-03__drop rpl-03__drop--b"></div>
<div class="rpl-03__drop rpl-03__drop--c"></div>
<div class="rpl-03__drop rpl-03__drop--d"></div>
<div class="rpl-03__card">
<div class="eyebrow">Pure CSS Background</div>
<h1>Still waters,<br><em>endless ripples.</em></h1>
<p>A multi-origin pond ripple background built from layered CSS keyframes — no canvas, no JavaScript, just rings that breathe.</p>
<a href="#" class="rpl-03__cta">Explore the Demo →</a>
</div>
</div><div class="rpl-03">
<div class="rpl-03__fog"></div>
<!-- Ripple groups -->
<div class="rpl-03__ring rpl-03__ring--a1"></div>
<div class="rpl-03__ring rpl-03__ring--a2"></div>
<div class="rpl-03__ring rpl-03__ring--a3"></div>
<div class="rpl-03__ring rpl-03__ring--a4"></div>
<div class="rpl-03__ring rpl-03__ring--b1"></div>
<div class="rpl-03__ring rpl-03__ring--b2"></div>
<div class="rpl-03__ring rpl-03__ring--b3"></div>
<div class="rpl-03__ring rpl-03__ring--c1"></div>
<div class="rpl-03__ring rpl-03__ring--c2"></div>
<div class="rpl-03__ring rpl-03__ring--d1"></div>
<div class="rpl-03__ring rpl-03__ring--d2"></div>
<!-- Drop-point centers -->
<div class="rpl-03__drop rpl-03__drop--a"></div>
<div class="rpl-03__drop rpl-03__drop--b"></div>
<div class="rpl-03__drop rpl-03__drop--c"></div>
<div class="rpl-03__drop rpl-03__drop--d"></div>
<div class="rpl-03__card">
<div class="eyebrow">Pure CSS Background</div>
<h1>Still waters,<br><em>endless ripples.</em></h1>
<p>A multi-origin pond ripple background built from layered CSS keyframes — no canvas, no JavaScript, just rings that breathe.</p>
<a href="#" class="rpl-03__cta">Explore the Demo →</a>
</div>
</div>@import url('https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
.rpl-03,
.rpl-03 *,
.rpl-03 *::before,
.rpl-03 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-03 ::selection {
background: #5eead4;
color: #042f2e;
}
.rpl-03 {
font-family: 'DM Sans', sans-serif;
background: linear-gradient(160deg, #042f2e 0%, #064e3b 35%, #065f46 60%, #022c22 100%);
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 40px 24px;
}
/* ─── Animated pond ripple rings (pure CSS, no JS) ─── */
.rpl-03__ring {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(94,234,212,0.5);
transform: translate(-50%, -50%) scale(0);
pointer-events: none;
}
/* Ripple group A — center-left */
.rpl-03__ring--a1 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out infinite;
}
.rpl-03__ring--a2 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 0.8s infinite;
border-color: rgba(94,234,212,0.3);
}
.rpl-03__ring--a3 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 1.6s infinite;
border-color: rgba(94,234,212,0.15);
}
.rpl-03__ring--a4 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 2.4s infinite;
border-color: rgba(94,234,212,0.07);
}
/* Ripple group B — right */
.rpl-03__ring--b1 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 1.2s infinite;
border-color: rgba(52,211,153,0.45);
}
.rpl-03__ring--b2 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 2.2s infinite;
border-color: rgba(52,211,153,0.25);
}
.rpl-03__ring--b3 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 3.2s infinite;
border-color: rgba(52,211,153,0.1);
}
/* Ripple group C — top-right (small) */
.rpl-03__ring--c1 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 0.4s infinite;
border-color: rgba(110,231,183,0.6);
}
.rpl-03__ring--c2 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 1.1s infinite;
border-color: rgba(110,231,183,0.3);
}
/* Ripple group D — bottom-left (tiny) */
.rpl-03__ring--d1 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 1.8s infinite;
border-color: rgba(167,243,208,0.55);
}
.rpl-03__ring--d2 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 2.5s infinite;
border-color: rgba(167,243,208,0.25);
}
@keyframes rpl-03-expand {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
70% {
opacity: 0.6;
}
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 0;
}
}
/* Drop-point dots */
.rpl-03__drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #a7f3d0, #5eead4);
transform: translate(-50%, -50%);
box-shadow: 0 0 12px rgba(94,234,212,0.8);
animation: rpl-03-drip 4s ease-in-out infinite;
}
.rpl-03__drop--a {
left: 28%;
top: 55%;
}
.rpl-03__drop--b {
left: 72%;
top: 38%;
animation-delay: 1.2s;
animation-duration: 5s;
}
.rpl-03__drop--c {
left: 85%;
top: 20%;
animation-delay: 0.4s;
animation-duration: 3.2s;
width: 5px;
height: 5px;
}
.rpl-03__drop--d {
left: 12%;
top: 78%;
animation-delay: 1.8s;
animation-duration: 2.8s;
width: 5px;
height: 5px;
}
@keyframes rpl-03-drip {
0%,
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 1;
}
40% {
transform: translate(-50%,-50%) scale(1.5);
opacity: 0.6;
}
50% {
transform: translate(-50%,-50%) scale(0.5);
opacity: 1;
}
}
/* Soft gradient fog layers */
.rpl-03__fog {
position: absolute;
inset: 0;
background: radial-gradient(ellipse 60% 40% at 28% 55%, rgba(16,185,129,0.12), transparent 70%), radial-gradient(ellipse 50% 40% at 72% 38%, rgba(52,211,153,0.10), transparent 70%), radial-gradient(ellipse 35% 30% at 85% 20%, rgba(110,231,183,0.08), transparent 70%);
pointer-events: none;
}
/* Content card */
.rpl-03__card {
position: relative;
z-index: 10;
background: rgba(4,47,46,0.55);
backdrop-filter: blur(16px);
border: 1px solid rgba(94,234,212,0.2);
border-radius: 24px;
padding: clamp(32px, 5vw, 56px) clamp(28px, 6vw, 64px);
text-align: center;
max-width: 560px;
box-shadow: 0 0 0 1px rgba(94,234,212,0.05) inset, 0 40px 80px rgba(0,0,0,0.4);
}
.rpl-03__card .eyebrow {
font-size: 0.7rem;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #5eead4;
margin-bottom: 16px;
}
.rpl-03__card h1 {
font-family: 'DM Serif Display';
font-size: clamp(2.2rem, 7vw, 3.6rem);
line-height: 1.0;
color: #f0fdfb;
}
.rpl-03__card h1 em {
color: #5eead4;
font-style: italic;
}
.rpl-03__card p {
margin-top: 16px;
font-size: 1rem;
color: rgba(209,250,229,0.65);
line-height: 1.6;
font-weight: 300;
}
.rpl-03__cta {
display: inline-flex;
align-items: center;
gap: 10px;
margin-top: 28px;
background: linear-gradient(135deg, #059669, #10b981);
color: #fff;
font-weight: 600;
font-size: 0.9rem;
padding: 14px 30px;
border-radius: 40px;
text-decoration: none;
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 8px 24px rgba(5,150,105,0.4);
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-03__cta:hover {
transform: translateY(-2px);
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 16px 40px rgba(5,150,105,0.5);
}
/* Floating leaf particles */
.rpl-03__leaf {
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(52,211,153,0.5);
pointer-events: none;
animation: rpl-03-drift linear infinite;
}
@keyframes rpl-03-drift {
0% {
transform: translateY(0) translateX(0) scale(1);
opacity: 0.7;
}
50% {
transform: translateY(-80px) translateX(20px) scale(0.7);
opacity: 0.3;
}
100% {
transform: translateY(-160px) translateX(-10px) scale(0.3);
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-03__ring,
.rpl-03__drop,
.rpl-03__leaf {
animation: none !important;
opacity: 0.2;
}
.rpl-03__cta {
transition: none;
}
}@import url('https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
.rpl-03,
.rpl-03 *,
.rpl-03 *::before,
.rpl-03 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-03 ::selection {
background: #5eead4;
color: #042f2e;
}
.rpl-03 {
font-family: 'DM Sans', sans-serif;
background: linear-gradient(160deg, #042f2e 0%, #064e3b 35%, #065f46 60%, #022c22 100%);
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 40px 24px;
}
/* ─── Animated pond ripple rings (pure CSS, no JS) ─── */
.rpl-03__ring {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(94,234,212,0.5);
transform: translate(-50%, -50%) scale(0);
pointer-events: none;
}
/* Ripple group A — center-left */
.rpl-03__ring--a1 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out infinite;
}
.rpl-03__ring--a2 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 0.8s infinite;
border-color: rgba(94,234,212,0.3);
}
.rpl-03__ring--a3 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 1.6s infinite;
border-color: rgba(94,234,212,0.15);
}
.rpl-03__ring--a4 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 2.4s infinite;
border-color: rgba(94,234,212,0.07);
}
/* Ripple group B — right */
.rpl-03__ring--b1 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 1.2s infinite;
border-color: rgba(52,211,153,0.45);
}
.rpl-03__ring--b2 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 2.2s infinite;
border-color: rgba(52,211,153,0.25);
}
.rpl-03__ring--b3 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 3.2s infinite;
border-color: rgba(52,211,153,0.1);
}
/* Ripple group C — top-right (small) */
.rpl-03__ring--c1 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 0.4s infinite;
border-color: rgba(110,231,183,0.6);
}
.rpl-03__ring--c2 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 1.1s infinite;
border-color: rgba(110,231,183,0.3);
}
/* Ripple group D — bottom-left (tiny) */
.rpl-03__ring--d1 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 1.8s infinite;
border-color: rgba(167,243,208,0.55);
}
.rpl-03__ring--d2 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 2.5s infinite;
border-color: rgba(167,243,208,0.25);
}
@keyframes rpl-03-expand {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
70% {
opacity: 0.6;
}
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 0;
}
}
/* Drop-point dots */
.rpl-03__drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #a7f3d0, #5eead4);
transform: translate(-50%, -50%);
box-shadow: 0 0 12px rgba(94,234,212,0.8);
animation: rpl-03-drip 4s ease-in-out infinite;
}
.rpl-03__drop--a {
left: 28%;
top: 55%;
}
.rpl-03__drop--b {
left: 72%;
top: 38%;
animation-delay: 1.2s;
animation-duration: 5s;
}
.rpl-03__drop--c {
left: 85%;
top: 20%;
animation-delay: 0.4s;
animation-duration: 3.2s;
width: 5px;
height: 5px;
}
.rpl-03__drop--d {
left: 12%;
top: 78%;
animation-delay: 1.8s;
animation-duration: 2.8s;
width: 5px;
height: 5px;
}
@keyframes rpl-03-drip {
0%,
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 1;
}
40% {
transform: translate(-50%,-50%) scale(1.5);
opacity: 0.6;
}
50% {
transform: translate(-50%,-50%) scale(0.5);
opacity: 1;
}
}
/* Soft gradient fog layers */
.rpl-03__fog {
position: absolute;
inset: 0;
background: radial-gradient(ellipse 60% 40% at 28% 55%, rgba(16,185,129,0.12), transparent 70%), radial-gradient(ellipse 50% 40% at 72% 38%, rgba(52,211,153,0.10), transparent 70%), radial-gradient(ellipse 35% 30% at 85% 20%, rgba(110,231,183,0.08), transparent 70%);
pointer-events: none;
}
/* Content card */
.rpl-03__card {
position: relative;
z-index: 10;
background: rgba(4,47,46,0.55);
backdrop-filter: blur(16px);
border: 1px solid rgba(94,234,212,0.2);
border-radius: 24px;
padding: clamp(32px, 5vw, 56px) clamp(28px, 6vw, 64px);
text-align: center;
max-width: 560px;
box-shadow: 0 0 0 1px rgba(94,234,212,0.05) inset, 0 40px 80px rgba(0,0,0,0.4);
}
.rpl-03__card .eyebrow {
font-size: 0.7rem;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #5eead4;
margin-bottom: 16px;
}
.rpl-03__card h1 {
font-family: 'DM Serif Display';
font-size: clamp(2.2rem, 7vw, 3.6rem);
line-height: 1.0;
color: #f0fdfb;
}
.rpl-03__card h1 em {
color: #5eead4;
font-style: italic;
}
.rpl-03__card p {
margin-top: 16px;
font-size: 1rem;
color: rgba(209,250,229,0.65);
line-height: 1.6;
font-weight: 300;
}
.rpl-03__cta {
display: inline-flex;
align-items: center;
gap: 10px;
margin-top: 28px;
background: linear-gradient(135deg, #059669, #10b981);
color: #fff;
font-weight: 600;
font-size: 0.9rem;
padding: 14px 30px;
border-radius: 40px;
text-decoration: none;
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 8px 24px rgba(5,150,105,0.4);
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-03__cta:hover {
transform: translateY(-2px);
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 16px 40px rgba(5,150,105,0.5);
}
/* Floating leaf particles */
.rpl-03__leaf {
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(52,211,153,0.5);
pointer-events: none;
animation: rpl-03-drift linear infinite;
}
@keyframes rpl-03-drift {
0% {
transform: translateY(0) translateX(0) scale(1);
opacity: 0.7;
}
50% {
transform: translateY(-80px) translateX(20px) scale(0.7);
opacity: 0.3;
}
100% {
transform: translateY(-160px) translateX(-10px) scale(0.3);
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-03__ring,
.rpl-03__drop,
.rpl-03__leaf {
animation: none !important;
opacity: 0.2;
}
.rpl-03__cta {
transition: none;
}
}// Spawn floating particles
(function() {
const scene = document.querySelector('.rpl-03');
for (let i = 0; i < 16; i++) {
const el = document.createElement('div');
el.className = 'rpl-03__leaf';
const size = Math.random() * 5 + 3;
el.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
animation-duration:${Math.random()*8+6}s;
animation-delay:${Math.random()*-8}s;
opacity:${Math.random()*0.5+0.1};
`;
scene.appendChild(el);
}
})();// Spawn floating particles
(function() {
const scene = document.querySelector('.rpl-03');
for (let i = 0; i < 16; i++) {
const el = document.createElement('div');
el.className = 'rpl-03__leaf';
const size = Math.random() * 5 + 3;
el.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
animation-duration:${Math.random()*8+6}s;
animation-delay:${Math.random()*-8}s;
opacity:${Math.random()*0.5+0.1};
`;
scene.appendChild(el);
}
})();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 Pond Ripple Background Animation
Source: https://codefronts.com/motion/css-ripple-designs/css-pond-ripple-background-animation/
A multi-origin pond ripple hero with four separate drop-sources — each triggering 2–4 staggered ring keyframes at different radii and speeds — plus pulsing drop-center dots, a frosted-glass editorial card and drifting leaf particles, all pure CSS. DM Serif Display + DM Sans on a deep emerald gradient.
## HTML
```html
<div class="rpl-03">
<div class="rpl-03__fog"></div>
<!-- Ripple groups -->
<div class="rpl-03__ring rpl-03__ring--a1"></div>
<div class="rpl-03__ring rpl-03__ring--a2"></div>
<div class="rpl-03__ring rpl-03__ring--a3"></div>
<div class="rpl-03__ring rpl-03__ring--a4"></div>
<div class="rpl-03__ring rpl-03__ring--b1"></div>
<div class="rpl-03__ring rpl-03__ring--b2"></div>
<div class="rpl-03__ring rpl-03__ring--b3"></div>
<div class="rpl-03__ring rpl-03__ring--c1"></div>
<div class="rpl-03__ring rpl-03__ring--c2"></div>
<div class="rpl-03__ring rpl-03__ring--d1"></div>
<div class="rpl-03__ring rpl-03__ring--d2"></div>
<!-- Drop-point centers -->
<div class="rpl-03__drop rpl-03__drop--a"></div>
<div class="rpl-03__drop rpl-03__drop--b"></div>
<div class="rpl-03__drop rpl-03__drop--c"></div>
<div class="rpl-03__drop rpl-03__drop--d"></div>
<div class="rpl-03__card">
<div class="eyebrow">Pure CSS Background</div>
<h1>Still waters,<br><em>endless ripples.</em></h1>
<p>A multi-origin pond ripple background built from layered CSS keyframes — no canvas, no JavaScript, just rings that breathe.</p>
<a href="#" class="rpl-03__cta">Explore the Demo →</a>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
.rpl-03,
.rpl-03 *,
.rpl-03 *::before,
.rpl-03 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-03 ::selection {
background: #5eead4;
color: #042f2e;
}
.rpl-03 {
font-family: 'DM Sans', sans-serif;
background: linear-gradient(160deg, #042f2e 0%, #064e3b 35%, #065f46 60%, #022c22 100%);
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 40px 24px;
}
/* ─── Animated pond ripple rings (pure CSS, no JS) ─── */
.rpl-03__ring {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(94,234,212,0.5);
transform: translate(-50%, -50%) scale(0);
pointer-events: none;
}
/* Ripple group A — center-left */
.rpl-03__ring--a1 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out infinite;
}
.rpl-03__ring--a2 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 0.8s infinite;
border-color: rgba(94,234,212,0.3);
}
.rpl-03__ring--a3 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 1.6s infinite;
border-color: rgba(94,234,212,0.15);
}
.rpl-03__ring--a4 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 2.4s infinite;
border-color: rgba(94,234,212,0.07);
}
/* Ripple group B — right */
.rpl-03__ring--b1 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 1.2s infinite;
border-color: rgba(52,211,153,0.45);
}
.rpl-03__ring--b2 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 2.2s infinite;
border-color: rgba(52,211,153,0.25);
}
.rpl-03__ring--b3 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 3.2s infinite;
border-color: rgba(52,211,153,0.1);
}
/* Ripple group C — top-right (small) */
.rpl-03__ring--c1 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 0.4s infinite;
border-color: rgba(110,231,183,0.6);
}
.rpl-03__ring--c2 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 1.1s infinite;
border-color: rgba(110,231,183,0.3);
}
/* Ripple group D — bottom-left (tiny) */
.rpl-03__ring--d1 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 1.8s infinite;
border-color: rgba(167,243,208,0.55);
}
.rpl-03__ring--d2 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 2.5s infinite;
border-color: rgba(167,243,208,0.25);
}
@keyframes rpl-03-expand {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
70% {
opacity: 0.6;
}
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 0;
}
}
/* Drop-point dots */
.rpl-03__drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #a7f3d0, #5eead4);
transform: translate(-50%, -50%);
box-shadow: 0 0 12px rgba(94,234,212,0.8);
animation: rpl-03-drip 4s ease-in-out infinite;
}
.rpl-03__drop--a {
left: 28%;
top: 55%;
}
.rpl-03__drop--b {
left: 72%;
top: 38%;
animation-delay: 1.2s;
animation-duration: 5s;
}
.rpl-03__drop--c {
left: 85%;
top: 20%;
animation-delay: 0.4s;
animation-duration: 3.2s;
width: 5px;
height: 5px;
}
.rpl-03__drop--d {
left: 12%;
top: 78%;
animation-delay: 1.8s;
animation-duration: 2.8s;
width: 5px;
height: 5px;
}
@keyframes rpl-03-drip {
0%,
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 1;
}
40% {
transform: translate(-50%,-50%) scale(1.5);
opacity: 0.6;
}
50% {
transform: translate(-50%,-50%) scale(0.5);
opacity: 1;
}
}
/* Soft gradient fog layers */
.rpl-03__fog {
position: absolute;
inset: 0;
background: radial-gradient(ellipse 60% 40% at 28% 55%, rgba(16,185,129,0.12), transparent 70%), radial-gradient(ellipse 50% 40% at 72% 38%, rgba(52,211,153,0.10), transparent 70%), radial-gradient(ellipse 35% 30% at 85% 20%, rgba(110,231,183,0.08), transparent 70%);
pointer-events: none;
}
/* Content card */
.rpl-03__card {
position: relative;
z-index: 10;
background: rgba(4,47,46,0.55);
backdrop-filter: blur(16px);
border: 1px solid rgba(94,234,212,0.2);
border-radius: 24px;
padding: clamp(32px, 5vw, 56px) clamp(28px, 6vw, 64px);
text-align: center;
max-width: 560px;
box-shadow: 0 0 0 1px rgba(94,234,212,0.05) inset, 0 40px 80px rgba(0,0,0,0.4);
}
.rpl-03__card .eyebrow {
font-size: 0.7rem;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #5eead4;
margin-bottom: 16px;
}
.rpl-03__card h1 {
font-family: 'DM Serif Display';
font-size: clamp(2.2rem, 7vw, 3.6rem);
line-height: 1.0;
color: #f0fdfb;
}
.rpl-03__card h1 em {
color: #5eead4;
font-style: italic;
}
.rpl-03__card p {
margin-top: 16px;
font-size: 1rem;
color: rgba(209,250,229,0.65);
line-height: 1.6;
font-weight: 300;
}
.rpl-03__cta {
display: inline-flex;
align-items: center;
gap: 10px;
margin-top: 28px;
background: linear-gradient(135deg, #059669, #10b981);
color: #fff;
font-weight: 600;
font-size: 0.9rem;
padding: 14px 30px;
border-radius: 40px;
text-decoration: none;
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 8px 24px rgba(5,150,105,0.4);
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-03__cta:hover {
transform: translateY(-2px);
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 16px 40px rgba(5,150,105,0.5);
}
/* Floating leaf particles */
.rpl-03__leaf {
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(52,211,153,0.5);
pointer-events: none;
animation: rpl-03-drift linear infinite;
}
@keyframes rpl-03-drift {
0% {
transform: translateY(0) translateX(0) scale(1);
opacity: 0.7;
}
50% {
transform: translateY(-80px) translateX(20px) scale(0.7);
opacity: 0.3;
}
100% {
transform: translateY(-160px) translateX(-10px) scale(0.3);
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-03__ring,
.rpl-03__drop,
.rpl-03__leaf {
animation: none !important;
opacity: 0.2;
}
.rpl-03__cta {
transition: none;
}
}
```
## JavaScript
```js
// Spawn floating particles
(function() {
const scene = document.querySelector('.rpl-03');
for (let i = 0; i < 16; i++) {
const el = document.createElement('div');
el.className = 'rpl-03__leaf';
const size = Math.random() * 5 + 3;
el.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
animation-duration:${Math.random()*8+6}s;
animation-delay:${Math.random()*-8}s;
opacity:${Math.random()*0.5+0.1};
`;
scene.appendChild(el);
}
})();
```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 Pond Ripple Background Animation
Source: https://codefronts.com/motion/css-ripple-designs/css-pond-ripple-background-animation/
A multi-origin pond ripple hero with four separate drop-sources — each triggering 2–4 staggered ring keyframes at different radii and speeds — plus pulsing drop-center dots, a frosted-glass editorial card and drifting leaf particles, all pure CSS. DM Serif Display + DM Sans on a deep emerald gradient.
## HTML
```html
<div class="rpl-03">
<div class="rpl-03__fog"></div>
<!-- Ripple groups -->
<div class="rpl-03__ring rpl-03__ring--a1"></div>
<div class="rpl-03__ring rpl-03__ring--a2"></div>
<div class="rpl-03__ring rpl-03__ring--a3"></div>
<div class="rpl-03__ring rpl-03__ring--a4"></div>
<div class="rpl-03__ring rpl-03__ring--b1"></div>
<div class="rpl-03__ring rpl-03__ring--b2"></div>
<div class="rpl-03__ring rpl-03__ring--b3"></div>
<div class="rpl-03__ring rpl-03__ring--c1"></div>
<div class="rpl-03__ring rpl-03__ring--c2"></div>
<div class="rpl-03__ring rpl-03__ring--d1"></div>
<div class="rpl-03__ring rpl-03__ring--d2"></div>
<!-- Drop-point centers -->
<div class="rpl-03__drop rpl-03__drop--a"></div>
<div class="rpl-03__drop rpl-03__drop--b"></div>
<div class="rpl-03__drop rpl-03__drop--c"></div>
<div class="rpl-03__drop rpl-03__drop--d"></div>
<div class="rpl-03__card">
<div class="eyebrow">Pure CSS Background</div>
<h1>Still waters,<br><em>endless ripples.</em></h1>
<p>A multi-origin pond ripple background built from layered CSS keyframes — no canvas, no JavaScript, just rings that breathe.</p>
<a href="#" class="rpl-03__cta">Explore the Demo →</a>
</div>
</div>
```
## CSS
```css
@import url('https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&family=DM+Sans:wght@300;400;500&display=swap');
.rpl-03,
.rpl-03 *,
.rpl-03 *::before,
.rpl-03 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.rpl-03 ::selection {
background: #5eead4;
color: #042f2e;
}
.rpl-03 {
font-family: 'DM Sans', sans-serif;
background: linear-gradient(160deg, #042f2e 0%, #064e3b 35%, #065f46 60%, #022c22 100%);
min-height: 100vh;
position: relative;
overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
padding: 40px 24px;
}
/* ─── Animated pond ripple rings (pure CSS, no JS) ─── */
.rpl-03__ring {
position: absolute;
border-radius: 50%;
border: 1.5px solid rgba(94,234,212,0.5);
transform: translate(-50%, -50%) scale(0);
pointer-events: none;
}
/* Ripple group A — center-left */
.rpl-03__ring--a1 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out infinite;
}
.rpl-03__ring--a2 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 0.8s infinite;
border-color: rgba(94,234,212,0.3);
}
.rpl-03__ring--a3 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 1.6s infinite;
border-color: rgba(94,234,212,0.15);
}
.rpl-03__ring--a4 {
left: 28%;
top: 55%;
width: 400px;
height: 400px;
animation: rpl-03-expand 4s ease-out 2.4s infinite;
border-color: rgba(94,234,212,0.07);
}
/* Ripple group B — right */
.rpl-03__ring--b1 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 1.2s infinite;
border-color: rgba(52,211,153,0.45);
}
.rpl-03__ring--b2 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 2.2s infinite;
border-color: rgba(52,211,153,0.25);
}
.rpl-03__ring--b3 {
left: 72%;
top: 38%;
width: 320px;
height: 320px;
animation: rpl-03-expand 5s ease-out 3.2s infinite;
border-color: rgba(52,211,153,0.1);
}
/* Ripple group C — top-right (small) */
.rpl-03__ring--c1 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 0.4s infinite;
border-color: rgba(110,231,183,0.6);
}
.rpl-03__ring--c2 {
left: 85%;
top: 20%;
width: 200px;
height: 200px;
animation: rpl-03-expand 3.2s ease-out 1.1s infinite;
border-color: rgba(110,231,183,0.3);
}
/* Ripple group D — bottom-left (tiny) */
.rpl-03__ring--d1 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 1.8s infinite;
border-color: rgba(167,243,208,0.55);
}
.rpl-03__ring--d2 {
left: 12%;
top: 78%;
width: 160px;
height: 160px;
animation: rpl-03-expand 2.8s ease-out 2.5s infinite;
border-color: rgba(167,243,208,0.25);
}
@keyframes rpl-03-expand {
0% {
transform: translate(-50%,-50%) scale(0);
opacity: 1;
}
70% {
opacity: 0.6;
}
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 0;
}
}
/* Drop-point dots */
.rpl-03__drop {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
background: radial-gradient(circle at 35% 30%, #a7f3d0, #5eead4);
transform: translate(-50%, -50%);
box-shadow: 0 0 12px rgba(94,234,212,0.8);
animation: rpl-03-drip 4s ease-in-out infinite;
}
.rpl-03__drop--a {
left: 28%;
top: 55%;
}
.rpl-03__drop--b {
left: 72%;
top: 38%;
animation-delay: 1.2s;
animation-duration: 5s;
}
.rpl-03__drop--c {
left: 85%;
top: 20%;
animation-delay: 0.4s;
animation-duration: 3.2s;
width: 5px;
height: 5px;
}
.rpl-03__drop--d {
left: 12%;
top: 78%;
animation-delay: 1.8s;
animation-duration: 2.8s;
width: 5px;
height: 5px;
}
@keyframes rpl-03-drip {
0%,
100% {
transform: translate(-50%,-50%) scale(1);
opacity: 1;
}
40% {
transform: translate(-50%,-50%) scale(1.5);
opacity: 0.6;
}
50% {
transform: translate(-50%,-50%) scale(0.5);
opacity: 1;
}
}
/* Soft gradient fog layers */
.rpl-03__fog {
position: absolute;
inset: 0;
background: radial-gradient(ellipse 60% 40% at 28% 55%, rgba(16,185,129,0.12), transparent 70%), radial-gradient(ellipse 50% 40% at 72% 38%, rgba(52,211,153,0.10), transparent 70%), radial-gradient(ellipse 35% 30% at 85% 20%, rgba(110,231,183,0.08), transparent 70%);
pointer-events: none;
}
/* Content card */
.rpl-03__card {
position: relative;
z-index: 10;
background: rgba(4,47,46,0.55);
backdrop-filter: blur(16px);
border: 1px solid rgba(94,234,212,0.2);
border-radius: 24px;
padding: clamp(32px, 5vw, 56px) clamp(28px, 6vw, 64px);
text-align: center;
max-width: 560px;
box-shadow: 0 0 0 1px rgba(94,234,212,0.05) inset, 0 40px 80px rgba(0,0,0,0.4);
}
.rpl-03__card .eyebrow {
font-size: 0.7rem;
letter-spacing: 0.25em;
text-transform: uppercase;
color: #5eead4;
margin-bottom: 16px;
}
.rpl-03__card h1 {
font-family: 'DM Serif Display';
font-size: clamp(2.2rem, 7vw, 3.6rem);
line-height: 1.0;
color: #f0fdfb;
}
.rpl-03__card h1 em {
color: #5eead4;
font-style: italic;
}
.rpl-03__card p {
margin-top: 16px;
font-size: 1rem;
color: rgba(209,250,229,0.65);
line-height: 1.6;
font-weight: 300;
}
.rpl-03__cta {
display: inline-flex;
align-items: center;
gap: 10px;
margin-top: 28px;
background: linear-gradient(135deg, #059669, #10b981);
color: #fff;
font-weight: 600;
font-size: 0.9rem;
padding: 14px 30px;
border-radius: 40px;
text-decoration: none;
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 8px 24px rgba(5,150,105,0.4);
transition: transform 0.2s, box-shadow 0.2s;
}
.rpl-03__cta:hover {
transform: translateY(-2px);
box-shadow: 0 0 0 1px rgba(255,255,255,0.15) inset, 0 16px 40px rgba(5,150,105,0.5);
}
/* Floating leaf particles */
.rpl-03__leaf {
position: absolute;
width: 6px;
height: 6px;
border-radius: 50%;
background: rgba(52,211,153,0.5);
pointer-events: none;
animation: rpl-03-drift linear infinite;
}
@keyframes rpl-03-drift {
0% {
transform: translateY(0) translateX(0) scale(1);
opacity: 0.7;
}
50% {
transform: translateY(-80px) translateX(20px) scale(0.7);
opacity: 0.3;
}
100% {
transform: translateY(-160px) translateX(-10px) scale(0.3);
opacity: 0;
}
}
@media (prefers-reduced-motion: reduce) {
.rpl-03__ring,
.rpl-03__drop,
.rpl-03__leaf {
animation: none !important;
opacity: 0.2;
}
.rpl-03__cta {
transition: none;
}
}
```
## JavaScript
```js
// Spawn floating particles
(function() {
const scene = document.querySelector('.rpl-03');
for (let i = 0; i < 16; i++) {
const el = document.createElement('div');
el.className = 'rpl-03__leaf';
const size = Math.random() * 5 + 3;
el.style.cssText = `
width:${size}px;height:${size}px;
left:${Math.random()*100}%;
top:${Math.random()*100}%;
animation-duration:${Math.random()*8+6}s;
animation-delay:${Math.random()*-8}s;
opacity:${Math.random()*0.5+0.1};
`;
scene.appendChild(el);
}
})();
```