SVG Wave Generator
Amplitude45px
Waves2
Smoothness20
Layers3
Thickness220px
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 220" width="100%" height="100%" preserveAspectRatio="none" aria-hidden="true">
  <path fill="#06b6d4" fill-opacity="0.4" d="M 0 94.7 C 12 99.1, 48 114, 72 121.2 C 96 128.3, 120 134.8, 144 137.5 C 168 140.2, 192 140.2, 216 137.5 C 240 134.8, 264 128.3, 288 121.2 C 312 114, 336 103.5, 360 94.7 C 384 85.9, 408 75.4, 432 68.3 C 456 61.1, 480 54.6, 504 51.9 C 528 49.2, 552 49.2, 576 51.9 C 600 54.6, 624 61.1, 648 68.3 C 672 75.4, 696 85.9, 720 94.7 C 744 103.5, 768 114, 792 121.2 C 816 128.3, 840 134.8, 864 137.5 C 888 140.2, 912 140.2, 936 137.5 C 960 134.8, 984 128.3, 1008 121.2 C 1032 114, 1056 103.5, 1080 94.7 C 1104 85.9, 1128 75.4, 1152 68.3 C 1176 61.1, 1200 54.6, 1224 51.9 C 1248 49.2, 1272 49.2, 1296 51.9 C 1320 54.6, 1344 61.1, 1368 68.3 C 1392 75.4, 1428 90.3, 1440 94.7 L 1440 220 L 0 220 Z"/>
  <path fill="#06b6d4" fill-opacity="0.7" d="M 0 161.6 C 12 163.2, 48 170.6, 72 171.3 C 96 172, 120 169.9, 144 165.9 C 168 161.9, 192 154.6, 216 147.5 C 240 140.4, 264 130.7, 288 123.2 C 312 115.6, 336 107.2, 360 102.1 C 384 97, 408 93.1, 432 92.4 C 456 91.7, 480 93.8, 504 97.8 C 528 101.8, 552 109.1, 576 116.2 C 600 123.3, 624 133, 648 140.6 C 672 148.1, 696 156.5, 720 161.6 C 744 166.7, 768 170.6, 792 171.3 C 816 172, 840 169.9, 864 165.9 C 888 161.9, 912 154.6, 936 147.5 C 960 140.4, 984 130.7, 1008 123.2 C 1032 115.6, 1056 107.2, 1080 102.1 C 1104 97, 1128 93.1, 1152 92.4 C 1176 91.7, 1200 93.8, 1224 97.8 C 1248 101.8, 1272 109.1, 1296 116.2 C 1320 123.3, 1344 133, 1368 140.6 C 1392 148.1, 1428 158.1, 1440 161.6 L 1440 220 L 0 220 Z"/>
  <path fill="#06b6d4" fill-opacity="1" d="M 0 202.9 C 12 201.4, 48 198.5, 72 193.8 C 96 189.2, 120 181.9, 144 175.3 C 168 168.7, 192 160.4, 216 154.3 C 240 148.3, 264 142.2, 288 139 C 312 135.8, 336 134.2, 360 135.1 C 384 135.9, 408 139.5, 432 144.2 C 456 148.8, 480 156.1, 504 162.7 C 528 169.3, 552 177.6, 576 183.7 C 600 189.7, 624 195.8, 648 199 C 672 202.2, 696 203.8, 720 202.9 C 744 202.1, 768 198.5, 792 193.8 C 816 189.2, 840 181.9, 864 175.3 C 888 168.7, 912 160.4, 936 154.3 C 960 148.3, 984 142.2, 1008 139 C 1032 135.8, 1056 134.2, 1080 135.1 C 1104 135.9, 1128 139.5, 1152 144.2 C 1176 148.8, 1200 156.1, 1224 162.7 C 1248 169.3, 1272 177.6, 1296 183.7 C 1320 189.7, 1344 195.8, 1368 199 C 1392 202.2, 1428 202.3, 1440 202.9 L 1440 220 L 0 220 Z"/>
</svg>

