1440 × 200
2.36 KB
1 Layer
Advertisement
ViewBox1440×200
Layers1
SVG2.36 KB
FamilySine
AnimationStatic
✓ 7.0:1

About this generator

Most CSS wave generators give you a single static SVG — change the color, download the file, ship it. Then the design team asks for parallax, the dev team asks for a React component, the design-system team asks for a Tailwind class, the QA engineer flags the missing aria-hidden, and the EU EAA compliance audit catches the unwrapped infinite animation. This generator was built to fix exactly that gap.

Six wave families — sine, compound, bezier, stepped, organic (feTurbulence), hand-drawn — live in one editor with a family-picker grid. Each family produces a measurably different aesthetic; the Pro tips below tell you when to pick which. Eighteen production templates — SaaS Hero, Footer Wave, Section Transition, Wellness Calm, Agency Bold, E-commerce Banner, Blog Header, 404 Playful, Dashboard Spark, Audio Equalizer, Scrollytelling, Dark Hero, Glassmorphic, Brutalist Sharp, Organic Hand-drawn, Retro 80s Neon, Minimal Mono, Gradient Mesh — give you a starting point that’s already been styled for a specific use case.

Three more differences worth calling out. Multi-layer parallax composer — stack 1-4 waves with independent amplitude, frequency, phase, opacity, and color, then export as either a flat SVG or a CSS-grid stack with scroll-timeline depth offsets. No other generator exports layered SVG. Eight export formats — pure SVG, CSS background-image (data-URL), CSS clip-path (modern shape() + polygon fallback), CSS mask-image (clip images/video into the wave shape), Tailwind arbitrary-value utilities, React + TypeScript, Vue 3 SFC, Svelte, Astro. Zero competitors offer more than two. Responsive triple-preview — render the wave at 360 / 768 / 1440 viewports side-by-side simultaneously to catch breakpoint surprises that single-viewport previews miss.

Permalink: every adjustment encodes into the URL hash, so you can bookmark a tuned wave or send it to a teammate. Hit the ↗ CodePen button to open the wave in a new pen for sharing or blogging. No login, no watermark, no paywall. Free and MIT-licensed.

?

How to use

01
Pick a wave family
Six families up top — Sine (textbook math curve), Compound (sum of harmonics for organic depth), Bezier (smooth fewer-point curve), Stepped (audio equalizer / brutalist), Organic (feTurbulence noise), Drawn (jitter for hand-drawn). Each maps to a different aesthetic; the Pro tips below tell you when to pick which.
02
Start from a real-world template
18 production templates — SaaS Hero, Footer Wave, Section Transition, Wellness Calm, Agency Bold, E-commerce Banner, Blog Header, 404 Playful, Dashboard Spark, Audio Equalizer, Scrollytelling, Dark Hero, Glassmorphic, Brutalist Sharp, Organic Hand-drawn, Retro 80s Neon, Minimal Mono, Gradient Mesh. Click to load, then customize.
03
Tune the geometry
ViewBox width / height set the SVG canvas. Baseline Y is the wave middle. Anchor side picks Top (fills upward), Bottom (fills downward), or Stroke-only (open path, great for sparklines and dashboards). The wave path stays parametric so changes update live.
04
Stack 1–4 layers for parallax depth
Click + Add to stack another wave. Each layer has independent amplitude, frequency, phase, opacity, and color — so you compose depth (low-opacity background wave + mid + foreground). Click L1 / L2 / L3 / L4 to switch which layer the controls edit. No other generator exports layered SVG.
05
Pick fill mode + color
Solid fill or animated linear gradient (from + to). Each layer gets its own color independently — composite gradients are the entire visual identity of SaaS hero sections (Stripe, Linear, Vercel).
06
Animate (optional)
Toggle Animated to add a horizontal drift. Pick Loop (infinite via @property typed angle for smooth GPU interpolation) or Scroll-linked (animation-timeline: scroll() — Chrome 115+, Safari 26+, Firefox flagged). prefers-reduced-motion fallback is automatic. No competitor ships scroll-timeline export.
07
Verify on real backgrounds
Toggle the preview background (Dark / Light / Gray / Card / Brand / Mesh / custom). The contrast badge below shows your first layer color vs the background — WCAG 1.4.11 needs ≥ 3:1 for non-text indicators. Hit the Responsive button to render the wave at 360 / 768 / 1440 simultaneously and catch breakpoint surprises.
08
Export to your stack
Eight formats: SVG (drop-in markup), CSS (background-image data-URL OR clip-path shape()), Mask (mask-image for clipping images/video), Tailwind arbitrary-value class, React + TS, Vue 3 SFC, Svelte, Astro. Output ships aria-hidden="true" + focusable="false" automatically when waves are decorative.
</>

