90s Grunge Design Reference
90s Grunge is the raw, anti-establishment visual aesthetic born from the Seattle alternative music scene of the early-to-mid 1990s. Rooted in the flannel-wearing, thrift-store culture of bands like Nirvana, Pearl Jam, Soundgarden, and Alice in Chains, it translates the movement's rejection of mainstream polish into a design language defined by distressed textures, hand-scrawled typography, dark muted earth tones, photocopy artifacts, and deliberate imperfection. Influenced heavily by David Carson's deconstructed layouts in Ray Gun magazine and the wider zine culture of the era, 90s Grunge treats design as emotional expression rather than clean communication. In web and UI design, this aesthetic manifests through noise/grain overlays, torn paper edges, collage-style layouts, irregular typography, and a pervasive sense that the interface was assembled by hand with scissors, glue, and a broken photocopier. Unlike its descendant Corporate Grunge -- which adopted grunge textures within rigid corporate layouts -- authentic 90s Grunge is genuinely chaotic, rejecting the grid entirely in favor of raw visual energy and analog authenticity.
Visual Characteristics
Core Design Traits
- Distressed and torn textures -- ripped paper, fraying fabric, crumpled surfaces, and worn-out materials that look physically handled and degraded
- Xerox/photocopy artifacts -- high-contrast black-and-white imagery with toner bleed, registration errors, white speckle, and crushed midtones from repeated photocopying
- Film grain and noise -- heavy granular noise overlays on backgrounds and images, simulating analog film stock or lo-fi photography
- Hand-scrawled typography -- handwritten text, marker lettering, scratchy ink, and typewriter output that rejects digital precision
- Flannel and plaid patterns -- the signature textile of grunge fashion, translated into background textures and decorative elements
- Collage and layered compositions -- overlapping images, text, and textures piled on top of each other like a physical cut-and-paste assembly
- Ink splatter and paint drips -- accidental-looking marks, smudges, coffee stains, and spray-paint overspray suggesting chaotic analog production
- Dark, moody atmosphere -- heavy shadows, low-key lighting references, and an overall sense of brooding introspection
- Halftone dot patterns -- coarse, visible dot screens from cheap printing and photocopying processes
- Faded and washed-out imagery -- desaturated photographs with crushed blacks and blown highlights, as if left in the sun or run through a copier too many times
Design Principles
- Authentic imperfection -- nothing should look digitally perfect; every element should feel touched by human hands, weather, or a malfunctioning machine
- Emotion over legibility -- the visceral feeling of the design matters more than clean information delivery; typography can be challenging to read if it serves the mood
- Anti-grid chaos -- reject structured layouts in favor of organic, collage-like arrangements where elements overlap, tilt, and fight for space
- Analog warmth -- the design should feel physically produced -- photocopied, screen-printed, wheat-pasted, or scrawled in a notebook -- never sterile or digital
- Muted restraint -- despite the chaos, the color palette is subdued and earthy; grunge is dark and introspective, not loud and neon
- Layered depth -- build visual richness through multiple texture layers (background grain, midground content, foreground noise and artifacts)
- DIY accessibility -- the design should look like anyone with basic tools could recreate it; professional polish is actively avoided
Color Palette
| Swatch Name |
Hex |
Role / Usage |
| Soot Black |
#0D0D0D |
Deep backgrounds, maximum contrast elements |
| Charcoal |
#1E1E1E |
Primary background, section fills |
| Dark Olive |
#3B3F2B |
Accent background, nature-inspired depth |
| Flannel Green |
#556B2F |
Primary cool accent, earthy green tones |
| Faded Olive |
#6B7B4A |
Secondary cool accent, muted green highlights |
| Rust |
#A0522D |
Primary warm accent, links, emphasis |
| Burnt Mustard |
#B8860B |
Secondary warm accent, headings, callouts |
| Dried Blood |
#6B1010 |
Strong emphasis, danger states, intense accent |
| Concrete Gray |
#4A4846 |
Borders, dividers, muted UI structure |
| Smoke |
#7A7672 |
Body text on dark, captions, metadata |
| Worn Denim |
#4B5D6E |
Cool neutral accent, alternative interactive state |
| Aged Paper |
#D4C9A8 |
Primary text on dark, warm off-white |
| Dirty White |
#E5DFD3 |
High-emphasis text, hero titles on dark |
| Coffee Stain |
#8B6F4E |
Decorative accent, mid-tone warm neutral |
| Faded Purple |
#5C4A6B |
Rare accent, album-art inspired secondary |
CSS Custom Properties
:root {
/* Base tones */
--grunge-soot: #0d0d0d;
--grunge-charcoal: #1e1e1e;
--grunge-concrete: #4a4846;
--grunge-smoke: #7a7672;
/* Earthy greens */
--grunge-dark-olive: #3b3f2b;
--grunge-flannel: #556b2f;
--grunge-faded-olive: #6b7b4a;
/* Warm accents */
--grunge-rust: #a0522d;
--grunge-mustard: #b8860b;
--grunge-blood: #6b1010;
--grunge-coffee: #8b6f4e;
/* Cool accents */
--grunge-denim: #4b5d6e;
--grunge-faded-purple: #5c4a6b;
/* Light tones */
--grunge-paper: #d4c9a8;
--grunge-white: #e5dfd3;
/* Functional mappings */
--grunge-bg-primary: var(--grunge-charcoal);
--grunge-bg-secondary: var(--grunge-dark-olive);
--grunge-bg-surface: var(--grunge-concrete);
--grunge-text-primary: var(--grunge-white);
--grunge-text-secondary: var(--grunge-paper);
--grunge-text-muted: var(--grunge-smoke);
--grunge-accent-warm: var(--grunge-rust);
--grunge-accent-cool: var(--grunge-flannel);
--grunge-accent-highlight: var(--grunge-mustard);
--grunge-border: var(--grunge-concrete);
}
Typography
Recommended Google Fonts
| Font |
Style |
Usage |
| Permanent Marker |
Bold hand-drawn marker |
Hero headlines, section titles, scrawled emphasis |
| Rock Salt |
Rough handwritten scrawl |
Subheadings, annotations, handwritten asides |
| Special Elite |
Distressed typewriter |
Display text, analog-feeling body headings |
| Courier Prime |
Clean typewriter monospace |
Body text, long-form readable content |
| Cutive Mono |
Vintage typewriter monospace |
Secondary body text, metadata |
| Rubik Dirt |
Bold with ink-pressed texture |
Display headlines, poster-style titles |
| Londrina Solid |
Hand-drawn bold sans |
Friendly grunge headings, zine-style titles |
| VT323 |
Pixel / CRT screen |
Technical elements, counters, retro-digital accents |
| Share Tech Mono |
Technical monospace |
Labels, tags, timestamps, small metadata |
Font Pairing Suggestions
| Pairing |
Headings |
Body |
Mood |
| Zine Scrawl |
Permanent Marker |
Courier Prime |
Raw, aggressive, hand-lettered energy |
| Typewriter Grunge |
Special Elite |
Cutive Mono |
Analog, lo-fi, mechanical imperfection |
| Poster Wall |
Rubik Dirt |
Share Tech Mono |
Bold, inky, underground show flyer |
| Notebook Pages |
Rock Salt |
Courier Prime |
Intimate, personal, journal-like |
| Digital Decay |
Londrina Solid |
VT323 |
Hybrid analog-digital, alternative web |
CSS Example
/* Import grunge-appropriate Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Permanent+Marker&family=Rock+Salt&family=Special+Elite&family=Courier+Prime:wght@400;700&family=Cutive+Mono&family=Rubik+Dirt&family=Londrina+Solid&family=VT323&family=Share+Tech+Mono&display=swap');
/* Hero / Display -- aggressive marker scrawl */
h1 {
font-family: 'Permanent Marker', 'Rock Salt', cursive;
font-size: clamp(2.5rem, 7vw, 5.5rem);
letter-spacing: -0.02em;
line-height: 0.95;
color: var(--grunge-white);
text-transform: uppercase;
transform: rotate(-1.5deg);
text-shadow:
3px 3px 0 rgba(0, 0, 0, 0.6),
-1px -1px 0 rgba(0, 0, 0, 0.3);
}
/* Section headings -- handwritten with attitude */
h2 {
font-family: 'Rock Salt', 'Permanent Marker', cursive;
font-size: clamp(1.4rem, 3.5vw, 2.2rem);
color: var(--grunge-mustard);
text-transform: uppercase;
letter-spacing: 0.02em;
transform: rotate(-0.8deg);
margin-bottom: 1rem;
}
/* Sub-headings -- distressed typewriter */
h3 {
font-family: 'Special Elite', 'Courier New', monospace;
font-size: 1.2rem;
color: var(--grunge-paper);
letter-spacing: 0.05em;
text-transform: uppercase;
}
/* Body text -- readable typewriter */
body {
font-family: 'Courier Prime', 'Cutive Mono', 'Courier New', monospace;
font-weight: 400;
font-size: 1rem;
line-height: 1.75;
color: var(--grunge-text-secondary);
}
/* Metadata, labels, tags */
.grunge-label {
font-family: 'Share Tech Mono', 'VT323', monospace;
font-size: 0.75rem;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--grunge-smoke);
}
/* Oversized display -- inky poster text */
.grunge-display {
font-family: 'Rubik Dirt', 'Permanent Marker', cursive;
font-size: clamp(3rem, 9vw, 8rem);
color: var(--grunge-rust);
text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.5);
line-height: 0.85;
}
Layout Principles
- Reject the grid -- 90s Grunge layouts are organic and collage-based; elements are placed by instinct and visual tension rather than mathematical alignment
- Layered, overlapping compositions -- content panels, images, and text blocks pile on top of each other like flyers on a telephone pole or pages torn from a notebook
- Asymmetric visual weight -- heavy elements cluster unpredictably; nothing is perfectly centered unless ironically
- Rotated and tilted elements -- almost everything sits at a slight angle (1-4 degrees), as if physically pinned or taped to a surface
- Torn and rough dividers -- sections are separated by ripped paper edges, ink splatters, or rough painted lines rather than clean horizontal rules
- Full-bleed textures -- dark, noisy backgrounds extend edge-to-edge while readable content stays within a narrower column (650-800px)
- Mixed media collage -- combine photographic elements, hand-drawn marks, typed text, and textured backgrounds in a single composition
- Visible construction -- tape strips, staple marks, pin holes, and glue artifacts are decorative elements that celebrate the handmade process
- Horror vacui meets brooding space -- some areas are densely layered while others use dark, empty space for atmospheric weight
- Vertical rhythm through roughness -- instead of consistent spacing, let the natural irregularity of torn edges and tilted elements create organic rhythm
CSS / Design Techniques
Card Component
/* Grunge card -- looks like a torn piece of paper pinned to a dark surface */
.grunge-card {
background:
/* Subtle paper texture grain */
radial-gradient(circle at 30% 20%, rgba(180, 160, 120, 0.06) 0%, transparent 50%),
var(--grunge-dark-olive);
border: 1px solid rgba(160, 82, 45, 0.25);
padding: 2rem;
position: relative;
overflow: hidden;
transform: rotate(calc(var(--tilt, -0.8) * 1deg));
box-shadow:
4px 4px 0 rgba(0, 0, 0, 0.5),
0 0 30px rgba(0, 0, 0, 0.3);
}
/* Tape strip holding the card */
.grunge-card::before {
content: '';
position: absolute;
top: -6px;
left: calc(40% + var(--tape-offset, 0px));
width: 75px;
height: 22px;
background: rgba(212, 201, 168, 0.2);
border: 1px solid rgba(212, 201, 168, 0.1);
transform: rotate(calc(var(--tape-tilt, 2) * 1deg));
z-index: 2;
}
/* Torn bottom edge */
.grunge-card::after {
content: '';
position: absolute;
bottom: -1px;
left: 0;
right: 0;
height: 12px;
background: var(--grunge-dark-olive);
clip-path: polygon(
0% 0%, 4% 65%, 8% 20%, 12% 70%, 17% 30%, 22% 80%,
27% 15%, 32% 60%, 37% 25%, 42% 75%, 48% 10%, 53% 55%,
58% 35%, 63% 85%, 68% 20%, 73% 65%, 78% 40%, 83% 75%,
88% 15%, 93% 60%, 98% 30%, 100% 50%, 100% 100%, 0% 100%
);
}
/* Card title */
.grunge-card h3 {
font-family: 'Permanent Marker', cursive;
color: var(--grunge-mustard);
margin-bottom: 0.75rem;
transform: rotate(-0.5deg);
}
/* Card body text */
.grunge-card p {
font-family: 'Courier Prime', monospace;
color: var(--grunge-paper);
line-height: 1.7;
font-size: 0.95rem;
}
/* Primary grunge button -- handmade, rough, confrontational */
.grunge-btn {
display: inline-block;
padding: 0.75rem 2rem;
font-family: 'Permanent Marker', 'Special Elite', cursive;
font-size: 1rem;
letter-spacing: 0.06em;
text-transform: uppercase;
text-decoration: none;
color: var(--grunge-white);
background: var(--grunge-charcoal);
border: 2px solid var(--grunge-rust);
cursor: pointer;
position: relative;
transform: rotate(-1deg);
transition: all 0.15s ease;
box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.5);
}
.grunge-btn:hover {
background: var(--grunge-rust);
color: var(--grunge-soot);
transform: rotate(0.5deg) translate(-1px, -1px);
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.6);
}
.grunge-btn:active {
transform: rotate(0deg) translate(2px, 2px);
box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);
}
/* Ghost/outline variant */
.grunge-btn--ghost {
background: transparent;
border: 2px solid var(--grunge-smoke);
color: var(--grunge-paper);
}
.grunge-btn--ghost:hover {
border-color: var(--grunge-mustard);
color: var(--grunge-mustard);
background: rgba(184, 134, 11, 0.08);
}
/* Sticker variant -- looks like a peeling sticker on a guitar case */
.grunge-btn--sticker {
background: var(--grunge-mustard);
color: var(--grunge-soot);
border: 2px solid var(--grunge-soot);
transform: rotate(2deg);
}
.grunge-btn--sticker:hover {
transform: rotate(-1deg) scale(1.05);
box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.5);
}
Navigation Bar
/* Grunge navigation -- scrawled, rough, anti-corporate */
.grunge-nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
background: var(--grunge-soot);
border-bottom: 3px solid var(--grunge-concrete);
position: relative;
}
/* Noise texture on nav */
.grunge-nav::after {
content: '';
position: absolute;
inset: 0;
opacity: 0.05;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
background-size: 256px 256px;
pointer-events: none;
mix-blend-mode: overlay;
}
.grunge-nav__brand {
font-family: 'Permanent Marker', cursive;
font-size: 1.4rem;
color: var(--grunge-white);
text-decoration: none;
transform: rotate(-1deg);
letter-spacing: 0.03em;
}
.grunge-nav__links {
display: flex;
gap: 1.5rem;
list-style: none;
margin: 0;
padding: 0;
}
.grunge-nav__link {
font-family: 'Special Elite', monospace;
font-size: 0.9rem;
color: var(--grunge-smoke);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
padding: 0.3rem 0;
border-bottom: 2px solid transparent;
transition: all 0.15s ease;
}
.grunge-nav__link:hover {
color: var(--grunge-mustard);
border-bottom-color: var(--grunge-mustard);
}
.grunge-nav__link--active {
color: var(--grunge-rust);
border-bottom-color: var(--grunge-rust);
}
Hero Section
/* Full-bleed grunge hero with layered textures */
.grunge-hero {
position: relative;
min-height: 80vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 4rem 2rem;
background:
/* Vignette */
radial-gradient(ellipse at center, transparent 40%, rgba(13, 13, 13, 0.7) 100%),
/* Warm light leak */
radial-gradient(circle at 20% 80%, rgba(160, 82, 45, 0.08) 0%, transparent 50%),
/* Cool shadow */
radial-gradient(circle at 80% 20%, rgba(59, 63, 43, 0.1) 0%, transparent 40%),
var(--grunge-soot);
overflow: hidden;
}
/* Heavy noise grain overlay */
.grunge-hero::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.1;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='grain'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23grain)'/%3E%3C/svg%3E");
background-size: 512px 512px;
pointer-events: none;
mix-blend-mode: overlay;
z-index: 1;
}
/* Diagonal scratch lines */
.grunge-hero::after {
content: '';
position: absolute;
inset: 0;
background:
repeating-linear-gradient(
-30deg,
transparent,
transparent 10px,
rgba(255, 255, 255, 0.01) 10px,
rgba(255, 255, 255, 0.01) 11px
),
repeating-linear-gradient(
40deg,
transparent,
transparent 14px,
rgba(255, 255, 255, 0.008) 14px,
rgba(255, 255, 255, 0.008) 15px
);
pointer-events: none;
z-index: 1;
}
.grunge-hero__content {
position: relative;
z-index: 2;
max-width: 800px;
}
.grunge-hero__title {
font-family: 'Permanent Marker', cursive;
font-size: clamp(3rem, 8vw, 6rem);
line-height: 0.9;
color: var(--grunge-white);
text-transform: uppercase;
transform: rotate(-2deg);
margin-bottom: 1.5rem;
text-shadow:
4px 4px 0 rgba(0, 0, 0, 0.6),
-2px -2px 0 rgba(0, 0, 0, 0.2);
}
.grunge-hero__subtitle {
font-family: 'Special Elite', monospace;
font-size: clamp(1rem, 2vw, 1.3rem);
color: var(--grunge-smoke);
letter-spacing: 0.15em;
text-transform: uppercase;
transform: rotate(0.5deg);
}
Torn Paper Edge Divider
/* Torn paper edge between sections */
.grunge-torn-edge {
position: relative;
padding-bottom: 2rem;
}
.grunge-torn-edge::after {
content: '';
position: absolute;
bottom: -2px;
left: 0;
right: 0;
height: 18px;
background: var(--grunge-charcoal);
clip-path: polygon(
0% 0%, 2% 55%, 5% 15%, 8% 70%, 11% 25%, 14% 80%,
18% 10%, 21% 60%, 24% 30%, 28% 85%, 31% 20%, 34% 65%,
37% 5%, 40% 50%, 43% 75%, 46% 15%, 49% 60%, 52% 35%,
55% 80%, 58% 10%, 61% 55%, 64% 25%, 67% 70%, 70% 40%,
73% 90%, 76% 20%, 79% 60%, 82% 5%, 85% 45%, 88% 75%,
91% 30%, 94% 65%, 97% 15%, 100% 50%,
100% 100%, 0% 100%
);
}
/* Inverse torn edge (dark to light) */
.grunge-torn-edge--inverse::after {
background: var(--grunge-soot);
}
Xerox / Photocopy Texture Effect
/* Photocopy-degraded background treatment */
.grunge-xerox {
position: relative;
background: var(--grunge-charcoal);
}
/* Heavy photocopy grain */
.grunge-xerox::before {
content: '';
position: absolute;
inset: 0;
opacity: 0.07;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='xerox'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='6' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23xerox)'/%3E%3C/svg%3E");
background-size: 512px 512px;
pointer-events: none;
mix-blend-mode: overlay;
}
/* Halftone dot overlay */
.grunge-xerox::after {
content: '';
position: absolute;
inset: 0;
background-image: radial-gradient(circle, rgba(0, 0, 0, 0.8) 0.8px, transparent 0.8px);
background-size: 4px 4px;
opacity: 0.04;
mix-blend-mode: multiply;
pointer-events: none;
}
/* Apply to images for photocopy look */
.grunge-xerox-img {
filter: contrast(1.8) grayscale(1) brightness(1.15);
mix-blend-mode: luminosity;
}
/* Extreme photocopy -- run through the copier 10 times */
.grunge-xerox-img--heavy {
filter: contrast(2.8) grayscale(1) brightness(1.3);
image-rendering: auto;
opacity: 0.9;
}
Flannel / Plaid Pattern
/* CSS-only flannel plaid pattern for backgrounds and accents */
.grunge-flannel {
background-color: #3b3f2b;
background-image:
/* Horizontal bands */
repeating-linear-gradient(
0deg,
transparent,
transparent 18px,
rgba(160, 82, 45, 0.15) 18px,
rgba(160, 82, 45, 0.15) 20px,
transparent 20px,
transparent 38px,
rgba(160, 82, 45, 0.25) 38px,
rgba(160, 82, 45, 0.25) 42px,
transparent 42px,
transparent 56px
),
/* Vertical bands */
repeating-linear-gradient(
90deg,
transparent,
transparent 18px,
rgba(85, 107, 47, 0.2) 18px,
rgba(85, 107, 47, 0.2) 20px,
transparent 20px,
transparent 38px,
rgba(85, 107, 47, 0.3) 38px,
rgba(85, 107, 47, 0.3) 42px,
transparent 42px,
transparent 56px
),
/* Thin accent lines */
repeating-linear-gradient(
0deg,
transparent,
transparent 27px,
rgba(184, 134, 11, 0.1) 27px,
rgba(184, 134, 11, 0.1) 29px,
transparent 29px,
transparent 56px
),
repeating-linear-gradient(
90deg,
transparent,
transparent 27px,
rgba(184, 134, 11, 0.1) 27px,
rgba(184, 134, 11, 0.1) 29px,
transparent 29px,
transparent 56px
);
}
/* Flannel accent strip -- for borders, dividers, or decorative bands */
.grunge-flannel-strip {
height: 8px;
background: repeating-linear-gradient(
90deg,
var(--grunge-dark-olive) 0px,
var(--grunge-dark-olive) 6px,
var(--grunge-rust) 6px,
var(--grunge-rust) 8px,
var(--grunge-dark-olive) 8px,
var(--grunge-dark-olive) 12px,
var(--grunge-flannel) 12px,
var(--grunge-flannel) 14px
);
opacity: 0.7;
}
Zine-Style Collage Layout
/* Zine-style collage container with scattered, overlapping elements */
.grunge-zine {
position: relative;
min-height: 500px;
padding: 3rem 2rem;
overflow: hidden;
}
/* Individual collage pieces */
.grunge-zine__piece {
position: absolute;
background: var(--grunge-paper);
color: var(--grunge-soot);
padding: 1.2rem;
border: 1px solid rgba(0, 0, 0, 0.15);
transform: rotate(calc(var(--r, 0) * 1deg));
z-index: var(--z, 1);
max-width: 280px;
box-shadow:
2px 2px 0 rgba(0, 0, 0, 0.2),
0 0 15px rgba(0, 0, 0, 0.15);
font-family: 'Courier Prime', monospace;
font-size: 0.85rem;
line-height: 1.6;
}
.grunge-zine__piece:nth-child(even) {
background: var(--grunge-white);
}
/* Tape on collage pieces */
.grunge-zine__piece::before {
content: '';
position: absolute;
top: -7px;
right: 15%;
width: 55px;
height: 18px;
background: rgba(212, 201, 168, 0.35);
border: 1px solid rgba(212, 201, 168, 0.15);
transform: rotate(calc(var(--tape-r, 4) * 1deg));
}
/* Headline piece -- bold, scrawled, attention-grabbing */
.grunge-zine__piece--headline {
font-family: 'Permanent Marker', cursive;
font-size: 1.5rem;
text-transform: uppercase;
background: var(--grunge-soot);
color: var(--grunge-white);
border: none;
z-index: 10;
}
/* Photo piece -- xeroxed image placeholder */
.grunge-zine__piece--photo {
padding: 0;
filter: contrast(1.6) grayscale(1) brightness(1.1);
border: 3px solid var(--grunge-soot);
}
Ink Splatter Divider
/* Ink splatter horizontal divider */
.grunge-splatter {
border: none;
height: 1px;
background: var(--grunge-concrete);
position: relative;
margin: 3rem 0;
opacity: 0.4;
}
/* Splatter dots along the divider */
.grunge-splatter::before {
content: '';
position: absolute;
top: -5px;
left: 15%;
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--grunge-rust);
box-shadow:
25px 3px 0 3px var(--grunge-rust),
55px -2px 0 1px var(--grunge-rust),
90px 4px 0 2px var(--grunge-rust),
140px -1px 0 4px var(--grunge-rust),
200px 3px 0 1px var(--grunge-rust),
260px -3px 0 2px var(--grunge-rust);
opacity: 0.35;
}
/* Additional splatter layer */
.grunge-splatter::after {
content: '';
position: absolute;
top: -3px;
right: 20%;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--grunge-mustard);
box-shadow:
-30px 2px 0 1px var(--grunge-mustard),
-70px -1px 0 2px var(--grunge-mustard),
-120px 3px 0 1px var(--grunge-mustard);
opacity: 0.25;
}
Design Do's and Don'ts
Do's
- Do use heavy noise/grain overlays on backgrounds and images to create analog texture
- Do tilt and rotate elements slightly (1-4 degrees) for a hand-placed, imperfect feel
- Do stick to dark, muted earth tones -- olive, rust, charcoal, mustard, and faded denim
- Do use typewriter and handwritten fonts for headings; pair with monospace for body text
- Do layer textures -- combine noise, scratches, halftone dots, and vignettes for depth
- Do reference physical materials -- torn paper, tape strips, coffee stains, Xerox artifacts
- Do let the design breathe with dark, moody negative space between chaotic sections
- Do use SVG filters (feTurbulence, feDisplacementMap) for realistic grain and distortion
- Do apply photocopy treatments to images: high contrast, grayscale, crushed midtones
- Do embrace asymmetry and deliberate misalignment in your layouts
Don'ts
- Don't use bright, saturated, or neon colors -- grunge is muted, faded, and desaturated
- Don't center-align everything; grunge layouts are organic and asymmetric
- Don't use clean geometric shapes with perfect borders -- rough, irregular edges are essential
- Don't over-polish; if it looks too clean or too professional, it has lost the grunge spirit
- Don't confuse 90s Grunge with Corporate Grunge -- authentic grunge rejects the underlying grid structure that corporate grunge maintains
- Don't use smooth gradients or glossy effects -- everything should feel matte, rough, and physical
- Don't sacrifice all readability for style -- body text should still be legible even if headings are raw
- Don't use stock photography with clean lighting; images should be high-contrast, grainy, and lo-fi
- Don't mix in modern flat design or material design elements -- they are fundamentally incompatible
- Don't forget the analog origins -- every digital effect should reference a physical process (photocopying, screen-printing, hand-lettering)
| Aesthetic |
Relationship to 90s Grunge |
| Corporate Grunge |
Direct descendant; commercializes grunge textures within rigid corporate layouts, trading chaos for controlled edginess |
| DIY Punk |
Ideological parent; shares the anti-establishment DIY ethos, cut-and-paste collage, and Xerox culture, but punk is more aggressive and explicitly political |
| Industrial Gothic |
Shares dark palettes and gritty textures; Industrial adds heavier metallic and mechanical elements with a colder, more oppressive tone |
| Brutalist Web Design |
Modern spiritual successor; both reject polish in favor of rawness, though Brutalism is more minimal while Grunge is more textured |
| Dark Academia |
Overlaps in muted earth tones and moody atmosphere, but Dark Academia is scholarly and refined where Grunge is chaotic and anti-intellectual |
| Early Cyber |
Contemporaneous aesthetic from the same 1990s era; Early Cyber embraces emerging digital technology while Grunge rejects it in favor of analog |
| Cyberpunk |
Shares dark, dystopian undertones and anti-corporate sentiment, but Cyberpunk adds neon accents and sci-fi futurism |
| Weirdcore |
Shares the distorted, lo-fi visual quality and embrace of imperfection, but Weirdcore leans surreal and dreamlike rather than moody and raw |
| Liminal Space |
Both evoke feelings of unease and atmospheric tension through muted tones and emptiness, but through different visual strategies |
| Terminal CLI Aesthetic |
Shares the monospace typography preference and anti-polish stance, but Terminal is clean and precise where Grunge is messy and organic |
Quick-Start HTML Template
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>90s Grunge</title>
<link href="https://fonts.googleapis.com/css2?family=Permanent+Marker&family=Rock+Salt&family=Special+Elite&family=Courier+Prime:wght@400;700&family=VT323&family=Share+Tech+Mono&display=swap" rel="stylesheet">
<style>
:root {
--grunge-soot: #0d0d0d;
--grunge-charcoal: #1e1e1e;
--grunge-dark-olive: #3b3f2b;
--grunge-flannel: #556b2f;
--grunge-faded-olive: #6b7b4a;
--grunge-rust: #a0522d;
--grunge-mustard: #b8860b;
--grunge-blood: #6b1010;
--grunge-concrete: #4a4846;
--grunge-smoke: #7a7672;
--grunge-denim: #4b5d6e;
--grunge-paper: #d4c9a8;
--grunge-white: #e5dfd3;
--grunge-coffee: #8b6f4e;
--grunge-faded-purple: #5c4a6b;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--grunge-charcoal);
color: var(--grunge-paper);
font-family: 'Courier Prime', 'Courier New', monospace;
font-size: 1rem;
line-height: 1.75;
position: relative;
overflow-x: hidden;
}
/* ---- Global noise grain overlay ---- */
body::before {
content: '';
position: fixed;
inset: 0;
opacity: 0.07;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 512 512' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='5' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
background-size: 512px 512px;
pointer-events: none;
mix-blend-mode: overlay;
z-index: 9999;
}
/* ---- Navigation ---- */
nav {
display: flex;
align-items: center;
justify-content: space-between;
padding: 1rem 2rem;
background: var(--grunge-soot);
border-bottom: 3px solid var(--grunge-concrete);
position: relative;
z-index: 100;
}
nav .brand {
font-family: 'Permanent Marker', cursive;
font-size: 1.3rem;
color: var(--grunge-white);
text-decoration: none;
transform: rotate(-1deg);
display: inline-block;
}
nav ul {
display: flex;
gap: 1.5rem;
list-style: none;
}
nav a {
font-family: 'Special Elite', monospace;
font-size: 0.85rem;
color: var(--grunge-smoke);
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.1em;
border-bottom: 2px solid transparent;
padding-bottom: 0.2rem;
transition: all 0.15s ease;
}
nav a:hover, nav a.active {
color: var(--grunge-mustard);
border-bottom-color: var(--grunge-mustard);
}
/* ---- Hero Section ---- */
.hero {
position: relative;
min-height: 75vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 5rem 2rem;
background:
radial-gradient(ellipse at center, transparent 40%, rgba(13, 13, 13, 0.7) 100%),
radial-gradient(circle at 15% 75%, rgba(160, 82, 45, 0.07) 0%, transparent 50%),
radial-gradient(circle at 85% 25%, rgba(59, 63, 43, 0.09) 0%, transparent 40%),
var(--grunge-soot);
overflow: hidden;
}
/* Scratch overlay */
.hero::after {
content: '';
position: absolute;
inset: 0;
background:
repeating-linear-gradient(-30deg, transparent, transparent 11px, rgba(255,255,255,0.01) 11px, rgba(255,255,255,0.01) 12px),
repeating-linear-gradient(35deg, transparent, transparent 15px, rgba(255,255,255,0.008) 15px, rgba(255,255,255,0.008) 16px);
pointer-events: none;
}
.hero-content {
max-width: 800px;
position: relative;
z-index: 2;
}
.hero h1 {
font-family: 'Permanent Marker', cursive;
font-size: clamp(3rem, 8vw, 6rem);
line-height: 0.9;
color: var(--grunge-white);
text-transform: uppercase;
transform: rotate(-2deg);
margin-bottom: 1.5rem;
text-shadow:
4px 4px 0 rgba(0, 0, 0, 0.6),
-2px -2px 0 rgba(0, 0, 0, 0.2);
}
.hero h1 em {
color: var(--grunge-rust);
font-style: normal;
}
.hero .tagline {
font-family: 'Special Elite', monospace;
font-size: clamp(0.9rem, 1.8vw, 1.2rem);
color: var(--grunge-smoke);
letter-spacing: 0.15em;
text-transform: uppercase;
transform: rotate(0.5deg);
display: inline-block;
margin-bottom: 2rem;
}
/* ---- Torn Edge Divider ---- */
.torn-edge {
height: 18px;
background: var(--grunge-charcoal);
clip-path: polygon(
0% 0%, 2% 55%, 5% 15%, 8% 70%, 11% 25%, 14% 80%,
18% 10%, 21% 60%, 24% 30%, 28% 85%, 31% 20%, 34% 65%,
37% 5%, 40% 50%, 43% 75%, 46% 15%, 49% 60%, 52% 35%,
55% 80%, 58% 10%, 61% 55%, 64% 25%, 67% 70%, 70% 40%,
73% 90%, 76% 20%, 79% 60%, 82% 5%, 85% 45%, 88% 75%,
91% 30%, 94% 65%, 97% 15%, 100% 50%,
100% 100%, 0% 100%
);
}
/* ---- Section Styles ---- */
section {
max-width: 800px;
margin: 0 auto;
padding: 4rem 2rem;
}
section h2 {
font-family: 'Rock Salt', 'Permanent Marker', cursive;
font-size: clamp(1.3rem, 3vw, 2rem);
color: var(--grunge-mustard);
text-transform: uppercase;
transform: rotate(-0.8deg);
margin-bottom: 1.5rem;
letter-spacing: 0.02em;
}
section h3 {
font-family: 'Special Elite', monospace;
font-size: 1.1rem;
color: var(--grunge-paper);
text-transform: uppercase;
letter-spacing: 0.08em;
margin: 2rem 0 0.75rem;
}
/* ---- Grunge Cards ---- */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 2rem;
margin: 2rem 0;
}
.card {
background:
radial-gradient(circle at 25% 25%, rgba(160, 82, 45, 0.04) 0%, transparent 50%),
var(--grunge-dark-olive);
border: 1px solid rgba(160, 82, 45, 0.2);
padding: 1.8rem;
position: relative;
transform: rotate(calc(var(--tilt, -0.5) * 1deg));
box-shadow:
4px 4px 0 rgba(0, 0, 0, 0.5),
0 0 25px rgba(0, 0, 0, 0.25);
overflow: hidden;
}
/* Tape strip */
.card::before {
content: '';
position: absolute;
top: -6px;
left: calc(35% + var(--tape-x, 0px));
width: 70px;
height: 20px;
background: rgba(212, 201, 168, 0.18);
border: 1px solid rgba(212, 201, 168, 0.08);
transform: rotate(calc(var(--tape-tilt, 2) * 1deg));
z-index: 2;
}
.card h4 {
font-family: 'Permanent Marker', cursive;
color: var(--grunge-mustard);
font-size: 1.15rem;
margin-bottom: 0.6rem;
transform: rotate(-0.5deg);
}
.card p {
font-size: 0.9rem;
line-height: 1.7;
color: var(--grunge-paper);
}
.card .label {
font-family: 'Share Tech Mono', monospace;
font-size: 0.7rem;
text-transform: uppercase;
letter-spacing: 0.2em;
color: var(--grunge-smoke);
margin-bottom: 0.5rem;
display: block;
}
/* ---- Flannel Accent Band ---- */
.flannel-band {
height: 8px;
background: repeating-linear-gradient(
90deg,
var(--grunge-dark-olive) 0px,
var(--grunge-dark-olive) 6px,
var(--grunge-rust) 6px,
var(--grunge-rust) 8px,
var(--grunge-dark-olive) 8px,
var(--grunge-dark-olive) 12px,
var(--grunge-flannel) 12px,
var(--grunge-flannel) 14px
);
opacity: 0.6;
}
/* ---- Buttons ---- */
.btn {
display: inline-block;
padding: 0.75rem 2rem;
font-family: 'Permanent Marker', cursive;
font-size: 1rem;
letter-spacing: 0.05em;
text-transform: uppercase;
text-decoration: none;
color: var(--grunge-white);
background: var(--grunge-charcoal);
border: 2px solid var(--grunge-rust);
cursor: pointer;
transform: rotate(-1deg);
transition: all 0.15s ease;
box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.5);
}
.btn:hover {
background: var(--grunge-rust);
color: var(--grunge-soot);
transform: rotate(0.5deg) translate(-1px, -1px);
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.6);
}
.btn:active {
transform: translate(2px, 2px);
box-shadow: 1px 1px 0 rgba(0, 0, 0, 0.4);
}
.btn--ghost {
background: transparent;
border-color: var(--grunge-smoke);
color: var(--grunge-paper);
}
.btn--ghost:hover {
border-color: var(--grunge-mustard);
color: var(--grunge-mustard);
background: rgba(184, 134, 11, 0.08);
}
.btn--sticker {
background: var(--grunge-mustard);
color: var(--grunge-soot);
border-color: var(--grunge-soot);
transform: rotate(2deg);
}
.btn--sticker:hover {
transform: rotate(-1deg) scale(1.05);
}
.btn-group {
display: flex;
gap: 1rem;
flex-wrap: wrap;
margin: 2rem 0;
}
/* ---- Splatter Divider ---- */
.splatter-divider {
border: none;
height: 1px;
background: var(--grunge-concrete);
position: relative;
margin: 3rem 0;
opacity: 0.35;
}
.splatter-divider::before {
content: '';
position: absolute;
top: -5px;
left: 18%;
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--grunge-rust);
box-shadow:
30px 3px 0 2px var(--grunge-rust),
65px -2px 0 1px var(--grunge-rust),
110px 4px 0 3px var(--grunge-rust),
170px -1px 0 1px var(--grunge-rust),
240px 2px 0 2px var(--grunge-rust);
opacity: 0.3;
}
/* ---- Xerox Image Treatment ---- */
.xerox-img {
filter: contrast(1.8) grayscale(1) brightness(1.15);
mix-blend-mode: luminosity;
border: 3px solid var(--grunge-soot);
display: block;
width: 100%;
}
/* ---- Zine Collage Section ---- */
.zine-collage {
position: relative;
min-height: 350px;
margin: 2rem 0;
}
.zine-piece {
position: absolute;
background: var(--grunge-paper);
color: var(--grunge-soot);
padding: 1rem;
border: 1px solid rgba(0, 0, 0, 0.12);
transform: rotate(calc(var(--r, 0) * 1deg));
z-index: var(--z, 1);
max-width: 250px;
box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.2);
font-family: 'Courier Prime', monospace;
font-size: 0.8rem;
line-height: 1.6;
}
.zine-piece::before {
content: '';
position: absolute;
top: -6px;
right: 20%;
width: 50px;
height: 16px;
background: rgba(212, 201, 168, 0.3);
transform: rotate(calc(var(--tape-r, 3) * 1deg));
}
.zine-piece--dark {
background: var(--grunge-soot);
color: var(--grunge-white);
font-family: 'Permanent Marker', cursive;
font-size: 1.2rem;
text-transform: uppercase;
}
/* ---- Scrawled Annotation ---- */
.scrawl {
font-family: 'Rock Salt', cursive;
font-size: 0.75rem;
color: var(--grunge-rust);
transform: rotate(-3deg);
display: inline-block;
}
/* ---- Quote / Callout ---- */
blockquote {
border-left: 4px solid var(--grunge-rust);
padding: 1.5rem 1.5rem 1.5rem 2rem;
margin: 2rem 0;
background: rgba(59, 63, 43, 0.2);
transform: rotate(-0.3deg);
position: relative;
font-style: italic;
color: var(--grunge-white);
}
blockquote::before {
content: '\201C';
position: absolute;
top: -0.3rem;
left: 0.5rem;
font-family: 'Permanent Marker', cursive;
font-size: 3rem;
color: var(--grunge-rust);
opacity: 0.3;
line-height: 1;
}
/* ---- Footer ---- */
footer {
text-align: center;
padding: 3rem 2rem;
background: var(--grunge-soot);
border-top: 3px solid var(--grunge-concrete);
font-family: 'Share Tech Mono', monospace;
font-size: 0.75rem;
letter-spacing: 0.15em;
text-transform: uppercase;
color: var(--grunge-smoke);
}
footer a {
color: var(--grunge-rust);
text-decoration: none;
border-bottom: 1px solid rgba(160, 82, 45, 0.3);
}
footer a:hover {
color: var(--grunge-mustard);
}
/* ---- Links ---- */
a.text-link {
color: var(--grunge-rust);
text-decoration: none;
border-bottom: 1px solid rgba(160, 82, 45, 0.4);
transition: color 0.15s;
}
a.text-link:hover {
color: var(--grunge-mustard);
border-bottom-color: var(--grunge-mustard);
}
/* ---- Responsive ---- */
@media (max-width: 640px) {
nav {
flex-direction: column;
gap: 1rem;
text-align: center;
}
nav ul { gap: 1rem; flex-wrap: wrap; justify-content: center; }
.hero { min-height: 60vh; padding: 3rem 1.5rem; }
.card-grid { grid-template-columns: 1fr; }
.zine-collage { min-height: auto; position: static; }
.zine-piece {
position: static;
transform: rotate(calc(var(--r, 0) * 0.5deg));
max-width: 100%;
margin-bottom: 1rem;
}
}
</style>
</head>
<body>
<!-- Navigation -->
<nav>
<a href="#" class="brand">grunge.zine</a>
<ul>
<li><a href="#" class="active">Home</a></li>
<li><a href="#">About</a></li>
<li><a href="#">Music</a></li>
<li><a href="#">Zines</a></li>
<li><a href="#">Contact</a></li>
</ul>
</nav>
<!-- Hero -->
<section class="hero">
<div class="hero-content">
<h1>Smells Like<br><em>Raw Design</em></h1>
<p class="tagline">Seattle // 1991 // Anti-establishment aesthetics</p>
<div class="btn-group">
<a href="#" class="btn">Explore</a>
<a href="#" class="btn btn--ghost">Read Zine</a>
</div>
</div>
</section>
<div class="torn-edge"></div>
<!-- About Section -->
<section>
<h2>the aesthetic</h2>
<p>Born from the rain-soaked basements and thrift stores of the Pacific Northwest, 90s Grunge rejected the polished excess of the 1980s in favor of raw, unfiltered expression. It was never about looking good. It was about looking <em>real</em>.</p>
<hr class="splatter-divider">
<blockquote>
Here we are now, in a world of distressed textures, torn edges, and the beautiful imperfection of things made by hand. The grunge aesthetic endures because authenticity never goes out of style.
</blockquote>
</section>
<div class="flannel-band"></div>
<!-- Cards Section -->
<section>
<h2>core elements</h2>
<div class="card-grid">
<div class="card" style="--tilt: -1; --tape-tilt: 3; --tape-x: -10px">
<span class="label">01 // textures</span>
<h4>Distressed Surfaces</h4>
<p>Every surface tells a story of wear -- torn paper, crumpled fabric, scratched film. Nothing is pristine. Everything has been touched, used, and lived in.</p>
</div>
<div class="card" style="--tilt: 0.8; --tape-tilt: -2; --tape-x: 20px">
<span class="label">02 // typography</span>
<h4>Scrawled & Typed</h4>
<p>Handwritten marker text collides with typewriter output. Letters bounce on uneven baselines. Legibility is secondary to raw emotional expression.</p>
</div>
<div class="card" style="--tilt: -0.5; --tape-tilt: 1; --tape-x: 5px">
<span class="label">03 // palette</span>
<h4>Dark Earth Tones</h4>
<p>Olive, rust, charcoal, mustard, and faded denim. The colors of flannel shirts, coffee-stained notebooks, and Pacific Northwest forests in November.</p>
</div>
</div>
</section>
<div class="torn-edge"></div>
<!-- Zine Collage Section -->
<section>
<h2>zine culture</h2>
<p>Cut, paste, photocopy, distribute. The zine was the original social media -- self-published, unfiltered, and distributed hand-to-hand outside shows and in record stores.</p>
<div class="zine-collage">
<div class="zine-piece" style="--r: -3; --z: 2; --tape-r: 5; top: 10px; left: 5%;">
Photocopied at 3am on a stolen Kinko's card. Stapled with whatever was in the junk drawer. Distributed for free or traded for other zines.
</div>
<div class="zine-piece zine-piece--dark" style="--r: 2; --z: 3; top: 30px; right: 5%;">
DIY or die
</div>
<div class="zine-piece" style="--r: -1.5; --z: 1; --tape-r: -3; top: 180px; left: 15%;">
The imperfections ARE the design. Every smudge, every misaligned letter, every toner streak is a mark of authenticity.
</div>
</div>
</section>
<div class="flannel-band"></div>
<!-- Buttons Section -->
<section>
<h2>interactions</h2>
<h3>Button Variants</h3>
<div class="btn-group">
<a href="#" class="btn">Primary</a>
<a href="#" class="btn btn--ghost">Ghost</a>
<a href="#" class="btn btn--sticker">Sticker</a>
</div>
<br>
<p>Even interactive elements carry the weight of analog imperfection. Buttons tilt, hover states shift like papers sliding on a table, and nothing snaps to a perfect grid. <span class="scrawl">^ these actually work!</span></p>
</section>
<div class="torn-edge"></div>
<!-- Footer -->
<footer>
<p>assembled by hand — photocopied at midnight — <a href="#">grunge.zine</a> — circa 1994</p>
</footer>
</body>
</html>