SVG Wave Generator Online — Layered Wave Dividers for Section Backgrounds

Drag sliders to shape smooth, layered SVG wave dividers — then export SVG, a CSS background data-URI, or a React component. Free, private, and runs entirely in your browser.

Updated July 2, 2026
Share & Support

About this tool

Generate Smooth, Layered SVG Wave Dividers — Adjust the Sliders, Copy the Code

You want that soft curved transition between two page sections instead of a hard horizontal line — the kind of flowing wave divider you see beneath hero sections and above footers on modern landing pages. Hand-writing the SVG <path> bezier coordinates for a smooth wave is tedious and error-prone. This generator builds the path for you: drag the sliders, watch the live preview, and copy clean SVG, CSS, or React code.

Under the hood, each wave is generated by sampling a sine function across the full 1440-unit width and then converting those sample points into a smooth path using a Catmull-Rom to cubic-bezier conversion. That is why every shape stays flowing and continuous rather than jagged — the control points for each bezier segment are derived from the neighbouring sample points, so the curve passes smoothly through every peak and trough. The Amplitude slider scales the sine output, the Waves slider sets the sine frequency (how many full cycles fit across the width), and Smoothness changes how many points are sampled.

The layered effect stacks several wave paths at slightly offset baselines and phases, each drawn with a higher fill-opacity than the last. Because semi-transparent shapes overlap, you get a rich, tonal ribbon without exporting multiple images. Choose one shared color, a two-stop linear gradient, or turn on multi-color layers to give each of the up to 5 layers its own independent color for a bolder, more varied ribbon.

The wave works on all four edges of a section — Top, Bottom, Left, or Right. Top and Bottom generate a horizontal wave (crests running left to right); Left and Right rotate the same math onto the vertical axis so the crests run up and down instead, for a wavy sidebar or column divider. Whichever edge you pick, the path automatically closes to that side so the shape always fills cleanly.

Built-in animation, accessibility, and safety net

Turn on Animate (gentle drift) and each layer gets its own CSS @keyframes animation baked directly into the exported <svg> — a subtle alternating translateX sway with a different duration per layer, so the ribbon feels alive without you writing any CSS. Because the <style> block lives inside the SVG itself, the animation carries over automatically into the CSS data-URI export too, and the React export wraps it in a JSX-safe template literal so it compiles cleanly. This is a gentle side-to-side sway, not a seamless one-directional scroll — for a continuous rolling-wave loop you would still duplicate the path and run a linear translateX(-50%) keyframe by hand.

Decorative (adds aria-hidden) is on by default, since a wave divider carries no information a screen reader needs to announce — the tool bakes aria-hidden="true" straight into the exported markup so you don't have to remember to add it yourself. And because tweaking six sliders plus color and edge settings can take a few tries to get right, the header includes undo/redo (Ctrl+Z / Ctrl+Shift+Z, up to 60 steps) and a Share button that encodes your entire design into a URL so a teammate can open the exact same wave.

Exports cover the three ways people actually drop waves into a project: raw <svg> markup for pasting into HTML, a CSS `background-image` data-URI that needs no separate file, and a React component with attributes already converted to JSX camelCase (fillOpacity, stopColor, className). Everything runs in your browser — nothing is uploaded, and the tool keeps working offline once loaded.

Placing the wave on your page depends on the edge. For a horizontal wave (Top/Bottom), give the parent section position: relative, then drop the exported SVG in as the last child with position: absolute; left: 0; bottom: 0; width: 100% (or top: 0 for the Top edge). Because the markup uses preserveAspectRatio="none", it stretches edge to edge and stays flush at every breakpoint — no media queries needed. For a vertical wave (Left/Right), use top: 0; bottom: 0; width: auto; height: 100% and anchor left: 0 or right: 0 instead. Vector paths render natively with no JavaScript at runtime, so a few kilobytes of SVG replaces a heavy animated GIF or a stack of PNG exports.

How it compares

SVG Wave vs Clip-Path vs a Raster Divider Image