Common wave snippets

SVG (full markup)
<!-- Drop into any HTML — full SVG with multi-layer parallax -->
<svg xmlns="http://www.w3.org/2000/svg"
     viewBox="0 0 1440 200"
     preserveAspectRatio="none"
     width="100%"
     aria-hidden="true" focusable="false">
  <path d="M 0 100 C ... L 1440 200 L 0 200 Z"
        fill="#a78bfa" opacity="1"/>
</svg>
CSS background-image
/* CSS background-image — wave embedded as data-URL */
.hero-wave {
  width: 100%;
  aspect-ratio: 1440 / 200;
  background-image: url("data:image/svg+xml,...");
  background-size: 100% 100%;
  background-repeat: no-repeat;
}
CSS clip-path shape()
/* CSS clip-path: shape() — Chrome 132+, falls back via @supports */
.hero {
  background: linear-gradient(135deg, #6366f1, #a78bfa);
  height: 60vh;
  clip-path: shape(from 0 0, line to 100% 0, line to 100% 80%,
    line to 95% 82%, line to 90% 78%, line to 85% 84%,
    line to 0 82%, line to 0 0);
}

@supports not (clip-path: shape(from 0 0)) {
  .hero {
    clip-path: polygon(0 0, 100% 0, 100% 80%, 95% 82%,
      90% 78%, 85% 84%, 0 82%);
  }
}
CSS mask-image (clip image)
/* CSS mask-image — wave clips an image / video / gradient */
.image-wave {
  width: 100%;
  aspect-ratio: 1440 / 200;
  mask-image: url("data:image/svg+xml,...");
  mask-size: 100% 100%;
  mask-repeat: no-repeat;
  -webkit-mask-image: url("data:image/svg+xml,...");
  -webkit-mask-size: 100% 100%;
  -webkit-mask-repeat: no-repeat;
  background: url("/hero.jpg") center/cover;
  /* The image is now clipped into the wave shape */
}
Animated @property typed-angle
/* @property typed-angle animation — smooth GPU interpolation */
@property --wave-phase {
  syntax: '<angle>';
  initial-value: 0deg;
  inherits: false;
}

.wave-layer-0 { animation: wave-shift 12s linear infinite; }
.wave-layer-1 { animation: wave-shift 14s linear infinite reverse; }
.wave-layer-2 { animation: wave-shift 16s linear infinite; }

@keyframes wave-shift {
  from { transform: translateX(0); }
  to   { transform: translateX(-60px); }
}

@media (prefers-reduced-motion: reduce) {
  .wave-layer-0, .wave-layer-1, .wave-layer-2 { animation: none; }
}
Scroll-linked animation
/* Scroll-linked wave — Chrome 115+, Safari 26+, Firefox flagged */
.wave-layer-0 {
  animation: wave-shift linear;
  animation-timeline: scroll();
}

@keyframes wave-shift {
  from { transform: translateX(0); }
  to   { transform: translateX(-40px); }
}

@supports not (animation-timeline: scroll()) {
  /* Static fallback — wave doesn't animate */
}
Tailwind v3 / v4
<!-- Tailwind arbitrary-value class — works in v3 AND v4 -->
<div class="w-full aspect-[1440/200] bg-no-repeat bg-[length:100%_100%]
            bg-[image:url('data:image/svg+xml,...')]"
     aria-hidden="true" />
React component
// CssWave.tsx — drop-in React component
import React from 'react';

type Props = { className?: string; style?: React.CSSProperties; };

export default function CssWave({ className, style }: Props) {
  return (
    <div
      className={className}
      style={{ width: '100%', aspectRatio: '1440 / 200', ...style }}
      aria-hidden="true"
      dangerouslySetInnerHTML={{
        __html: `<svg ...>...</svg>`
      }}
    />
  );
}

Browser support

Every output the generator emits — SVG paths, CSS background-image data-URLs, mask-image, @property typed angles, prefers-reduced-motion — is supported in every evergreen browser. clip-path: shape() needs Chrome 132+ (falls back to polygon via @supports). animation-timeline: scroll() needs Chrome 115+ / Safari 26+ (falls back to static via @supports). feTurbulence (Organic family) is universally supported. Safe to ship anywhere.

Chrome v85+
Safari v16+
Firefox v128+
Edge v85+

Pro tips

01
Sine vs Compound vs Bezier — pick by aesthetic
<strong>Sine</strong> is the textbook math wave — predictable, symmetrical, great for minimalist designs (Minimal Mono preset). <strong>Compound</strong> is sum-of-harmonics — adds visual depth without looking artificial, the go-to for modern SaaS hero sections (Stripe, Linear). <strong>Bezier</strong> uses fewer control points so the curve reads smoother and lighter — perfect for sparklines and dashboard charts. Pick the simplest family that meets the design — extra mathematical complexity has zero aesthetic payoff.
02
Multi-layer parallax — the SaaS hero recipe
Three waves stacked is the canonical SaaS hero pattern (Stripe, Linear, Vercel, Notion). Recipe: <strong>Background layer</strong> — large amplitude (40-60px), low opacity (0.3-0.4), longer wavelength. <strong>Mid layer</strong> — medium amplitude, 0.5-0.7 opacity, shifted phase (90°). <strong>Foreground</strong> — smaller amplitude (24-36px), full opacity, shifted phase (180°). Each layer drifts at a different speed in scroll-linked mode → real parallax depth at zero JS cost. Load the SaaS Hero preset for a ready-made example.
03
Clip-path shape() vs SVG vs mask-image — three different exports for three different needs
<strong>SVG path</strong> — best for layered, animated, or filtered waves. Embeds the wave as <code>&lt;path&gt;</code> elements you can target individually. <strong>CSS clip-path: shape()</strong> — best when you want the wave to clip an element (a section, a div) without an extra SVG file. Modern Chrome 132+; falls back to <code>polygon()</code> approximation elsewhere. <strong>CSS mask-image</strong> — best when you want to clip an IMAGE or VIDEO into the wave shape. Pass any image / gradient / video as the background; the wave becomes a window. No competitor handles all three — most do SVG only.
04
Animate phase + transform, never the d attribute
Older tutorials show animating the <code>d</code> attribute via <code>@keyframes</code> string interpolation — this is jank-prone and breaks on path-length mismatches. The modern approach: register <code>--wave-phase</code> as <code>&lt;angle&gt;</code> via <code>@property</code> and animate via <code>transform: translateX()</code> on each layer. Smooth GPU compositing, no path recomputation. The generator emits this automatically.
05
Mark decorative waves aria-hidden
A wave divider conveys visual hierarchy, not information. Screen readers should skip it. The generator auto-adds <code>aria-hidden="true"</code> + <code>focusable="false"</code> on the &lt;svg&gt;. Without these, NVDA / JAWS / VoiceOver announce "graphic, graphic, graphic" between every section — exhausting for blind users. The exception: a wave that DOES carry meaning (e.g. audio waveform in a player) needs <code>role="img"</code> + <code>aria-label="Audio waveform"</code>.
06
Watch SVG byte size for hero waves
A wave SVG over ~2KB compressed is a Core Web Vitals warning — base64-encoded into a <code>background-image: url(data:image/svg+xml,...)</code> the encoding adds ~35% byte overhead. The performance badge below the preview shows your current SVG size. Strategies: fewer control points (Bezier family does this naturally), simpler paths (skip turbulence unless visually necessary), prefer inline SVG over data-URL backgrounds for hero waves, lazy-load below-fold decorative waves with <code>loading="lazy"</code> on the wrapping <code>&lt;img&gt;</code>.

Search CodeFronts

Loading…