SVG wave generator
Generate layered SVG waves for section dividers and hero footers. Set the peaks, the height and the number of layers, shuffle the curve until it sits right, and copy markup that scales to any container width.
Runs entirely in your browser — nothing is uploaded, no account needed.
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1440 320" width="1440" height="320" preserveAspectRatio="none"> <path d="M 0 184 C 60 162.7 240 72.1 360 56.1 C 480 40.2 600 89.6 720 88.3 C 840 87.1 960 42.2 1080 48.8 C 1200 55.4 1380 114.7 1440 127.9 L 1440 320 L 0 320 Z" fill="#2f6df6" fill-opacity="0.3"/> <path d="M 0 134.8 C 60 136.8 240 138.8 360 146.6 C 480 154.4 600 184.3 720 181.6 C 840 178.9 960 144.5 1080 130.3 C 1200 116.1 1380 102.1 1440 96.4 L 1440 320 L 0 320 Z" fill="#2f6df6" fill-opacity="0.7"/> <path d="M 0 175.8 C 60 173.2 240 171.5 360 160.2 C 480 148.8 600 93.7 720 107.8 C 840 121.8 960 224 1080 244.5 C 1200 265 1380 233.1 1440 230.8 L 1440 320 L 0 320 Z" fill="#2f6df6"/> </svg>
Embedding it in CSS instead of markup? Run the result through SVG to Data URI.
How the waves are drawn
Each wave is a row of anchor points spread across the full 1440-unit width — one more anchor than the peaks setting — jittered up and down by a seeded random amount, then smoothed into an open spline of cubic Bézier curves. The first and last anchors are pinned to the left and right edges, so the curve always spans the whole width and the closing edges are exactly vertical: the path drops straight down to the bottom of the 320-unit-tall canvas (or straight up, when flipped), runs along that edge, and closes. The result is a filled area, not a stroked line — which matters later, because fills survive stretching in a way strokes never would.
The jitter comes from a deterministic seeded generator, so a curve you liked is reproducible: the seed is shown above the preview, and shuffle simply draws a new one. All of it happens in your browser — the markup is assembled locally and nothing is generated on a server.
Peaks, height, layers, flip
Peaks (2–8) is the number of undulations across the width. Two gives one broad swell; eight gives choppy water. Height (10–100) scales how far anchors may stray from the midline — at 100 the swing reaches about 40% of the canvas height, which is dramatic; the default 55 keeps the divider from eating the sections around it. Layers (1–4) repeats the construction with a different random sequence per layer: back layers sit slightly higher and are drawn at lower opacity, front layer fully opaque, so the stack reads as one body of water receding into the distance rather than unrelated lines.
Flip closes the fill upward instead of down — the shape for the top edge of a section rather than the bottom. One colour input drives every layer; the depth effect comes from opacity, not from picking three colours by hand, which is also what keeps the layers harmonious when you change the colour later.
A section divider that fits any width
The file carries preserveAspectRatio="none", which tells the browser to stretch the drawing to whatever box it is given instead of preserving the 1440 × 320 design proportions. In practice: paste the SVG inline (or reference the file from an <img>), set width: 100% and a fixed height — 120px is a sensible start on mobile, more on desktop — and the wave follows the viewport. Because the shape is pure fill with no strokes, stretching cannot produce fat or thin lines; the curve just gets proportionally broader.
Place it directly between two sections with display: block on the svg (inline SVG is baseline-aligned by default, which leaves a mysterious few pixels of gap below it). Give the wave the exact background colour of the section it belongs to, and the section behind it shows through the transparent part — that is the whole trick. To move the divider into the stylesheet instead of the markup, encode it with SVG to Data URI and set it as a background-image pinned to the bottom of the section.
Working with the layered output
The semi-transparent back layers blend with whatever sits behind the wave — over a white page they read as tints of the wave colour, over a photo or a gradient they tint what is underneath. That makes a layered wave over a generated gradient background a two-minute hero treatment: gradient on the section, wave in the section's foreground colour at the bottom edge. Book-ending a band of content is the same move twice — a flipped copy at the top, an unflipped one at the bottom, both filled with the neighbouring sections' background colour. And since every layer is a separate <path>, you can open the file in the editor and recolour or delete individual layers after the fact.
When a wave is the right divider
Waves soften the junction between blocks of content that would otherwise butt together as flat stripes — hero to features, features to footer, testimonial band to pricing. They suit products that want to feel organic or friendly; a fintech dashboard probably wants a straight line. Use one or two per page: dividers are punctuation, and a page where every section ripples reads like a sentence with five commas. For an organic shape that is a figure rather than an edge — something to sit behind an illustration — reach for the blob generator instead; the two tools share the same spline machinery but close the shape differently.
Common problems
- A hairline seam against the next section. The wave's fill must equal the adjacent section's background exactly — copy the hex, don't eyeball it. Sub-pixel rounding can still leave a line at some zoom levels; overlapping the sections by 1px (
margin-top: -1px) hides it. - Stretched full-bleed, the curves flatten. That is
preserveAspectRatio="none"trading proportion for fit. Raise the peaks count so there is more curve to stretch, or give the element more height on wide screens. - An unexplained gap under the wave. Inline SVG sits on the text baseline like a letter.
display: blockremoves the gap. - The back layers look wrong on a dark page. Their opacity blends with the page behind them, so tints computed against white turn muddy on near-black. Preview against the real background, or drop to a single layer and keep full opacity.
Questions
Is this SVG wave generator free?
Yes. Generating and downloading waves is free, with no account, no watermark and no export limit. The site is funded by advertising.
How do I use the wave as a section divider?
Paste the SVG inline between two sections, set width: 100% and a fixed height, and add display: block. Fill it with the background colour of the section it belongs to; the section behind shows through the transparent part.
Will the wave stretch to any screen width?
Yes. The file is exported with preserveAspectRatio="none", so it fills whatever box your CSS defines instead of keeping its 1440 × 320 proportions. Because the wave is a fill with no strokes, stretching never distorts line weights.
Is the background of the wave transparent?
Yes. Only the wave body is painted; everything above it (or below, when flipped) is transparent, so whatever the page already has — a colour, a gradient, a photo — shows through.
How do I put the wave at the top of a section instead of the bottom?
Tick Flip. The same curve then closes upward, filling toward the top edge. Pairing a flipped copy at the top with a normal one at the bottom frames a full band of content.
What do the layers actually do?
Each layer is a separate wave from the same seed family, drawn slightly higher and more transparent the further back it sits; the front layer is fully opaque. The stack reads as depth, like receding water, while staying a single colour you can change in one place.
Can I recreate a wave I generated earlier?
Yes. The curve is determined by the seed plus the peaks, height, layers and flip settings, and the seed is displayed above the preview. The same values always reproduce the same wave.
Can I use the wave as a CSS background instead of markup?
Yes. Encode the file with the SVG to Data URI tool and set it as background-image on the section, anchored with background-position: bottom and background-size: 100% to a fixed height.
Why is there a thin line between the wave and my section?
Either the fill colour is not exactly the section background — copy the hex value rather than matching by eye — or sub-pixel rounding is leaving a gap at certain zoom levels, which a 1px overlap between the elements hides.
Can I edit individual layers after exporting?
Yes. Every layer is its own path element, so the full editor on this site (or any vector editor) can select, recolour or delete layers one at a time.
Does anything get uploaded?
No. The wave is computed and the markup assembled entirely in your browser; there is no server-side generation and nothing you make here leaves your machine.
Notes
- The file carries
preserveAspectRatio="none", so withwidth: 100%and a fixed height it stretches to any section without distorting strokes — there are none, only fills. - Layers are the same wave family at rising opacity, so they always read as one body of water rather than three unrelated lines.
- Flip fills upward for the top edge of a section; pair a flipped and an unflipped copy to book-end a band.