TechniqueEdge shapeFile weightScalabilityBest for
SVG wave (this tool)Multiple undulating crests with tunable amplitude/frequencyA few hundred bytes to a few KBInfinite — vectorOrganic multi-crest wave dividers beneath heroes and above footers
CSS `clip-path`Cuts the *same* element's edge — polygons, or smooth circles/ellipses/rounded cornersZero — pure CSSInfinite — resolution independentReshaping a photo, card, or section's own boundary — see our Clip-path Generator
PNG / WebP divider imageAny shape, but fixed at export resolution20–100+ KB, needs 1x/2x/3x variantsNone — pixelates when scaled upComplex illustrated dividers that are not achievable with paths

What's included

Features

Six one-click style presets — Calm, Smooth, Wavy, Peaks, Choppy, and Bold — to set amplitude and wave count instantly
Smooth sine-based waves rendered with Catmull-Rom bezier paths so curves stay flowing, never jagged
Five live sliders: amplitude, wave count, smoothness, layers, and thickness, all reflected in the preview in real time
Stack up to 5 translucent layers for a modern depth effect without exporting multiple images
All four edges — Top, Bottom, Left, or Right — so the same generator makes horizontal dividers or vertical sidebar/column waves
Solid color, a two-stop linear gradient, or independent multi-color per layer — pair it with a palette from our Color Palette Generator
Built-in gentle drift animation toggle — bakes per-layer CSS keyframes directly into the SVG, CSS, and React export
Decorative export toggle adds aria-hidden="true" automatically (on by default) so screen readers skip the divider
Undo/redo with Ctrl+Z / Ctrl+Shift+Z (up to 60 steps) and a Share button that copies a URL encoding your exact design
Randomize button shuffles phase, amplitude, wave count, and smoothness for instant organic variations
Export to SVG markup, a CSS data-URI background, or a React component; convert raster art to vectors with our Image to SVG tool

Step by step

How to Use

  1. 1
    Start from a style presetPick one of the six presets — Calm, Smooth, Wavy, Peaks, Choppy, or Bold — to set a sensible amplitude and wave count in one click. The live preview updates instantly so you can see the shape of the divider before tweaking anything.
  2. 2
    Choose the edgeClick Top, Bottom, Left, or Right to decide which side the wave sits on. Top and Bottom make a horizontal divider — Bottom for beneath a hero, Top for sitting on a footer. Left and Right rotate the same wave onto the vertical axis for a sidebar or column divider.
  3. 3
    Shape the wave with slidersDrag Amplitude to make the crests taller or flatter, Waves to set how many crests span the length, and Smoothness to control how rounded the curve is. Adjust Thickness to change the overall size of the divider band, and Layers to stack multiple translucent waves for a depth effect.
  4. 4
    Pick a color, gradient, or multi-color layersUse the color picker to set a single wave fill, or tick "Use gradient fill" for a two-stop blend. For a bolder ribbon, tick "Multi-color layers" to give each of the up to 5 layers its own independent color swatch.
  5. 5
    Turn on animation and accessibility optionsTick "Animate (gentle drift)" to bake a subtle per-layer sway animation into the export with zero CSS of your own. Leave "Decorative" checked (it is on by default) so the export automatically gets aria-hidden="true" for screen readers.
  6. 6
    Randomize, undo, or shareClick Randomize to shuffle the shape for a fresh organic result. Made a change you regret? Ctrl+Z undoes it (Ctrl+Shift+Z to redo). Click Share to copy a URL that reopens your exact design — handy for sending a draft to a teammate.
  7. 7
    Export your formatSwitch between the SVG, CSS, and React tabs. SVG gives raw markup to paste into HTML, CSS gives a background-image data-URI rule (animation included automatically), and React gives a ready-to-use component with JSX-safe attributes. Click Copy to grab the code.
Pro tip: match wave count to section width

A wave that looks great full-width on desktop can look cramped or overly busy in a narrower content column. As a rule of thumb, use 2–3 waves for a full-viewport-width hero divider and drop to 1–2 waves with lower amplitude for a divider inside a boxed, max-width content area — fewer, wider crests read as calmer and more premium at smaller widths.

