15 / 32
All 32 in 32 CSS Accordions — Vertical & Horizontal
- 01Pure CSS FAQ Accordion with <details> and <summary> (No JavaScript)
- 02Mobile Navigation Accordion Menu (CSS-Only Hamburger + Drill-Down)
- 03E-commerce Filter Sidebar Accordion with Exclusive Open (Product Filters)
- 04Nested Multi-Level Accordion (CSS Tree View for Docs & File Explorers)
- 05Smoothly Animated <details> Accordion — Transition height: auto in Pure CSS
- 06Exclusive Single-Open Accordion with the details name Attribute (Close Others Automatically)
- 07Underline Reveal Accordion — Editorial Minimal with Animated Rules
- 08Numbered Steps Accordion — Process Timeline for Onboarding Flows
- 09Plus / Minus Morph Accordion — CSS-Drawn Icon Animation
- 10Chevron Rotate Card Accordion — The Production Default, Perfected
- 11Brutalist Stamp Accordion — Bold Borders, Hard Shadows, Zero Subtlety
- 12Glassmorphism Frosted Accordion with backdrop-filter Blur
- 13Minimal Rail Accordion — Timeline Dot Spine for Changelogs & Roadmaps
- 14Card Lift Accordion — Elevation & Scale on Open (Material-Style Depth)
- 15Diagonal Slant Accordion — Skewed Parallelogram Headers
- 16Stepped Stair Accordion — Indented Cascade with Depth Levels
- 17Circular Dial Accordion — Conic-Gradient Progress Ring Toggles
- 18Marquee Header Accordion — Scrolling Ticker Titles on the Open Item
- 19Code Comment Accordion — Editor-Themed Collapsible Doc Blocks
- 20Paper Fold 3D Accordion — perspective + rotateX Unfolding Panels
- 21Equalizer Accordion — Animated Level Bars for Playlists & Audio
- 22Stacked Cards Deck Accordion — Overlapping Pull-Out Hand
- 23Holographic Slot Accordion — @property Rotating Border Sheen
- 24Aurora Drift Accordion — Dark Ambient Glow that Follows the Open Item
- 25Horizontal Strip Tabs Accordion — Vertical Text Columns with flex-grow
- 26Horizontal Image Reveal Accordion — Expanding Photo Gallery Panels
- 27Color Block Horizontal Accordion — Bold Flat Panels for Feature Sections
- 28Numbered Spine Horizontal Accordion — Editorial Magazine Index
- 29Curtain Slide Horizontal Accordion — clip-path Reveal Panels
- 30Vinyl Spine Horizontal Accordion — Record Shelf with Pull-Out Sleeves
- 31Cinema Reel Horizontal Accordion — Dark Letterboxed Showcase
- 32Aurora Strip Horizontal Accordion — Animated Gradient Glow Panels
Diagonal Slant Accordion — Skewed Parallelogram Headers
Headers as racing stripes: every summary is a parallelogram skewed −6°, stacked with alternating offsets so the closed accordion reads as a dynamic diagonal composition. Opening un-skews the active stripe back to square while its body slides out beneath — geometry itself is the state indicator. Built for sports, esports and event brands.
Build interactive UI like this from scratch: 20 HTML, CSS & JavaScript projects
ZTM · JavaScript Web Projects · 30‑day money-back guarantee · Affiliate link
The code
<section class="acc-23" aria-label="Diagonal slant accordion demo">
<div class="acc-23__wrap">
<h3 class="acc-23__title">Match day guide</h3>
<details class="acc-23__item" style="--c:oklch(0.62 0.22 25)" open>
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Tickets & entry<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Gates open 90 minutes before kickoff. Digital tickets only — add yours to your wallet before you reach the ground; signal drops in the crowd.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.75 0.16 85)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Getting there<i>»</i></span></span></summary>
<div class="acc-23__body"><p>The stadium loop bus runs every 6 minutes from Central. Cycling? Two thousand racks at the north gate, free and staffed.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.6 0.15 250)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Food & drink<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Twelve local vendors on the concourse. Refillable cups save you a dollar a pour — taps at every block entrance.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.55 0.18 145)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Accessibility<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Step-free routes from every gate, sensory kits at guest services, and audio-descriptive commentary on channel 3 of the stadium app.</p></div>
</details>
</div>
</section><section class="acc-23" aria-label="Diagonal slant accordion demo">
<div class="acc-23__wrap">
<h3 class="acc-23__title">Match day guide</h3>
<details class="acc-23__item" style="--c:oklch(0.62 0.22 25)" open>
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Tickets & entry<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Gates open 90 minutes before kickoff. Digital tickets only — add yours to your wallet before you reach the ground; signal drops in the crowd.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.75 0.16 85)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Getting there<i>»</i></span></span></summary>
<div class="acc-23__body"><p>The stadium loop bus runs every 6 minutes from Central. Cycling? Two thousand racks at the north gate, free and staffed.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.6 0.15 250)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Food & drink<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Twelve local vendors on the concourse. Refillable cups save you a dollar a pour — taps at every block entrance.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.55 0.18 145)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Accessibility<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Step-free routes from every gate, sensory kits at guest services, and audio-descriptive commentary on channel 3 of the stadium app.</p></div>
</details>
</div>
</section>.acc-23,
.acc-23 *,
.acc-23 *::before,
.acc-23 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.acc-23 {
--ink: #15161c;
font-family: 'Segoe UI',system-ui,sans-serif;
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #eceef2;
padding: 44px 32px;
}
.acc-23__wrap {
width: min(560px,100%);
padding: 0 24px;
}
.acc-23__title {
font-size: 26px;
font-weight: 850;
color: var(--ink);
letter-spacing: -.02em;
text-transform: uppercase;
font-style: italic;
margin-bottom: 20px;
}
.acc-23__item {
margin-bottom: 14px;
}
.acc-23__item:nth-child(odd of .acc-23__item) .acc-23__box {
translate: 10px 0;
}
.acc-23__item:nth-child(even of .acc-23__item) .acc-23__box {
translate: -10px 0;
}
.acc-23__sum {
list-style: none;
cursor: pointer;
display: block;
}
.acc-23__sum::-webkit-details-marker {
display: none;
}
.acc-23__sum::marker {
content: "";
}
.acc-23__box {
display: block;
background: var(--c);
box-shadow: 5px 5px 0 color-mix(in oklab,var(--c) 45%,#000);
transform: skewX(-6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1),translate .35s cubic-bezier(.3,1.2,.4,1),box-shadow .35s;
}
.acc-23__item[open] .acc-23__box {
transform: skewX(0);
translate: 0 0;
box-shadow: 0 5px 0 color-mix(in oklab,var(--c) 45%,#000);
}
.acc-23__sum:hover .acc-23__box {
filter: brightness(1.05);
}
.acc-23__text {
display: flex;
align-items: center;
gap: 12px;
min-height: 56px;
padding: 8px 22px;
font-size: 16px;
font-weight: 800;
letter-spacing: .04em;
text-transform: uppercase;
color: #fff;
transform: skewX(6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1);
}
.acc-23__item[open] .acc-23__text {
transform: skewX(0);
}
.acc-23__text i {
font-style: normal;
margin-left: auto;
transition: rotate .3s;
}
.acc-23__item[open] .acc-23__text i {
rotate: 90deg;
}
.acc-23__body {
padding: 16px 24px 6px;
font-size: 14.5px;
line-height: 1.65;
color: #3c4152;
}
.acc-23__item[open] .acc-23__body {
animation: acc-23-in .35s ease-out;
}
@keyframes acc-23-in {
from {
opacity: 0;
translate: 0 -6px;
}
to {
opacity: 1;
translate: 0 0;
}
}
.acc-23__sum:focus-visible {
outline: 3px solid var(--ink);
outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
.acc-23__box,
.acc-23__text,
.acc-23__text i {
transition: none;
}
.acc-23__item[open] .acc-23__body {
animation: none;
}
}.acc-23,
.acc-23 *,
.acc-23 *::before,
.acc-23 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.acc-23 {
--ink: #15161c;
font-family: 'Segoe UI',system-ui,sans-serif;
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #eceef2;
padding: 44px 32px;
}
.acc-23__wrap {
width: min(560px,100%);
padding: 0 24px;
}
.acc-23__title {
font-size: 26px;
font-weight: 850;
color: var(--ink);
letter-spacing: -.02em;
text-transform: uppercase;
font-style: italic;
margin-bottom: 20px;
}
.acc-23__item {
margin-bottom: 14px;
}
.acc-23__item:nth-child(odd of .acc-23__item) .acc-23__box {
translate: 10px 0;
}
.acc-23__item:nth-child(even of .acc-23__item) .acc-23__box {
translate: -10px 0;
}
.acc-23__sum {
list-style: none;
cursor: pointer;
display: block;
}
.acc-23__sum::-webkit-details-marker {
display: none;
}
.acc-23__sum::marker {
content: "";
}
.acc-23__box {
display: block;
background: var(--c);
box-shadow: 5px 5px 0 color-mix(in oklab,var(--c) 45%,#000);
transform: skewX(-6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1),translate .35s cubic-bezier(.3,1.2,.4,1),box-shadow .35s;
}
.acc-23__item[open] .acc-23__box {
transform: skewX(0);
translate: 0 0;
box-shadow: 0 5px 0 color-mix(in oklab,var(--c) 45%,#000);
}
.acc-23__sum:hover .acc-23__box {
filter: brightness(1.05);
}
.acc-23__text {
display: flex;
align-items: center;
gap: 12px;
min-height: 56px;
padding: 8px 22px;
font-size: 16px;
font-weight: 800;
letter-spacing: .04em;
text-transform: uppercase;
color: #fff;
transform: skewX(6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1);
}
.acc-23__item[open] .acc-23__text {
transform: skewX(0);
}
.acc-23__text i {
font-style: normal;
margin-left: auto;
transition: rotate .3s;
}
.acc-23__item[open] .acc-23__text i {
rotate: 90deg;
}
.acc-23__body {
padding: 16px 24px 6px;
font-size: 14.5px;
line-height: 1.65;
color: #3c4152;
}
.acc-23__item[open] .acc-23__body {
animation: acc-23-in .35s ease-out;
}
@keyframes acc-23-in {
from {
opacity: 0;
translate: 0 -6px;
}
to {
opacity: 1;
translate: 0 0;
}
}
.acc-23__sum:focus-visible {
outline: 3px solid var(--ink);
outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
.acc-23__box,
.acc-23__text,
.acc-23__text i {
transition: none;
}
.acc-23__item[open] .acc-23__body {
animation: none;
}
}/* No JavaScript — headers are skewX(-6deg) boxes with +6deg counter-skewed text; details[open] transitions both to 0 so the stripe squares up as its body opens. */
/* No JavaScript — headers are skewX(-6deg) boxes with +6deg counter-skewed text; details[open] transitions both to 0 so the stripe squares up as its body opens. */Here's a working CSS Accordions — Vertical & Horizontal 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: Diagonal Slant Accordion — Skewed Parallelogram Headers
Source: https://codefronts.com/navigation/css-accordions/diagonal-slant/
Headers as racing stripes: every summary is a parallelogram skewed −6°, stacked with alternating offsets so the closed accordion reads as a dynamic diagonal composition. Opening un-skews the active stripe back to square while its body slides out beneath — geometry itself is the state indicator. Built for sports, esports and event brands.
## HTML
```html
<section class="acc-23" aria-label="Diagonal slant accordion demo">
<div class="acc-23__wrap">
<h3 class="acc-23__title">Match day guide</h3>
<details class="acc-23__item" style="--c:oklch(0.62 0.22 25)" open>
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Tickets & entry<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Gates open 90 minutes before kickoff. Digital tickets only — add yours to your wallet before you reach the ground; signal drops in the crowd.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.75 0.16 85)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Getting there<i>»</i></span></span></summary>
<div class="acc-23__body"><p>The stadium loop bus runs every 6 minutes from Central. Cycling? Two thousand racks at the north gate, free and staffed.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.6 0.15 250)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Food & drink<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Twelve local vendors on the concourse. Refillable cups save you a dollar a pour — taps at every block entrance.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.55 0.18 145)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Accessibility<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Step-free routes from every gate, sensory kits at guest services, and audio-descriptive commentary on channel 3 of the stadium app.</p></div>
</details>
</div>
</section>
```
## CSS
```css
.acc-23,
.acc-23 *,
.acc-23 *::before,
.acc-23 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.acc-23 {
--ink: #15161c;
font-family: 'Segoe UI',system-ui,sans-serif;
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #eceef2;
padding: 44px 32px;
}
.acc-23__wrap {
width: min(560px,100%);
padding: 0 24px;
}
.acc-23__title {
font-size: 26px;
font-weight: 850;
color: var(--ink);
letter-spacing: -.02em;
text-transform: uppercase;
font-style: italic;
margin-bottom: 20px;
}
.acc-23__item {
margin-bottom: 14px;
}
.acc-23__item:nth-child(odd of .acc-23__item) .acc-23__box {
translate: 10px 0;
}
.acc-23__item:nth-child(even of .acc-23__item) .acc-23__box {
translate: -10px 0;
}
.acc-23__sum {
list-style: none;
cursor: pointer;
display: block;
}
.acc-23__sum::-webkit-details-marker {
display: none;
}
.acc-23__sum::marker {
content: "";
}
.acc-23__box {
display: block;
background: var(--c);
box-shadow: 5px 5px 0 color-mix(in oklab,var(--c) 45%,#000);
transform: skewX(-6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1),translate .35s cubic-bezier(.3,1.2,.4,1),box-shadow .35s;
}
.acc-23__item[open] .acc-23__box {
transform: skewX(0);
translate: 0 0;
box-shadow: 0 5px 0 color-mix(in oklab,var(--c) 45%,#000);
}
.acc-23__sum:hover .acc-23__box {
filter: brightness(1.05);
}
.acc-23__text {
display: flex;
align-items: center;
gap: 12px;
min-height: 56px;
padding: 8px 22px;
font-size: 16px;
font-weight: 800;
letter-spacing: .04em;
text-transform: uppercase;
color: #fff;
transform: skewX(6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1);
}
.acc-23__item[open] .acc-23__text {
transform: skewX(0);
}
.acc-23__text i {
font-style: normal;
margin-left: auto;
transition: rotate .3s;
}
.acc-23__item[open] .acc-23__text i {
rotate: 90deg;
}
.acc-23__body {
padding: 16px 24px 6px;
font-size: 14.5px;
line-height: 1.65;
color: #3c4152;
}
.acc-23__item[open] .acc-23__body {
animation: acc-23-in .35s ease-out;
}
@keyframes acc-23-in {
from {
opacity: 0;
translate: 0 -6px;
}
to {
opacity: 1;
translate: 0 0;
}
}
.acc-23__sum:focus-visible {
outline: 3px solid var(--ink);
outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
.acc-23__box,
.acc-23__text,
.acc-23__text i {
transition: none;
}
.acc-23__item[open] .acc-23__body {
animation: none;
}
}
```
## JavaScript
```js
/* No JavaScript — headers are skewX(-6deg) boxes with +6deg counter-skewed text; details[open] transitions both to 0 so the stripe squares up as its body opens. */
```Here's a working CSS Accordions — Vertical & Horizontal 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: Diagonal Slant Accordion — Skewed Parallelogram Headers
Source: https://codefronts.com/navigation/css-accordions/diagonal-slant/
Headers as racing stripes: every summary is a parallelogram skewed −6°, stacked with alternating offsets so the closed accordion reads as a dynamic diagonal composition. Opening un-skews the active stripe back to square while its body slides out beneath — geometry itself is the state indicator. Built for sports, esports and event brands.
## HTML
```html
<section class="acc-23" aria-label="Diagonal slant accordion demo">
<div class="acc-23__wrap">
<h3 class="acc-23__title">Match day guide</h3>
<details class="acc-23__item" style="--c:oklch(0.62 0.22 25)" open>
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Tickets & entry<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Gates open 90 minutes before kickoff. Digital tickets only — add yours to your wallet before you reach the ground; signal drops in the crowd.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.75 0.16 85)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Getting there<i>»</i></span></span></summary>
<div class="acc-23__body"><p>The stadium loop bus runs every 6 minutes from Central. Cycling? Two thousand racks at the north gate, free and staffed.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.6 0.15 250)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Food & drink<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Twelve local vendors on the concourse. Refillable cups save you a dollar a pour — taps at every block entrance.</p></div>
</details>
<details class="acc-23__item" style="--c:oklch(0.55 0.18 145)">
<summary class="acc-23__sum"><span class="acc-23__box"><span class="acc-23__text">Accessibility<i>»</i></span></span></summary>
<div class="acc-23__body"><p>Step-free routes from every gate, sensory kits at guest services, and audio-descriptive commentary on channel 3 of the stadium app.</p></div>
</details>
</div>
</section>
```
## CSS
```css
.acc-23,
.acc-23 *,
.acc-23 *::before,
.acc-23 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.acc-23 {
--ink: #15161c;
font-family: 'Segoe UI',system-ui,sans-serif;
width: 100%;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: #eceef2;
padding: 44px 32px;
}
.acc-23__wrap {
width: min(560px,100%);
padding: 0 24px;
}
.acc-23__title {
font-size: 26px;
font-weight: 850;
color: var(--ink);
letter-spacing: -.02em;
text-transform: uppercase;
font-style: italic;
margin-bottom: 20px;
}
.acc-23__item {
margin-bottom: 14px;
}
.acc-23__item:nth-child(odd of .acc-23__item) .acc-23__box {
translate: 10px 0;
}
.acc-23__item:nth-child(even of .acc-23__item) .acc-23__box {
translate: -10px 0;
}
.acc-23__sum {
list-style: none;
cursor: pointer;
display: block;
}
.acc-23__sum::-webkit-details-marker {
display: none;
}
.acc-23__sum::marker {
content: "";
}
.acc-23__box {
display: block;
background: var(--c);
box-shadow: 5px 5px 0 color-mix(in oklab,var(--c) 45%,#000);
transform: skewX(-6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1),translate .35s cubic-bezier(.3,1.2,.4,1),box-shadow .35s;
}
.acc-23__item[open] .acc-23__box {
transform: skewX(0);
translate: 0 0;
box-shadow: 0 5px 0 color-mix(in oklab,var(--c) 45%,#000);
}
.acc-23__sum:hover .acc-23__box {
filter: brightness(1.05);
}
.acc-23__text {
display: flex;
align-items: center;
gap: 12px;
min-height: 56px;
padding: 8px 22px;
font-size: 16px;
font-weight: 800;
letter-spacing: .04em;
text-transform: uppercase;
color: #fff;
transform: skewX(6deg);
transition: transform .35s cubic-bezier(.3,1.2,.4,1);
}
.acc-23__item[open] .acc-23__text {
transform: skewX(0);
}
.acc-23__text i {
font-style: normal;
margin-left: auto;
transition: rotate .3s;
}
.acc-23__item[open] .acc-23__text i {
rotate: 90deg;
}
.acc-23__body {
padding: 16px 24px 6px;
font-size: 14.5px;
line-height: 1.65;
color: #3c4152;
}
.acc-23__item[open] .acc-23__body {
animation: acc-23-in .35s ease-out;
}
@keyframes acc-23-in {
from {
opacity: 0;
translate: 0 -6px;
}
to {
opacity: 1;
translate: 0 0;
}
}
.acc-23__sum:focus-visible {
outline: 3px solid var(--ink);
outline-offset: 4px;
}
@media (prefers-reduced-motion: reduce) {
.acc-23__box,
.acc-23__text,
.acc-23__text i {
transition: none;
}
.acc-23__item[open] .acc-23__body {
animation: none;
}
}
```
## JavaScript
```js
/* No JavaScript — headers are skewX(-6deg) boxes with +6deg counter-skewed text; details[open] transitions both to 0 so the stripe squares up as its body opens. */
```How this works
Each summary wrapper is transform: skewX(-6deg) with the text counter-skewed +6deg inside (the classic pair — skew the box, unskew the content so type stays upright). Alternating items get opposite horizontal offsets, creating the zigzag stack. On open, the stripe transitions to skewX(0) and full width: the shape-change IS the open indicator, no icon needed — though a small » glyph rides along for redundancy.
The body panel below stays rectangular (content never sits in a skewed box — reading skewed text is misery) and slides open with the standard entrance keyframe. A hard 4px shadow under each stripe in the item's own hue keeps the composition graphic rather than material.
Techniques used: skewX box + counter-skew content pairing · shape-as-state (skew→square transition on open) · alternating translate offsets for the zigzag stack · per-item hue tokens with hard offset shadows · rectangular reading surface discipline
Make it yours
- Slant angle = the paired ±6deg values (keep them equal-opposite).
- Zigzag spread = the alternating translate offsets.
- Item hues = per-item --c custom properties.
- Set all offsets to 0 for a straight skewed stack — still striking.
Gotchas — read before shipping
- ALWAYS counter-skew the label text — text inside a skewed box without the inverse transform is illegible and fails readability for dyslexic users.
- Keep body content in an unskewed rectangle; only headers get geometry.
- Skewed boxes overflow their layout box horizontally — pad the container (24px here) or stripes clip at the edges.
- The skew→square morph needs transform transitions on BOTH box and inner text or the label wobbles.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 111+ | 16.2+ | 113+ | 111+ |
Floor set by oklch(), color-mix() as this demo is written. The core technique itself goes back further — Chrome all.
2D transforms — baseline everywhere, no fallback needed.