26 CSS Dividers18 / 26
Medieval Fantasy Star Crest Divider CSS
A heraldic divider for lore pages, RPG wikis and game sites: a four-point star sitting on tapered blades that narrow toward the ornament, with small counter-notches carved by clip-path. Everything is CSS shapes on a parchment surface, so it re-colours instantly between a dark grimoire theme and an aged-vellum one — no sprite sheet, no icon font.
Published Updated
The code
<section class="div-18" aria-label="Medieval fantasy star crest divider demo">
<div class="div-18__stage">
<div class="div-18__halo" aria-hidden="true"></div>
<p class="div-18__eyebrow">CHAPTER THE THIRD</p>
<h2 class="div-18__title">Of Rules & Ruin</h2>
<div class="div-18__crest" role="separator" aria-label="Chapter divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__starwrap" aria-hidden="true">
<span class="div-18__star div-18__star--back"></span>
<span class="div-18__star"></span>
</span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__body">And it was written that no section should end without its mark, lest the reader wander from one thought into the next and never notice the crossing.</p>
<div class="div-18__crest div-18__crest--sm" role="separator" aria-label="Divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__lozenge" aria-hidden="true"></span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__chip">clip-path blades · 4-point star polygon · 40s halo drift</p>
</div>
</section><section class="div-18" aria-label="Medieval fantasy star crest divider demo">
<div class="div-18__stage">
<div class="div-18__halo" aria-hidden="true"></div>
<p class="div-18__eyebrow">CHAPTER THE THIRD</p>
<h2 class="div-18__title">Of Rules & Ruin</h2>
<div class="div-18__crest" role="separator" aria-label="Chapter divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__starwrap" aria-hidden="true">
<span class="div-18__star div-18__star--back"></span>
<span class="div-18__star"></span>
</span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__body">And it was written that no section should end without its mark, lest the reader wander from one thought into the next and never notice the crossing.</p>
<div class="div-18__crest div-18__crest--sm" role="separator" aria-label="Divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__lozenge" aria-hidden="true"></span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__chip">clip-path blades · 4-point star polygon · 40s halo drift</p>
</div>
</section>.div-18 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
background: var(--div-18-bg);
--div-18-bg: oklch(0.19 0.018 60);
--div-18-ink: oklch(0.92 0.02 80);
--div-18-mut: oklch(0.68 0.03 78);
--div-18-gold: oklch(0.78 0.12 82);
font-family: Georgia,'Iowan Old Style','Times New Roman',serif;
color: var(--div-18-ink);
position: relative;
overflow: hidden;
}
.div-18 *,
.div-18 *::before,
.div-18 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.div-18__stage {
position: relative;
min-height: 100svh;
display: grid;
place-content: center;
justify-items: center;
gap: clamp(16px,3vw,26px);
text-align: center;
padding: clamp(30px,6vw,72px) clamp(20px,5vw,56px);
}
.div-18__halo {
position: absolute;
width: min(120vw,900px);
aspect-ratio: 1;
background: conic-gradient(from 0deg,oklch(0.78 0.12 82/.13),transparent 22%,oklch(0.78 0.12 82/.1) 50%,transparent 74%,oklch(0.78 0.12 82/.13));
border-radius: 50%;
filter: blur(28px);
animation: div-18-drift 40s linear infinite;
pointer-events: none;
}
@keyframes div-18-drift {
to {
rotate: 360deg;
}
}
.div-18__eyebrow {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 10.5px;
letter-spacing: .36em;
text-indent: .36em;
color: var(--div-18-gold);
}
.div-18__title {
font-size: clamp(32px,6.6vw,64px);
line-height: 1.04;
font-weight: 400;
letter-spacing: .01em;
}
.div-18__crest {
width: min(90vw,460px);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.div-18__crest--sm {
width: min(70vw,280px);
opacity: .72;
}
.div-18__blade {
flex: 1 1 0;
height: 11px;
background: linear-gradient(90deg,oklch(0.6 0.09 78),var(--div-18-gold));
clip-path: polygon(0 42%,86% 0,100% 50%,86% 100%,0 58%);
}
.div-18__blade--r {
scale: -1 1;
}
.div-18__crest--sm .div-18__blade {
height: 7px;
}
.div-18__starwrap {
position: relative;
width: 30px;
height: 30px;
flex: none;
filter: drop-shadow(0 0 12px oklch(0.78 0.12 82/.5));
}
.div-18__star {
position: absolute;
inset: 0;
background: var(--div-18-gold);
clip-path: polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.div-18__star--back {
rotate: 45deg;
scale: .62;
opacity: .85;
}
.div-18__lozenge {
width: 11px;
height: 11px;
flex: none;
background: var(--div-18-gold);
clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.div-18__body {
max-width: 50ch;
font-size: clamp(15px,1.95vw,18.5px);
line-height: 1.68;
color: var(--div-18-mut);
font-style: italic;
text-wrap: pretty;
}
.div-18__chip {
margin-top: 6px;
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11px;
color: var(--div-18-mut);
padding: 8px 14px;
border: 1px solid oklch(0.78 0.12 82/.3);
border-radius: 2px;
}
@media (prefers-reduced-motion: reduce) {
.div-18__halo {
animation: none;
}
}.div-18 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
background: var(--div-18-bg);
--div-18-bg: oklch(0.19 0.018 60);
--div-18-ink: oklch(0.92 0.02 80);
--div-18-mut: oklch(0.68 0.03 78);
--div-18-gold: oklch(0.78 0.12 82);
font-family: Georgia,'Iowan Old Style','Times New Roman',serif;
color: var(--div-18-ink);
position: relative;
overflow: hidden;
}
.div-18 *,
.div-18 *::before,
.div-18 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.div-18__stage {
position: relative;
min-height: 100svh;
display: grid;
place-content: center;
justify-items: center;
gap: clamp(16px,3vw,26px);
text-align: center;
padding: clamp(30px,6vw,72px) clamp(20px,5vw,56px);
}
.div-18__halo {
position: absolute;
width: min(120vw,900px);
aspect-ratio: 1;
background: conic-gradient(from 0deg,oklch(0.78 0.12 82/.13),transparent 22%,oklch(0.78 0.12 82/.1) 50%,transparent 74%,oklch(0.78 0.12 82/.13));
border-radius: 50%;
filter: blur(28px);
animation: div-18-drift 40s linear infinite;
pointer-events: none;
}
@keyframes div-18-drift {
to {
rotate: 360deg;
}
}
.div-18__eyebrow {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 10.5px;
letter-spacing: .36em;
text-indent: .36em;
color: var(--div-18-gold);
}
.div-18__title {
font-size: clamp(32px,6.6vw,64px);
line-height: 1.04;
font-weight: 400;
letter-spacing: .01em;
}
.div-18__crest {
width: min(90vw,460px);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.div-18__crest--sm {
width: min(70vw,280px);
opacity: .72;
}
.div-18__blade {
flex: 1 1 0;
height: 11px;
background: linear-gradient(90deg,oklch(0.6 0.09 78),var(--div-18-gold));
clip-path: polygon(0 42%,86% 0,100% 50%,86% 100%,0 58%);
}
.div-18__blade--r {
scale: -1 1;
}
.div-18__crest--sm .div-18__blade {
height: 7px;
}
.div-18__starwrap {
position: relative;
width: 30px;
height: 30px;
flex: none;
filter: drop-shadow(0 0 12px oklch(0.78 0.12 82/.5));
}
.div-18__star {
position: absolute;
inset: 0;
background: var(--div-18-gold);
clip-path: polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.div-18__star--back {
rotate: 45deg;
scale: .62;
opacity: .85;
}
.div-18__lozenge {
width: 11px;
height: 11px;
flex: none;
background: var(--div-18-gold);
clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.div-18__body {
max-width: 50ch;
font-size: clamp(15px,1.95vw,18.5px);
line-height: 1.68;
color: var(--div-18-mut);
font-style: italic;
text-wrap: pretty;
}
.div-18__chip {
margin-top: 6px;
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11px;
color: var(--div-18-mut);
padding: 8px 14px;
border: 1px solid oklch(0.78 0.12 82/.3);
border-radius: 2px;
}
@media (prefers-reduced-motion: reduce) {
.div-18__halo {
animation: none;
}
}Here's a working CSS 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: Medieval Fantasy Star Crest Divider CSS
Source: https://codefronts.com/snippets/css-dividers/fantasy-dividers/
A heraldic divider for lore pages, RPG wikis and game sites: a four-point star sitting on tapered blades that narrow toward the ornament, with small counter-notches carved by clip-path. Everything is CSS shapes on a parchment surface, so it re-colours instantly between a dark grimoire theme and an aged-vellum one — no sprite sheet, no icon font.
## HTML
```html
<section class="div-18" aria-label="Medieval fantasy star crest divider demo">
<div class="div-18__stage">
<div class="div-18__halo" aria-hidden="true"></div>
<p class="div-18__eyebrow">CHAPTER THE THIRD</p>
<h2 class="div-18__title">Of Rules & Ruin</h2>
<div class="div-18__crest" role="separator" aria-label="Chapter divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__starwrap" aria-hidden="true">
<span class="div-18__star div-18__star--back"></span>
<span class="div-18__star"></span>
</span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__body">And it was written that no section should end without its mark, lest the reader wander from one thought into the next and never notice the crossing.</p>
<div class="div-18__crest div-18__crest--sm" role="separator" aria-label="Divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__lozenge" aria-hidden="true"></span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__chip">clip-path blades · 4-point star polygon · 40s halo drift</p>
</div>
</section>
```
## CSS
```css
.div-18 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
background: var(--div-18-bg);
--div-18-bg: oklch(0.19 0.018 60);
--div-18-ink: oklch(0.92 0.02 80);
--div-18-mut: oklch(0.68 0.03 78);
--div-18-gold: oklch(0.78 0.12 82);
font-family: Georgia,'Iowan Old Style','Times New Roman',serif;
color: var(--div-18-ink);
position: relative;
overflow: hidden;
}
.div-18 *,
.div-18 *::before,
.div-18 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.div-18__stage {
position: relative;
min-height: 100svh;
display: grid;
place-content: center;
justify-items: center;
gap: clamp(16px,3vw,26px);
text-align: center;
padding: clamp(30px,6vw,72px) clamp(20px,5vw,56px);
}
.div-18__halo {
position: absolute;
width: min(120vw,900px);
aspect-ratio: 1;
background: conic-gradient(from 0deg,oklch(0.78 0.12 82/.13),transparent 22%,oklch(0.78 0.12 82/.1) 50%,transparent 74%,oklch(0.78 0.12 82/.13));
border-radius: 50%;
filter: blur(28px);
animation: div-18-drift 40s linear infinite;
pointer-events: none;
}
@keyframes div-18-drift {
to {
rotate: 360deg;
}
}
.div-18__eyebrow {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 10.5px;
letter-spacing: .36em;
text-indent: .36em;
color: var(--div-18-gold);
}
.div-18__title {
font-size: clamp(32px,6.6vw,64px);
line-height: 1.04;
font-weight: 400;
letter-spacing: .01em;
}
.div-18__crest {
width: min(90vw,460px);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.div-18__crest--sm {
width: min(70vw,280px);
opacity: .72;
}
.div-18__blade {
flex: 1 1 0;
height: 11px;
background: linear-gradient(90deg,oklch(0.6 0.09 78),var(--div-18-gold));
clip-path: polygon(0 42%,86% 0,100% 50%,86% 100%,0 58%);
}
.div-18__blade--r {
scale: -1 1;
}
.div-18__crest--sm .div-18__blade {
height: 7px;
}
.div-18__starwrap {
position: relative;
width: 30px;
height: 30px;
flex: none;
filter: drop-shadow(0 0 12px oklch(0.78 0.12 82/.5));
}
.div-18__star {
position: absolute;
inset: 0;
background: var(--div-18-gold);
clip-path: polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.div-18__star--back {
rotate: 45deg;
scale: .62;
opacity: .85;
}
.div-18__lozenge {
width: 11px;
height: 11px;
flex: none;
background: var(--div-18-gold);
clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.div-18__body {
max-width: 50ch;
font-size: clamp(15px,1.95vw,18.5px);
line-height: 1.68;
color: var(--div-18-mut);
font-style: italic;
text-wrap: pretty;
}
.div-18__chip {
margin-top: 6px;
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11px;
color: var(--div-18-mut);
padding: 8px 14px;
border: 1px solid oklch(0.78 0.12 82/.3);
border-radius: 2px;
}
@media (prefers-reduced-motion: reduce) {
.div-18__halo {
animation: none;
}
}
```Here's a working CSS 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: Medieval Fantasy Star Crest Divider CSS
Source: https://codefronts.com/snippets/css-dividers/fantasy-dividers/
A heraldic divider for lore pages, RPG wikis and game sites: a four-point star sitting on tapered blades that narrow toward the ornament, with small counter-notches carved by clip-path. Everything is CSS shapes on a parchment surface, so it re-colours instantly between a dark grimoire theme and an aged-vellum one — no sprite sheet, no icon font.
## HTML
```html
<section class="div-18" aria-label="Medieval fantasy star crest divider demo">
<div class="div-18__stage">
<div class="div-18__halo" aria-hidden="true"></div>
<p class="div-18__eyebrow">CHAPTER THE THIRD</p>
<h2 class="div-18__title">Of Rules & Ruin</h2>
<div class="div-18__crest" role="separator" aria-label="Chapter divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__starwrap" aria-hidden="true">
<span class="div-18__star div-18__star--back"></span>
<span class="div-18__star"></span>
</span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__body">And it was written that no section should end without its mark, lest the reader wander from one thought into the next and never notice the crossing.</p>
<div class="div-18__crest div-18__crest--sm" role="separator" aria-label="Divider">
<span class="div-18__blade" aria-hidden="true"></span>
<span class="div-18__lozenge" aria-hidden="true"></span>
<span class="div-18__blade div-18__blade--r" aria-hidden="true"></span>
</div>
<p class="div-18__chip">clip-path blades · 4-point star polygon · 40s halo drift</p>
</div>
</section>
```
## CSS
```css
.div-18 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
background: var(--div-18-bg);
--div-18-bg: oklch(0.19 0.018 60);
--div-18-ink: oklch(0.92 0.02 80);
--div-18-mut: oklch(0.68 0.03 78);
--div-18-gold: oklch(0.78 0.12 82);
font-family: Georgia,'Iowan Old Style','Times New Roman',serif;
color: var(--div-18-ink);
position: relative;
overflow: hidden;
}
.div-18 *,
.div-18 *::before,
.div-18 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.div-18__stage {
position: relative;
min-height: 100svh;
display: grid;
place-content: center;
justify-items: center;
gap: clamp(16px,3vw,26px);
text-align: center;
padding: clamp(30px,6vw,72px) clamp(20px,5vw,56px);
}
.div-18__halo {
position: absolute;
width: min(120vw,900px);
aspect-ratio: 1;
background: conic-gradient(from 0deg,oklch(0.78 0.12 82/.13),transparent 22%,oklch(0.78 0.12 82/.1) 50%,transparent 74%,oklch(0.78 0.12 82/.13));
border-radius: 50%;
filter: blur(28px);
animation: div-18-drift 40s linear infinite;
pointer-events: none;
}
@keyframes div-18-drift {
to {
rotate: 360deg;
}
}
.div-18__eyebrow {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 10.5px;
letter-spacing: .36em;
text-indent: .36em;
color: var(--div-18-gold);
}
.div-18__title {
font-size: clamp(32px,6.6vw,64px);
line-height: 1.04;
font-weight: 400;
letter-spacing: .01em;
}
.div-18__crest {
width: min(90vw,460px);
display: flex;
align-items: center;
justify-content: center;
gap: 12px;
}
.div-18__crest--sm {
width: min(70vw,280px);
opacity: .72;
}
.div-18__blade {
flex: 1 1 0;
height: 11px;
background: linear-gradient(90deg,oklch(0.6 0.09 78),var(--div-18-gold));
clip-path: polygon(0 42%,86% 0,100% 50%,86% 100%,0 58%);
}
.div-18__blade--r {
scale: -1 1;
}
.div-18__crest--sm .div-18__blade {
height: 7px;
}
.div-18__starwrap {
position: relative;
width: 30px;
height: 30px;
flex: none;
filter: drop-shadow(0 0 12px oklch(0.78 0.12 82/.5));
}
.div-18__star {
position: absolute;
inset: 0;
background: var(--div-18-gold);
clip-path: polygon(50% 0,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0 50%,40% 40%);
}
.div-18__star--back {
rotate: 45deg;
scale: .62;
opacity: .85;
}
.div-18__lozenge {
width: 11px;
height: 11px;
flex: none;
background: var(--div-18-gold);
clip-path: polygon(50% 0,100% 50%,50% 100%,0 50%);
}
.div-18__body {
max-width: 50ch;
font-size: clamp(15px,1.95vw,18.5px);
line-height: 1.68;
color: var(--div-18-mut);
font-style: italic;
text-wrap: pretty;
}
.div-18__chip {
margin-top: 6px;
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11px;
color: var(--div-18-mut);
padding: 8px 14px;
border: 1px solid oklch(0.78 0.12 82/.3);
border-radius: 2px;
}
@media (prefers-reduced-motion: reduce) {
.div-18__halo {
animation: none;
}
}
```How this works
A tapered blade is a rectangle with two of its corners pulled inward:
.blade{ flex:1; height:10px; background:var(--gold);
clip-path:polygon(0 42%, 86% 0, 100% 50%, 86% 100%, 0 58%); }
.blade--right{ scale:-1 1 }Read the polygon left to right: it starts thin at the outer edge (42%→58% of the height), swells to full height at 86%, then comes to a point at the ornament end. That silhouette — thin, swell, point — is the heraldic vocabulary; a plain rectangle with a diamond stuck on it reads as clip art.
The four-point star is one square with a concave clip:
.star{ width:26px; aspect-ratio:1; background:var(--gold);
clip-path:polygon(50% 0,60% 40%,100% 50%,60% 60%,
50% 100%,40% 60%,0 50%,40% 40%); }The 40/60 inner points control how needle-like the star is: pull them to 46/54 and you get a sharp compass star; push to 34/66 and you get a plump gem. Rotating a duplicate by 45° at 45% scale behind it gives the classic eight-point heraldic burst for free.
A very slow rotation on the background halo — 40 seconds per turn — adds candlelight without any of the noise a fast animation would bring to a page of body text.
Make it yours
- Eight-point star: duplicate the star element with
rotate:45deg; scale:.62behind it. Same polygon, no new geometry. - Blade taper: raise the 86% swell point to 94% for a longer, more elegant blade; drop to 70% for a stubby, Norse feel.
- Theme: gold-on-charcoal for a grimoire, ink-on-vellum (swap --gold for oklch(0.36 0.05 55) and the background for oklch(0.93 0.03 85)) for a map or codex.
- Chapter numeral: replace the star with a Roman numeral in a serif face at
letter-spacing:.2emand keep the blades — instant chapter-heading divider.
Gotchas — read before shipping
clip-pathremoves box-shadow entirely. To make the ornament glow, put the shadow on a parent wrapper or usefilter:drop-shadow(), which follows the clipped silhouette.- Percentage polygon points resolve against the element's box, so a blade that stretches gets a shallower taper. Cap the blade with
max-widthif you need a constant angle. - Mirroring with
scale:-1 1also mirrors any text or gradient inside; keep blades empty and put gradients at an angle that reads correctly both ways. - Ornate dividers are decoration. Keep them aria-hidden inside a wrapper carrying role="separator" so screen-reader users get 'separator', not a description of the artwork.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 114+ | 17.5+ | 121+ | 114+ |
Floor set by oklch(), text-wrap as this demo is written. The core technique itself goes back further — Chrome 111+.
clip-path:polygon() — Chrome 55, Safari 9.1, Firefox 54. The individual scale/rotate transform properties need Chrome 104 / Safari 14.1 / Firefox 72; transform: shorthand works everywhere.