Real-world uses

Common Use Cases

🌊
Add a flowing wave divider beneath your hero section
Drop the bottom-edge SVG at the foot of a colored hero band so it melts into the next section instead of ending on a hard line — the single most common landing-page use for wave dividers.
🎨
Create a layered, depth-rich section background
Stack 3–5 translucent layers in a brand color to build the tonal ribbon look seen on SaaS marketing pages. Combine it with a clipped shape from our CSS Clip-path Generator.
🦶
Sit a wave on top of your site footer
Switch to the top edge and place the wave above a dark footer so the page content flows down into it with a soft curved seam rather than a flat border.
🌈
Blend a gradient wave that matches your palette
Turn on gradient fill and pick two brand colors for a wave that transitions vertically — ideal for hero overlays. Generate a matching scheme with our Gradient Generator.
⚛️
Drop a reusable wave component into a React app
Copy the React export to get a self-contained component with JSX-safe attributes — render it at any section boundary in Next.js, Vite, or CRA and recolor it through props or wrapper styles.
💾
Embed a wave as a CSS background with zero extra requests
Use the CSS data-URI export to add a decorative wave entirely inside your stylesheet — no image hosting, no extra HTTP call. Shrink your final CSS with our CSS Minifier & Beautifier.
📐
Build a wavy sidebar or column divider
Switch the edge to Left or Right to rotate the same wave onto the vertical axis — perfect for a decorative boundary between a sidebar and main content, or between two side-by-side columns, without hand-drawing a vertical bezier path.
🎭
Design a bold, multi-tone ribbon effect
Turn on Multi-color layers to give each of up to 5 stacked waves its own independent color, instead of one hue fading through opacity — ideal for vibrant SaaS hero sections or playful brand illustrations that need more than a single-color wash.
Performance & accessibility

SVG wave dividers are decorative, so this generator bakes aria-hidden="true" straight into the exported markup by default via the "Decorative" toggle — screen readers skip over it automatically, with nothing extra for you to add. Because the exported markup is pure vector data with no embedded raster image, it costs a few kilobytes at most and never contributes to layout shift when width/height or viewBox are set, which the generator also does automatically.

Got questions?

Frequently Asked Questions

An SVG wave divider is a vector shape placed between two page sections to replace a flat horizontal edge with a flowing curved transition. Because it is SVG it stays crisp at any size, scales to any width without pixelation, and weighs only a few hundred bytes. It is most often used beneath hero sections, between alternating content bands, and above footers.

Either paste the <svg> markup directly into your HTML at the bottom of a section and position it absolutely against the edge, or use the CSS export, which embeds the wave as a data-URI background-image on a div with a set height. The SVG approach keeps the cleanest DOM and lets you animate the path; the CSS approach keeps your markup tidy for purely decorative dividers.

Amplitude is the height of each crest and trough — higher amplitude means taller, more dramatic waves and low amplitude means a gentle ripple. Wave count is how many complete crests fit across the full width — more waves give a busier, choppier edge and fewer waves give long sweeping curves. Smoothness controls how rounded versus angular the curve appears.

Increasing the Layers slider stacks multiple wave paths of the same color at slightly different vertical offsets and phases, each drawn with a higher fill-opacity. The overlap of semi-transparent shapes creates a tonal, depth-rich ribbon effect popular on modern landing pages — without needing a separate image for each band.

Yes. The CSS tab produces a ready-to-paste rule that embeds the wave as a URL-encoded data-URI in background-image with background-size: cover so it fills its container. This keeps the wave inside your stylesheet with no extra HTTP request and no separate asset to host.

Select the React tab. The tool returns a complete function component with all attributes converted to JSX camelCase — fill-opacity becomes fillOpacity and stop-color becomes stopColor — so it compiles without warnings. Drop it in at any section boundary and recolor or resize it through props or wrapper styles. The same markup works in Next.js, Vite, and CRA.

