Layered Waves
🟢 CSS OnlyComplex layout featuring overlapping, multi-colored vector waves moving in contrasting directions.
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-below-preview
Interactive Settings
Medium Rectangle Block
Slot ID: ca-pub-detail-after-customization
Quick Copy Actions
Download File Packages
Keyboard Shortcuts
Responsive Horizontal Leaderboard
Slot ID: ca-pub-detail-before-related
More in Waves
Loading Canvas Shader...
Ocean Waves
Dynamic layered marine wave paths sliding left-to-right at offset speeds, forming a beautiful horizon.
Loading Canvas Shader...
Liquid Ripples
Expanding vibrant concentric circular ripples gliding and fading outward across the entire screen.
Loading Canvas Shader...
Soft Fluid Flow
An incredibly subtle flowing water-like overlay in muted gray shades, ideal for enterprise dashboards.
Layered Waves - CSS-only Waves background for React & Tailwind
Integrate the Layered Waves directly into your website. This asset is rendered using pure CSS and HTML keyframes. It is optimized for zero layout-shifts and runs with high-performance hardware-accelerated processing.
⚡ Performance Specifications
- Render Mode: CSS-ONLY (CSS-only)
- Fluidity: Locked at 60fps dynamic loop
- Bundle Footprint: Zero external NPM dependencies
- SEO Indexing status: 100% Crawlable static semantic HTML
🛠️ Integration Capabilities
Our templates expose inline design tokens like --color-1 and --color-2 for infinite color palettes. This template is designed to fit inside hero elements, full-screen landing pages, and interactive presentation cards.
Technical Code Reference & Syntaxes for Googlebot & Crawlers
The snippets below display the direct, unminified source code utilized for rendering this background.
HTML & Inline CSS Snippet (Vanilla)
<!-- index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Layered Waves</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: #09090b;
}
:root {
--speed: 18s;
}
.layered-wrap {
position: relative;
width: 100%;
height: 100%;
background: #060913;
overflow: hidden;
}
.l-wave {
position: absolute;
bottom: 0;
left: 0;
width: 200%;
height: 150px;
background-repeat: repeat-x;
}
.wave-back {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V120H0V0C26.9,8.75,55.05,17,83.1,22.07,163.68,36.56,246.3,64.21,321.39,56.44Z" fill="%237C5CFF" opacity="0.2"/%3E%3C/svg%3E');
animation: wave-slide var(--speed) linear infinite;
z-index: 1;
}
.wave-mid {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86C246.3,64.21,163.68,36.56,83.1,22.07,55.05,17,26.9,8.75,0,0V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z" fill="%2318C5FF" opacity="0.25"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 0.7) linear infinite reverse;
z-index: 2;
height: 120px;
}
.wave-front {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M0,0V120H1200V0C1132.19,23.09,1055.71,15.48,985.66,3C906.67,23.83,823.78,64.8,743.84,81.61c-82.26,17.34-168.06,16.33-250.45-.39-57.84-11.73-114-31.07-172-41.86C246.3,30.79,163.68,3.14,83.1,17.63,55.05,22.68,26.9,30.93,0,39.68Z" fill="%237C5CFF" opacity="0.3"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 1.3) linear infinite;
z-index: 3;
height: 90px;
}
@keyframes wave-slide {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
</style>
</head>
<body>
<div class="layered-wrap">
<div class="l-wave wave-back"></div>
<div class="l-wave wave-mid"></div>
<div class="l-wave wave-front"></div>
</div>
</body>
</html>React Component Wrapper (TSX)
import React from 'react';
export default function LayeredWavesBackground() {
return (
<div
style={{ width: '100%', height: '100%', position: 'relative', overflow: 'hidden' }}
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed: 18s;
}
.layered-wrap {
position: relative;
width: 100%;
height: 100%;
background: #060913;
overflow: hidden;
}
.l-wave {
position: absolute;
bottom: 0;
left: 0;
width: 200%;
height: 150px;
background-repeat: repeat-x;
}
.wave-back {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V120H0V0C26.9,8.75,55.05,17,83.1,22.07,163.68,36.56,246.3,64.21,321.39,56.44Z" fill="%237C5CFF" opacity="0.2"/%3E%3C/svg%3E');
animation: wave-slide var(--speed) linear infinite;
z-index: 1;
}
.wave-mid {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86C246.3,64.21,163.68,36.56,83.1,22.07,55.05,17,26.9,8.75,0,0V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z" fill="%2318C5FF" opacity="0.25"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 0.7) linear infinite reverse;
z-index: 2;
height: 120px;
}
.wave-front {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M0,0V120H1200V0C1132.19,23.09,1055.71,15.48,985.66,3C906.67,23.83,823.78,64.8,743.84,81.61c-82.26,17.34-168.06,16.33-250.45-.39-57.84-11.73-114-31.07-172-41.86C246.3,30.79,163.68,3.14,83.1,17.63,55.05,22.68,26.9,30.93,0,39.68Z" fill="%237C5CFF" opacity="0.3"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 1.3) linear infinite;
z-index: 3;
height: 90px;
}
@keyframes wave-slide {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
` }} />
{/* HTML Structure */}
<div
style={{ width: '100%', height: '100%' }}
dangerouslySetInnerHTML={{ __html: `
<div class="layered-wrap">
<div class="l-wave wave-back"></div>
<div class="l-wave wave-mid"></div>
<div class="l-wave wave-front"></div>
</div>
` }}
/>
</div>
);
}Next.js App Router Component (use client)
'use client';
import React from 'react';
export default function LayeredWavesBackground() {
return (
<div
className="w-full h-full relative overflow-hidden"
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed: 18s;
}
.layered-wrap {
position: relative;
width: 100%;
height: 100%;
background: #060913;
overflow: hidden;
}
.l-wave {
position: absolute;
bottom: 0;
left: 0;
width: 200%;
height: 150px;
background-repeat: repeat-x;
}
.wave-back {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V120H0V0C26.9,8.75,55.05,17,83.1,22.07,163.68,36.56,246.3,64.21,321.39,56.44Z" fill="%237C5CFF" opacity="0.2"/%3E%3C/svg%3E');
animation: wave-slide var(--speed) linear infinite;
z-index: 1;
}
.wave-mid {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86C246.3,64.21,163.68,36.56,83.1,22.07,55.05,17,26.9,8.75,0,0V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z" fill="%2318C5FF" opacity="0.25"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 0.7) linear infinite reverse;
z-index: 2;
height: 120px;
}
.wave-front {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M0,0V120H1200V0C1132.19,23.09,1055.71,15.48,985.66,3C906.67,23.83,823.78,64.8,743.84,81.61c-82.26,17.34-168.06,16.33-250.45-.39-57.84-11.73-114-31.07-172-41.86C246.3,30.79,163.68,3.14,83.1,17.63,55.05,22.68,26.9,30.93,0,39.68Z" fill="%237C5CFF" opacity="0.3"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 1.3) linear infinite;
z-index: 3;
height: 90px;
}
@keyframes wave-slide {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}
` }} />
{/* HTML Structure */}
<div
className="w-full h-full"
dangerouslySetInnerHTML={{ __html: `
<div class="layered-wrap">
<div class="l-wave wave-back"></div>
<div class="l-wave wave-mid"></div>
<div class="l-wave wave-front"></div>
</div>
` }}
/>
</div>
);
}Raw CSS Stylesheet Snippet
:root {
--speed: 18s;
}
.layered-wrap {
position: relative;
width: 100%;
height: 100%;
background: #060913;
overflow: hidden;
}
.l-wave {
position: absolute;
bottom: 0;
left: 0;
width: 200%;
height: 150px;
background-repeat: repeat-x;
}
.wave-back {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M321.39,56.44c58-10.79,114.16-30.13,172-41.86,82.39-16.72,168.19-17.73,250.45-.39C823.78,31,906.67,72,985.66,92.83c70.05,18.48,146.53,26.09,214.34,3V120H0V0C26.9,8.75,55.05,17,83.1,22.07,163.68,36.56,246.3,64.21,321.39,56.44Z" fill="%237C5CFF" opacity="0.2"/%3E%3C/svg%3E');
animation: wave-slide var(--speed) linear infinite;
z-index: 1;
}
.wave-mid {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M985.66,92.83C906.67,72,823.78,31,743.84,14.19c-82.26-17.34-168.06-16.33-250.45.39-57.84,11.73-114,31.07-172,41.86C246.3,64.21,163.68,36.56,83.1,22.07,55.05,17,26.9,8.75,0,0V120H1200V95.8C1132.19,118.92,1055.71,111.31,985.66,92.83Z" fill="%2318C5FF" opacity="0.25"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 0.7) linear infinite reverse;
z-index: 2;
height: 120px;
}
.wave-front {
background-image: url('data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1200 120" preserveAspectRatio="none"%3E%3Cpath d="M0,0V120H1200V0C1132.19,23.09,1055.71,15.48,985.66,3C906.67,23.83,823.78,64.8,743.84,81.61c-82.26,17.34-168.06,16.33-250.45-.39-57.84-11.73-114-31.07-172-41.86C246.3,30.79,163.68,3.14,83.1,17.63,55.05,22.68,26.9,30.93,0,39.68Z" fill="%237C5CFF" opacity="0.3"/%3E%3C/svg%3E');
animation: wave-slide calc(var(--speed) * 1.3) linear infinite;
z-index: 3;
height: 90px;
}
@keyframes wave-slide {
0% { transform: translateX(0); }
100% { transform: translateX(-50%); }
}