14 CSS Wave Section Dividers07 / 14
Inverted curve SVG wave divider CSS
Concave dips that pull the eye downward into a CTA. Instead of the wave bulging outward, the edge scoops inward — a shape that visually funnels attention toward whatever sits at the pinch point, which is why conversion-focused pages use it around signup banners.
Published
The code
<div class="wsd-07-group">
<section class="wsd-07a">
<div class="wsd-07a__above"><p class="wsd-07a__copy">Features, proof, screenshots…</p></div>
<div class="wsd-07a__band">
<svg class="wsd-07a__wave wsd-07a__wave--top" viewBox="0 0 1440 110" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C360,0 420,110 720,110 C1020,110 1080,0 1440,0 L1440,0 L0,0 Z"></path></svg>
<h2 class="wsd-07a__title">Start your free trial</h2>
<p class="wsd-07a__copy">The curve funnels the eye to the centre — put the button there.</p>
<a class="wsd-07a__cta" href="#0">Create account</a>
</div>
<div class="wsd-07a__below"><p class="wsd-07a__copy">…and the page continues.</p></div>
</section>
<section class="wsd-07b">
<div class="wsd-07b__above"><p class="wsd-07b__copy">Section above</p></div>
<div class="wsd-07b__band">
<svg class="wsd-07b__wave wsd-07b__wave--top" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C420,0 480,90 720,90 C960,90 1020,0 1440,0 Z"></path></svg>
<h2 class="wsd-07b__title">A lens for one idea</h2>
<p class="wsd-07b__copy">Curved on both edges, the band floats away from the grid.</p>
<svg class="wsd-07b__wave wsd-07b__wave--bottom" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,90 C420,90 480,0 720,0 C960,0 1020,90 1440,90 Z"></path></svg>
</div>
<div class="wsd-07b__below"><p class="wsd-07b__copy">Section below</p></div>
</section>
</div><div class="wsd-07-group">
<section class="wsd-07a">
<div class="wsd-07a__above"><p class="wsd-07a__copy">Features, proof, screenshots…</p></div>
<div class="wsd-07a__band">
<svg class="wsd-07a__wave wsd-07a__wave--top" viewBox="0 0 1440 110" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C360,0 420,110 720,110 C1020,110 1080,0 1440,0 L1440,0 L0,0 Z"></path></svg>
<h2 class="wsd-07a__title">Start your free trial</h2>
<p class="wsd-07a__copy">The curve funnels the eye to the centre — put the button there.</p>
<a class="wsd-07a__cta" href="#0">Create account</a>
</div>
<div class="wsd-07a__below"><p class="wsd-07a__copy">…and the page continues.</p></div>
</section>
<section class="wsd-07b">
<div class="wsd-07b__above"><p class="wsd-07b__copy">Section above</p></div>
<div class="wsd-07b__band">
<svg class="wsd-07b__wave wsd-07b__wave--top" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C420,0 480,90 720,90 C960,90 1020,0 1440,0 Z"></path></svg>
<h2 class="wsd-07b__title">A lens for one idea</h2>
<p class="wsd-07b__copy">Curved on both edges, the band floats away from the grid.</p>
<svg class="wsd-07b__wave wsd-07b__wave--bottom" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,90 C420,90 480,0 720,0 C960,0 1020,90 1440,90 Z"></path></svg>
</div>
<div class="wsd-07b__below"><p class="wsd-07b__copy">Section below</p></div>
</section>
</div>.wsd-07-group {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
gap: 0;
}
.wsd-07-group > section {
width: 100%;
}
.wsd-07a,
.wsd-07a *,
.wsd-07a *::before,
.wsd-07a *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07a {
--page: oklch(0.96 0.01 240);
--band: oklch(0.28 0.1 262);
--accent: oklch(0.8 0.16 92);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07a__above,
.wsd-07a__below {
background: var(--page);
color: oklch(0.36 0.03 240);
padding: 46px 24px;
text-align: center;
}
.wsd-07a__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07a__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(88px,12vw,140px) 24px 60px;
text-align: center;
}
.wsd-07a__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(56px,8vw,104px);
color: var(--page);
pointer-events: none;
}
.wsd-07a__wave--top {
top: -1px;
}
.wsd-07a__wave path {
fill: currentColor;
}
.wsd-07a__title {
font-size: clamp(25px,4vw,40px);
margin-bottom: 10px;
}
.wsd-07a__band .wsd-07a__copy {
opacity: .8;
max-width: 44ch;
margin: 0 auto;
}
.wsd-07a__cta {
display: inline-block;
margin-top: 20px;
font-size: 14.5px;
font-weight: 800;
color: oklch(0.24 0.08 262);
background: var(--accent);
padding: 13px 28px;
border-radius: 9999px;
text-decoration: none;
transition: transform .2s;
}
.wsd-07a__cta:hover {
transform: translateY(-2px);
}
.wsd-07a__cta:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.wsd-07b,
.wsd-07b *,
.wsd-07b *::before,
.wsd-07b *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07b {
--page: oklch(0.95 0.02 100);
--band: oklch(0.33 0.09 178);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07b__above,
.wsd-07b__below {
background: var(--page);
color: oklch(0.36 0.04 120);
padding: 42px 24px;
text-align: center;
}
.wsd-07b__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07b__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(80px,11vw,120px) 24px clamp(80px,11vw,120px);
text-align: center;
}
.wsd-07b__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(48px,7vw,86px);
color: var(--page);
pointer-events: none;
}
.wsd-07b__wave--top {
top: -1px;
}
.wsd-07b__wave--bottom {
bottom: -1px;
}
.wsd-07b__wave path {
fill: currentColor;
}
.wsd-07b__title {
font-size: clamp(24px,3.8vw,36px);
margin-bottom: 8px;
}
.wsd-07b__band .wsd-07b__copy {
opacity: .82;
max-width: 44ch;
margin: 0 auto;
}.wsd-07-group {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
gap: 0;
}
.wsd-07-group > section {
width: 100%;
}
.wsd-07a,
.wsd-07a *,
.wsd-07a *::before,
.wsd-07a *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07a {
--page: oklch(0.96 0.01 240);
--band: oklch(0.28 0.1 262);
--accent: oklch(0.8 0.16 92);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07a__above,
.wsd-07a__below {
background: var(--page);
color: oklch(0.36 0.03 240);
padding: 46px 24px;
text-align: center;
}
.wsd-07a__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07a__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(88px,12vw,140px) 24px 60px;
text-align: center;
}
.wsd-07a__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(56px,8vw,104px);
color: var(--page);
pointer-events: none;
}
.wsd-07a__wave--top {
top: -1px;
}
.wsd-07a__wave path {
fill: currentColor;
}
.wsd-07a__title {
font-size: clamp(25px,4vw,40px);
margin-bottom: 10px;
}
.wsd-07a__band .wsd-07a__copy {
opacity: .8;
max-width: 44ch;
margin: 0 auto;
}
.wsd-07a__cta {
display: inline-block;
margin-top: 20px;
font-size: 14.5px;
font-weight: 800;
color: oklch(0.24 0.08 262);
background: var(--accent);
padding: 13px 28px;
border-radius: 9999px;
text-decoration: none;
transition: transform .2s;
}
.wsd-07a__cta:hover {
transform: translateY(-2px);
}
.wsd-07a__cta:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.wsd-07b,
.wsd-07b *,
.wsd-07b *::before,
.wsd-07b *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07b {
--page: oklch(0.95 0.02 100);
--band: oklch(0.33 0.09 178);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07b__above,
.wsd-07b__below {
background: var(--page);
color: oklch(0.36 0.04 120);
padding: 42px 24px;
text-align: center;
}
.wsd-07b__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07b__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(80px,11vw,120px) 24px clamp(80px,11vw,120px);
text-align: center;
}
.wsd-07b__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(48px,7vw,86px);
color: var(--page);
pointer-events: none;
}
.wsd-07b__wave--top {
top: -1px;
}
.wsd-07b__wave--bottom {
bottom: -1px;
}
.wsd-07b__wave path {
fill: currentColor;
}
.wsd-07b__title {
font-size: clamp(24px,3.8vw,36px);
margin-bottom: 8px;
}
.wsd-07b__band .wsd-07b__copy {
opacity: .82;
max-width: 44ch;
margin: 0 auto;
}/* No JavaScript — a page-coloured concave path on the band's top edge scoops inward, funnelling attention to the centred CTA. */ /* No JavaScript — mirrored concave paths on both edges pinch the band into a lens shape. */
/* No JavaScript — a page-coloured concave path on the band's top edge scoops inward, funnelling attention to the centred CTA. */
/* No JavaScript — mirrored concave paths on both edges pinch the band into a lens shape. */Here's a working CSS Wave Section Divider from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Inverted curve SVG wave divider CSS
Source: https://codefronts.com/layouts/css-wave-section-dividers/inverted-curve-svg-wave-divider-css/
Concave dips that pull the eye downward into a CTA. Instead of the wave bulging outward, the edge scoops inward — a shape that visually funnels attention toward whatever sits at the pinch point, which is why conversion-focused pages use it around signup banners.
## HTML
```html
<div class="wsd-07-group">
<section class="wsd-07a">
<div class="wsd-07a__above"><p class="wsd-07a__copy">Features, proof, screenshots…</p></div>
<div class="wsd-07a__band">
<svg class="wsd-07a__wave wsd-07a__wave--top" viewBox="0 0 1440 110" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C360,0 420,110 720,110 C1020,110 1080,0 1440,0 L1440,0 L0,0 Z"></path></svg>
<h2 class="wsd-07a__title">Start your free trial</h2>
<p class="wsd-07a__copy">The curve funnels the eye to the centre — put the button there.</p>
<a class="wsd-07a__cta" href="#0">Create account</a>
</div>
<div class="wsd-07a__below"><p class="wsd-07a__copy">…and the page continues.</p></div>
</section>
<section class="wsd-07b">
<div class="wsd-07b__above"><p class="wsd-07b__copy">Section above</p></div>
<div class="wsd-07b__band">
<svg class="wsd-07b__wave wsd-07b__wave--top" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C420,0 480,90 720,90 C960,90 1020,0 1440,0 Z"></path></svg>
<h2 class="wsd-07b__title">A lens for one idea</h2>
<p class="wsd-07b__copy">Curved on both edges, the band floats away from the grid.</p>
<svg class="wsd-07b__wave wsd-07b__wave--bottom" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,90 C420,90 480,0 720,0 C960,0 1020,90 1440,90 Z"></path></svg>
</div>
<div class="wsd-07b__below"><p class="wsd-07b__copy">Section below</p></div>
</section>
</div>
```
## CSS
```css
.wsd-07-group {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
gap: 0;
}
.wsd-07-group > section {
width: 100%;
}
.wsd-07a,
.wsd-07a *,
.wsd-07a *::before,
.wsd-07a *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07a {
--page: oklch(0.96 0.01 240);
--band: oklch(0.28 0.1 262);
--accent: oklch(0.8 0.16 92);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07a__above,
.wsd-07a__below {
background: var(--page);
color: oklch(0.36 0.03 240);
padding: 46px 24px;
text-align: center;
}
.wsd-07a__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07a__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(88px,12vw,140px) 24px 60px;
text-align: center;
}
.wsd-07a__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(56px,8vw,104px);
color: var(--page);
pointer-events: none;
}
.wsd-07a__wave--top {
top: -1px;
}
.wsd-07a__wave path {
fill: currentColor;
}
.wsd-07a__title {
font-size: clamp(25px,4vw,40px);
margin-bottom: 10px;
}
.wsd-07a__band .wsd-07a__copy {
opacity: .8;
max-width: 44ch;
margin: 0 auto;
}
.wsd-07a__cta {
display: inline-block;
margin-top: 20px;
font-size: 14.5px;
font-weight: 800;
color: oklch(0.24 0.08 262);
background: var(--accent);
padding: 13px 28px;
border-radius: 9999px;
text-decoration: none;
transition: transform .2s;
}
.wsd-07a__cta:hover {
transform: translateY(-2px);
}
.wsd-07a__cta:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.wsd-07b,
.wsd-07b *,
.wsd-07b *::before,
.wsd-07b *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07b {
--page: oklch(0.95 0.02 100);
--band: oklch(0.33 0.09 178);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07b__above,
.wsd-07b__below {
background: var(--page);
color: oklch(0.36 0.04 120);
padding: 42px 24px;
text-align: center;
}
.wsd-07b__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07b__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(80px,11vw,120px) 24px clamp(80px,11vw,120px);
text-align: center;
}
.wsd-07b__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(48px,7vw,86px);
color: var(--page);
pointer-events: none;
}
.wsd-07b__wave--top {
top: -1px;
}
.wsd-07b__wave--bottom {
bottom: -1px;
}
.wsd-07b__wave path {
fill: currentColor;
}
.wsd-07b__title {
font-size: clamp(24px,3.8vw,36px);
margin-bottom: 8px;
}
.wsd-07b__band .wsd-07b__copy {
opacity: .82;
max-width: 44ch;
margin: 0 auto;
}
```
## JavaScript
```js
/* No JavaScript — a page-coloured concave path on the band's top edge scoops inward, funnelling attention to the centred CTA. */
/* No JavaScript — mirrored concave paths on both edges pinch the band into a lens shape. */
```Here's a working CSS Wave Section Divider from CodeFronts. Use it as-is or adapt to your framework. All classes are scoped under a unique prefix so the code won't collide with your existing styles. MIT licensed.
Demo: Inverted curve SVG wave divider CSS
Source: https://codefronts.com/layouts/css-wave-section-dividers/inverted-curve-svg-wave-divider-css/
Concave dips that pull the eye downward into a CTA. Instead of the wave bulging outward, the edge scoops inward — a shape that visually funnels attention toward whatever sits at the pinch point, which is why conversion-focused pages use it around signup banners.
## HTML
```html
<div class="wsd-07-group">
<section class="wsd-07a">
<div class="wsd-07a__above"><p class="wsd-07a__copy">Features, proof, screenshots…</p></div>
<div class="wsd-07a__band">
<svg class="wsd-07a__wave wsd-07a__wave--top" viewBox="0 0 1440 110" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C360,0 420,110 720,110 C1020,110 1080,0 1440,0 L1440,0 L0,0 Z"></path></svg>
<h2 class="wsd-07a__title">Start your free trial</h2>
<p class="wsd-07a__copy">The curve funnels the eye to the centre — put the button there.</p>
<a class="wsd-07a__cta" href="#0">Create account</a>
</div>
<div class="wsd-07a__below"><p class="wsd-07a__copy">…and the page continues.</p></div>
</section>
<section class="wsd-07b">
<div class="wsd-07b__above"><p class="wsd-07b__copy">Section above</p></div>
<div class="wsd-07b__band">
<svg class="wsd-07b__wave wsd-07b__wave--top" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,0 C420,0 480,90 720,90 C960,90 1020,0 1440,0 Z"></path></svg>
<h2 class="wsd-07b__title">A lens for one idea</h2>
<p class="wsd-07b__copy">Curved on both edges, the band floats away from the grid.</p>
<svg class="wsd-07b__wave wsd-07b__wave--bottom" viewBox="0 0 1440 90" preserveAspectRatio="none" aria-hidden="true" focusable="false"><path d="M0,90 C420,90 480,0 720,0 C960,0 1020,90 1440,90 Z"></path></svg>
</div>
<div class="wsd-07b__below"><p class="wsd-07b__copy">Section below</p></div>
</section>
</div>
```
## CSS
```css
.wsd-07-group {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
gap: 0;
}
.wsd-07-group > section {
width: 100%;
}
.wsd-07a,
.wsd-07a *,
.wsd-07a *::before,
.wsd-07a *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07a {
--page: oklch(0.96 0.01 240);
--band: oklch(0.28 0.1 262);
--accent: oklch(0.8 0.16 92);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07a__above,
.wsd-07a__below {
background: var(--page);
color: oklch(0.36 0.03 240);
padding: 46px 24px;
text-align: center;
}
.wsd-07a__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07a__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(88px,12vw,140px) 24px 60px;
text-align: center;
}
.wsd-07a__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(56px,8vw,104px);
color: var(--page);
pointer-events: none;
}
.wsd-07a__wave--top {
top: -1px;
}
.wsd-07a__wave path {
fill: currentColor;
}
.wsd-07a__title {
font-size: clamp(25px,4vw,40px);
margin-bottom: 10px;
}
.wsd-07a__band .wsd-07a__copy {
opacity: .8;
max-width: 44ch;
margin: 0 auto;
}
.wsd-07a__cta {
display: inline-block;
margin-top: 20px;
font-size: 14.5px;
font-weight: 800;
color: oklch(0.24 0.08 262);
background: var(--accent);
padding: 13px 28px;
border-radius: 9999px;
text-decoration: none;
transition: transform .2s;
}
.wsd-07a__cta:hover {
transform: translateY(-2px);
}
.wsd-07a__cta:focus-visible {
outline: 3px solid #fff;
outline-offset: 3px;
}
.wsd-07b,
.wsd-07b *,
.wsd-07b *::before,
.wsd-07b *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.wsd-07b {
--page: oklch(0.95 0.02 100);
--band: oklch(0.33 0.09 178);
font-family: 'Segoe UI',system-ui,sans-serif;
}
.wsd-07b__above,
.wsd-07b__below {
background: var(--page);
color: oklch(0.36 0.04 120);
padding: 42px 24px;
text-align: center;
}
.wsd-07b__copy {
font-size: 15px;
opacity: .75;
}
.wsd-07b__band {
position: relative;
overflow: hidden;
background: var(--band);
color: #fff;
padding: clamp(80px,11vw,120px) 24px clamp(80px,11vw,120px);
text-align: center;
}
.wsd-07b__wave {
position: absolute;
left: 0;
display: block;
width: 100%;
height: clamp(48px,7vw,86px);
color: var(--page);
pointer-events: none;
}
.wsd-07b__wave--top {
top: -1px;
}
.wsd-07b__wave--bottom {
bottom: -1px;
}
.wsd-07b__wave path {
fill: currentColor;
}
.wsd-07b__title {
font-size: clamp(24px,3.8vw,36px);
margin-bottom: 8px;
}
.wsd-07b__band .wsd-07b__copy {
opacity: .82;
max-width: 44ch;
margin: 0 auto;
}
```
## JavaScript
```js
/* No JavaScript — a page-coloured concave path on the band's top edge scoops inward, funnelling attention to the centred CTA. */
/* No JavaScript — mirrored concave paths on both edges pinch the band into a lens shape. */
```How this works
An inverted curve is just a normal wave with its fill on the other side of the path. The quickest production route is to keep one authored path and flip it with transform: scaleY(-1), or set both a top and bottom wave on a band so the section becomes a lens shape.
.band__wave--top{top:-1px;transform:scaleY(-1)}
.band__wave--bottom{bottom:-1px}Because the deepest point of a concave curve is at the horizontal centre, place the CTA at the centre — the geometry and the visual hierarchy then agree, and the funnel effect is real rather than decorative.
Make it yours
- Move the pinch off-centre by editing the control points for an asymmetric funnel.
- Use a shallow dip (30–50px) for text bands, deep (120px+) for full CTA panels.
- Combine with a subtle inner shadow along the curve for a carved look.
- Add a top arch as well to turn the band into a lens/eye shape.
Gotchas — read before shipping
- Concave edges eat vertical space at the centre — add padding or the headline collides with the curve.
- Flipping with scaleY(-1) also flips gradients inside the SVG; define them accordingly.
- Watch contrast where the curve overlaps text on small screens.
- Do not nest two inverted curves at the same amplitude — the band pinches shut on mobile.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 15.4+ | 113+ | 111+ |
Floor set by oklch() as this demo is written. The core technique itself goes back further — Chrome 36+.
transform on SVG elements is universal; no fallback needed.