For a horizontal wave (Top or Bottom edge), give the section position: relative, then add the wave as its last child with position: absolute, left: 0, bottom: 0 (or top: 0), width: 100%. The exported SVG uses preserveAspectRatio="none", so it stretches edge to edge and stays flush at any screen size. For a vertical wave (Left or Right edge), use top: 0, bottom: 0, height: 100%, and anchor left: 0 or right: 0 instead — width follows automatically from the aspect ratio.

Tick "Animate (gentle drift)" in the Export options section and the tool bakes a per-layer CSS keyframe animation directly into the exported markup — a subtle alternating translateX sway, with each layer given a slightly different duration for a parallax feel. Because the animation lives inside the SVG's own <style> block, it automatically carries over into the CSS data-URI export too, with zero extra CSS needed. This built-in animation is a gentle side-to-side sway, not a seamless one-directional scroll. For a continuous rolling loop, duplicate the path so it tiles seamlessly and run your own linear translateX(-50%) keyframe by hand.

An SVG wave is a few hundred bytes of text, scales infinitely without blur, and can be recolored by editing one attribute or animated with CSS. A PNG is many kilobytes, looks soft on high-DPI screens unless you ship a 2x version, and cannot be recolored without re-exporting. For a flat decorative divider, SVG wins on both performance and flexibility.

Yes — choose Left or Right instead of Top or Bottom in the Edge section. The generator rotates the same sine-and-Catmull-Rom math onto the vertical axis, so the crests run up and down the container instead of left to right, and the shape closes to whichever side (left or right) you selected. This makes a wavy vertical divider between two side-by-side columns or a decorative sidebar edge, using the exact same sliders as the horizontal wave.

Tick "Multi-color layers" in the Color section and each of the up to 5 active layers gets its own independent color swatch, instead of every layer sharing one solid color or one gradient. This produces a bolder, more varied ribbon effect — for example a teal-to-purple-to-pink gradient of layers rather than one color fading through opacity. Turn the toggle off to go back to a single shared color or gradient.

Yes — the "Decorative (adds aria-hidden)" checkbox is on by default, and the tool bakes aria-hidden="true" directly onto the root <svg> element in every export format. This tells screen readers to skip the divider, which is correct for almost every use case since a wave carries no information that needs to be announced. Untick it only if you have a specific reason for the SVG to be exposed to assistive technology.

Yes. Press Ctrl+Z to undo (Ctrl+Shift+Z or Ctrl+Y to redo) — the tool keeps up to 60 steps of history, debounced so rapid slider drags count as one step. Click the Share button in the header to copy a URL that encodes every setting (shape, edge, colors, animation, and accessibility options); opening that link reproduces your exact design, which is useful for sending a draft to a teammate or saving a favorite configuration as a bookmark.

Yes — it is completely free with no sign-up, watermark, or limit, and all generation happens in your browser, so nothing is uploaded to a server. The tool keeps working offline once loaded, and the SVG you copy is yours to use in personal and commercial projects.

CSS clip-path reshapes the visible boundary of the element it is applied to — polygon() for angled cuts, or circle()/ellipse()/inset() with a border-radius for smooth curves — which is ideal for cropping a photo, card, or section into a non-rectangular shape. An SVG wave is a separate, filled shape placed as a divider between two sections, purpose-built to render several undulating crests and troughs with tunable amplitude and frequency — something clip-path is not designed for, since it clips one element rather than drawing a new decorative one. Use clip-path to reshape an existing element (try our Clip-path Generator); use an SVG wave when you need a dedicated multi-crest divider band.

No — even a 5-layer wave with high smoothness is only a few kilobytes of path data and renders instantly, since browsers draw SVG paths natively with no JavaScript needed at runtime. Compare that to an equivalent PNG or WebP wave graphic, which is typically 20–100 KB and needs separate 1x/2x/3x versions for different screen densities. The only performance consideration is if you animate many layers at once with heavy filters — plain path fills and CSS transforms stay smooth even on low-end devices.