Ocean Waves
🟢 CSS OnlyDynamic layered marine wave paths sliding left-to-right at offset speeds, forming a beautiful horizon.
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...
Layered Waves
Complex layout featuring overlapping, multi-colored vector waves moving in contrasting directions.
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.
Ocean Waves - CSS-only Waves background for React & Tailwind
Integrate the Ocean 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>Ocean Waves</title>
<style>
html, body {
margin: 0;
padding: 0;
width: 100%;
height: 100%;
overflow: hidden;
background: #09090b;
}
:root {
--speed: 15s;
}
.waves-container {
width: 100%;
height: 100%;
background: #09090b;
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
}
.waves-hero {
width: 100%;
margin-bottom: -10px;
}
.svg-waves {
position: relative;
width: 100%;
height: 250px;
min-height: 150px;
max-height: 350px;
}
.parallax-waves > use {
animation: wave-move var(--speed) cubic-bezier(.55, .5, .45, .5) infinite;
}
.parallax-waves > use:nth-child(1) {
animation-delay: -2s;
animation-duration: calc(var(--speed) * 0.5);
}
.parallax-waves > use:nth-child(2) {
animation-delay: -3s;
animation-duration: calc(var(--speed) * 0.7);
}
.parallax-waves > use:nth-child(3) {
animation-delay: -4s;
animation-duration: calc(var(--speed) * 0.9);
}
.parallax-waves > use:nth-child(4) {
animation-delay: -5s;
animation-duration: calc(var(--speed) * 1.2);
}
@keyframes wave-move {
0% { transform: translate3d(-90px, 0, 0); }
100% { transform: translate3d(85px, 0, 0); }
}
</style>
</head>
<body>
<div class="waves-container">
<div class="waves-hero">
<svg class="svg-waves" xmlns="http://www.w3.org/2000/svg" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto">
<defs>
<path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352z" />
</defs>
<g class="parallax-waves">
<use href="#gentle-wave" x="48" y="0" fill="rgba(124, 92, 255, 0.15)" />
<use href="#gentle-wave" x="48" y="3" fill="rgba(24, 197, 255, 0.2)" />
<use href="#gentle-wave" x="48" y="5" fill="rgba(124, 92, 255, 0.3)" />
<use href="#gentle-wave" x="48" y="7" fill="rgba(24, 197, 255, 0.4)" />
</g>
</svg>
</div>
</div>
</body>
</html>React Component Wrapper (TSX)
import React from 'react';
export default function OceanWavesBackground() {
return (
<div
style={{ width: '100%', height: '100%', position: 'relative', overflow: 'hidden' }}
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed: 15s;
}
.waves-container {
width: 100%;
height: 100%;
background: #09090b;
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
}
.waves-hero {
width: 100%;
margin-bottom: -10px;
}
.svg-waves {
position: relative;
width: 100%;
height: 250px;
min-height: 150px;
max-height: 350px;
}
.parallax-waves > use {
animation: wave-move var(--speed) cubic-bezier(.55, .5, .45, .5) infinite;
}
.parallax-waves > use:nth-child(1) {
animation-delay: -2s;
animation-duration: calc(var(--speed) * 0.5);
}
.parallax-waves > use:nth-child(2) {
animation-delay: -3s;
animation-duration: calc(var(--speed) * 0.7);
}
.parallax-waves > use:nth-child(3) {
animation-delay: -4s;
animation-duration: calc(var(--speed) * 0.9);
}
.parallax-waves > use:nth-child(4) {
animation-delay: -5s;
animation-duration: calc(var(--speed) * 1.2);
}
@keyframes wave-move {
0% { transform: translate3d(-90px, 0, 0); }
100% { transform: translate3d(85px, 0, 0); }
}
` }} />
{/* HTML Structure */}
<div
style={{ width: '100%', height: '100%' }}
dangerouslySetInnerHTML={{ __html: `
<div class="waves-container">
<div class="waves-hero">
<svg class="svg-waves" xmlns="http://www.w3.org/2000/svg" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto">
<defs>
<path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352z" />
</defs>
<g class="parallax-waves">
<use href="#gentle-wave" x="48" y="0" fill="rgba(124, 92, 255, 0.15)" />
<use href="#gentle-wave" x="48" y="3" fill="rgba(24, 197, 255, 0.2)" />
<use href="#gentle-wave" x="48" y="5" fill="rgba(124, 92, 255, 0.3)" />
<use href="#gentle-wave" x="48" y="7" fill="rgba(24, 197, 255, 0.4)" />
</g>
</svg>
</div>
</div>
` }}
/>
</div>
);
}Next.js App Router Component (use client)
'use client';
import React from 'react';
export default function OceanWavesBackground() {
return (
<div
className="w-full h-full relative overflow-hidden"
>
<style dangerouslySetInnerHTML={{ __html: `
:root {
--speed: 15s;
}
.waves-container {
width: 100%;
height: 100%;
background: #09090b;
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
}
.waves-hero {
width: 100%;
margin-bottom: -10px;
}
.svg-waves {
position: relative;
width: 100%;
height: 250px;
min-height: 150px;
max-height: 350px;
}
.parallax-waves > use {
animation: wave-move var(--speed) cubic-bezier(.55, .5, .45, .5) infinite;
}
.parallax-waves > use:nth-child(1) {
animation-delay: -2s;
animation-duration: calc(var(--speed) * 0.5);
}
.parallax-waves > use:nth-child(2) {
animation-delay: -3s;
animation-duration: calc(var(--speed) * 0.7);
}
.parallax-waves > use:nth-child(3) {
animation-delay: -4s;
animation-duration: calc(var(--speed) * 0.9);
}
.parallax-waves > use:nth-child(4) {
animation-delay: -5s;
animation-duration: calc(var(--speed) * 1.2);
}
@keyframes wave-move {
0% { transform: translate3d(-90px, 0, 0); }
100% { transform: translate3d(85px, 0, 0); }
}
` }} />
{/* HTML Structure */}
<div
className="w-full h-full"
dangerouslySetInnerHTML={{ __html: `
<div class="waves-container">
<div class="waves-hero">
<svg class="svg-waves" xmlns="http://www.w3.org/2000/svg" viewBox="0 24 150 28" preserveAspectRatio="none" shape-rendering="auto">
<defs>
<path id="gentle-wave" d="M-160 44c30 0 58-18 88-18s58 18 88 18 58-18 88-18 58 18 88 18v44h-352z" />
</defs>
<g class="parallax-waves">
<use href="#gentle-wave" x="48" y="0" fill="rgba(124, 92, 255, 0.15)" />
<use href="#gentle-wave" x="48" y="3" fill="rgba(24, 197, 255, 0.2)" />
<use href="#gentle-wave" x="48" y="5" fill="rgba(124, 92, 255, 0.3)" />
<use href="#gentle-wave" x="48" y="7" fill="rgba(24, 197, 255, 0.4)" />
</g>
</svg>
</div>
</div>
` }}
/>
</div>
);
}Raw CSS Stylesheet Snippet
:root {
--speed: 15s;
}
.waves-container {
width: 100%;
height: 100%;
background: #09090b;
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
}
.waves-hero {
width: 100%;
margin-bottom: -10px;
}
.svg-waves {
position: relative;
width: 100%;
height: 250px;
min-height: 150px;
max-height: 350px;
}
.parallax-waves > use {
animation: wave-move var(--speed) cubic-bezier(.55, .5, .45, .5) infinite;
}
.parallax-waves > use:nth-child(1) {
animation-delay: -2s;
animation-duration: calc(var(--speed) * 0.5);
}
.parallax-waves > use:nth-child(2) {
animation-delay: -3s;
animation-duration: calc(var(--speed) * 0.7);
}
.parallax-waves > use:nth-child(3) {
animation-delay: -4s;
animation-duration: calc(var(--speed) * 0.9);
}
.parallax-waves > use:nth-child(4) {
animation-delay: -5s;
animation-duration: calc(var(--speed) * 1.2);
}
@keyframes wave-move {
0% { transform: translate3d(-90px, 0, 0); }
100% { transform: translate3d(85px, 0, 0); }
}