25 CSS Blockquotes07 / 25
Classic Left Border CSS Blockquote Snippet
The canonical snippet — 4px solid left border, light wash, italic serif — that every CMS, CMS theme and CSS course reaches for first, written the way it should be written in 2026: tokens for every value, a wash derived with color-mix() instead of a hand-picked gray, spec-correct cite placement, and a smart-quotes bonus using the CSS quotes property so nested quotes get language-correct marks automatically. This is the one to teach from: every other demo in the collection is a mutation of these ten lines.
Published Updated
The code
<section class="bq-07" aria-label="Classic left border blockquote demo">
<div class="bq-07__stage">
<article class="bq-07__article">
<h1>The ten lines everyone starts with</h1>
<p>Ask a room of developers to style a quote and most will type the same thing from muscle memory. As one CSS textbook puts it:</p>
<figure class="bq-07__fig">
<blockquote class="bq-07__quote">
<p>The left-border blockquote persists because it solves the real problem — <q>where does the quote end?</q> — with one line of CSS and no ambiguity.</p>
</blockquote>
<figcaption class="bq-07__cap">Sarah Drasner, <cite>Notes on Modern CSS</cite></figcaption>
</figure>
<p>Note the nested <em>inner quote</em> above: it got single marks automatically. That's the <code>quotes</code> property tracking depth — no hard-coded characters anywhere.</p>
</article>
<p class="bq-07__chip" aria-hidden="true">quotes · open-quote/close-quote · color-mix() wash</p>
</div>
</section><section class="bq-07" aria-label="Classic left border blockquote demo">
<div class="bq-07__stage">
<article class="bq-07__article">
<h1>The ten lines everyone starts with</h1>
<p>Ask a room of developers to style a quote and most will type the same thing from muscle memory. As one CSS textbook puts it:</p>
<figure class="bq-07__fig">
<blockquote class="bq-07__quote">
<p>The left-border blockquote persists because it solves the real problem — <q>where does the quote end?</q> — with one line of CSS and no ambiguity.</p>
</blockquote>
<figcaption class="bq-07__cap">Sarah Drasner, <cite>Notes on Modern CSS</cite></figcaption>
</figure>
<p>Note the nested <em>inner quote</em> above: it got single marks automatically. That's the <code>quotes</code> property tracking depth — no hard-coded characters anywhere.</p>
</article>
<p class="bq-07__chip" aria-hidden="true">quotes · open-quote/close-quote · color-mix() wash</p>
</div>
</section>.bq-07,
.bq-07 *,
.bq-07 *::before,
.bq-07 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.bq-07 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
--bg: oklch(0.98 0.005 240);
--ink: oklch(0.26 0.015 250);
--quiet: oklch(0.44 0.015 250);
--mut: oklch(0.55 0.015 250);
--rule: oklch(0.62 0.1 250);
font-family: 'Segoe UI',system-ui,sans-serif;
color: var(--ink);
}
.bq-07__stage {
width: 100%;
height: 100vh;
height: 100svh;
display: grid;
place-items: center;
align-content: center;
gap: 26px;
padding: clamp(20px,5vw,56px);
background: var(--bg);
overflow-y: auto;
}
.bq-07__article {
max-width: 60ch;
font-size: 16px;
line-height: 1.7;
}
.bq-07__article h1 {
font-size: clamp(22px,3vw,30px);
letter-spacing: -.02em;
margin-bottom: 14px;
text-wrap: balance;
}
.bq-07__article>p {
color: var(--quiet);
text-wrap: pretty;
}
.bq-07__article>p+p,
.bq-07__fig+p {
margin-top: 14px;
}
.bq-07__article code {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: .86em;
background: oklch(0.93 0.01 250);
padding: 1.5px 6px;
border-radius: 5px;
}
.bq-07__fig {
margin-block: 1.5em;
}
.bq-07__quote {
border-left: 4px solid var(--rule);
background: color-mix(in oklch,var(--rule) 10%,transparent);
padding: 14px 20px;
border-radius: 0 10px 10px 0;
font-family: Georgia,'Times New Roman',serif;
font-style: italic;
quotes: '\201C' '\201D' '\2018' '\2019';
}
.bq-07__quote p {
font-size: 1.05em;
line-height: 1.65;
color: var(--quiet);
}
.bq-07__quote p::before {
content: open-quote;
}
.bq-07__quote p::after {
content: close-quote;
}
.bq-07__quote q {
quotes: inherit;
font-weight: 600;
}
.bq-07__cap {
margin-top: 8px;
padding-left: 24px;
font-size: 13px;
color: var(--mut);
}
.bq-07__cap cite {
font-style: italic;
}
.bq-07__chip {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11.5px;
color: var(--mut);
padding: 7px 13px;
border: 1px solid oklch(0 0 0/.1);
border-radius: 99px;
background: oklch(1 0 0);
}
@media (prefers-reduced-motion: reduce) {
.bq-07 * {
transition-duration: .01ms !important;
}
}.bq-07,
.bq-07 *,
.bq-07 *::before,
.bq-07 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.bq-07 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
--bg: oklch(0.98 0.005 240);
--ink: oklch(0.26 0.015 250);
--quiet: oklch(0.44 0.015 250);
--mut: oklch(0.55 0.015 250);
--rule: oklch(0.62 0.1 250);
font-family: 'Segoe UI',system-ui,sans-serif;
color: var(--ink);
}
.bq-07__stage {
width: 100%;
height: 100vh;
height: 100svh;
display: grid;
place-items: center;
align-content: center;
gap: 26px;
padding: clamp(20px,5vw,56px);
background: var(--bg);
overflow-y: auto;
}
.bq-07__article {
max-width: 60ch;
font-size: 16px;
line-height: 1.7;
}
.bq-07__article h1 {
font-size: clamp(22px,3vw,30px);
letter-spacing: -.02em;
margin-bottom: 14px;
text-wrap: balance;
}
.bq-07__article>p {
color: var(--quiet);
text-wrap: pretty;
}
.bq-07__article>p+p,
.bq-07__fig+p {
margin-top: 14px;
}
.bq-07__article code {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: .86em;
background: oklch(0.93 0.01 250);
padding: 1.5px 6px;
border-radius: 5px;
}
.bq-07__fig {
margin-block: 1.5em;
}
.bq-07__quote {
border-left: 4px solid var(--rule);
background: color-mix(in oklch,var(--rule) 10%,transparent);
padding: 14px 20px;
border-radius: 0 10px 10px 0;
font-family: Georgia,'Times New Roman',serif;
font-style: italic;
quotes: '\201C' '\201D' '\2018' '\2019';
}
.bq-07__quote p {
font-size: 1.05em;
line-height: 1.65;
color: var(--quiet);
}
.bq-07__quote p::before {
content: open-quote;
}
.bq-07__quote p::after {
content: close-quote;
}
.bq-07__quote q {
quotes: inherit;
font-weight: 600;
}
.bq-07__cap {
margin-top: 8px;
padding-left: 24px;
font-size: 13px;
color: var(--mut);
}
.bq-07__cap cite {
font-style: italic;
}
.bq-07__chip {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11.5px;
color: var(--mut);
padding: 7px 13px;
border: 1px solid oklch(0 0 0/.1);
border-radius: 99px;
background: oklch(1 0 0);
}
@media (prefers-reduced-motion: reduce) {
.bq-07 * {
transition-duration: .01ms !important;
}
}Here's a working CSS Blockquote 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: Classic Left Border CSS Blockquote Snippet
Source: https://codefronts.com/snippets/css-blockquotes/classic-mark/
The canonical snippet — 4px solid left border, light wash, italic serif — that every CMS, CMS theme and CSS course reaches for first, written the way it should be written in 2026: tokens for every value, a wash derived with color-mix() instead of a hand-picked gray, spec-correct cite placement, and a smart-quotes bonus using the CSS quotes property so nested quotes get language-correct marks automatically. This is the one to teach from: every other demo in the collection is a mutation of these ten lines.
## HTML
```html
<section class="bq-07" aria-label="Classic left border blockquote demo">
<div class="bq-07__stage">
<article class="bq-07__article">
<h1>The ten lines everyone starts with</h1>
<p>Ask a room of developers to style a quote and most will type the same thing from muscle memory. As one CSS textbook puts it:</p>
<figure class="bq-07__fig">
<blockquote class="bq-07__quote">
<p>The left-border blockquote persists because it solves the real problem — <q>where does the quote end?</q> — with one line of CSS and no ambiguity.</p>
</blockquote>
<figcaption class="bq-07__cap">Sarah Drasner, <cite>Notes on Modern CSS</cite></figcaption>
</figure>
<p>Note the nested <em>inner quote</em> above: it got single marks automatically. That's the <code>quotes</code> property tracking depth — no hard-coded characters anywhere.</p>
</article>
<p class="bq-07__chip" aria-hidden="true">quotes · open-quote/close-quote · color-mix() wash</p>
</div>
</section>
```
## CSS
```css
.bq-07,
.bq-07 *,
.bq-07 *::before,
.bq-07 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.bq-07 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
--bg: oklch(0.98 0.005 240);
--ink: oklch(0.26 0.015 250);
--quiet: oklch(0.44 0.015 250);
--mut: oklch(0.55 0.015 250);
--rule: oklch(0.62 0.1 250);
font-family: 'Segoe UI',system-ui,sans-serif;
color: var(--ink);
}
.bq-07__stage {
width: 100%;
height: 100vh;
height: 100svh;
display: grid;
place-items: center;
align-content: center;
gap: 26px;
padding: clamp(20px,5vw,56px);
background: var(--bg);
overflow-y: auto;
}
.bq-07__article {
max-width: 60ch;
font-size: 16px;
line-height: 1.7;
}
.bq-07__article h1 {
font-size: clamp(22px,3vw,30px);
letter-spacing: -.02em;
margin-bottom: 14px;
text-wrap: balance;
}
.bq-07__article>p {
color: var(--quiet);
text-wrap: pretty;
}
.bq-07__article>p+p,
.bq-07__fig+p {
margin-top: 14px;
}
.bq-07__article code {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: .86em;
background: oklch(0.93 0.01 250);
padding: 1.5px 6px;
border-radius: 5px;
}
.bq-07__fig {
margin-block: 1.5em;
}
.bq-07__quote {
border-left: 4px solid var(--rule);
background: color-mix(in oklch,var(--rule) 10%,transparent);
padding: 14px 20px;
border-radius: 0 10px 10px 0;
font-family: Georgia,'Times New Roman',serif;
font-style: italic;
quotes: '\201C' '\201D' '\2018' '\2019';
}
.bq-07__quote p {
font-size: 1.05em;
line-height: 1.65;
color: var(--quiet);
}
.bq-07__quote p::before {
content: open-quote;
}
.bq-07__quote p::after {
content: close-quote;
}
.bq-07__quote q {
quotes: inherit;
font-weight: 600;
}
.bq-07__cap {
margin-top: 8px;
padding-left: 24px;
font-size: 13px;
color: var(--mut);
}
.bq-07__cap cite {
font-style: italic;
}
.bq-07__chip {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11.5px;
color: var(--mut);
padding: 7px 13px;
border: 1px solid oklch(0 0 0/.1);
border-radius: 99px;
background: oklch(1 0 0);
}
@media (prefers-reduced-motion: reduce) {
.bq-07 * {
transition-duration: .01ms !important;
}
}
```Here's a working CSS Blockquote 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: Classic Left Border CSS Blockquote Snippet
Source: https://codefronts.com/snippets/css-blockquotes/classic-mark/
The canonical snippet — 4px solid left border, light wash, italic serif — that every CMS, CMS theme and CSS course reaches for first, written the way it should be written in 2026: tokens for every value, a wash derived with color-mix() instead of a hand-picked gray, spec-correct cite placement, and a smart-quotes bonus using the CSS quotes property so nested quotes get language-correct marks automatically. This is the one to teach from: every other demo in the collection is a mutation of these ten lines.
## HTML
```html
<section class="bq-07" aria-label="Classic left border blockquote demo">
<div class="bq-07__stage">
<article class="bq-07__article">
<h1>The ten lines everyone starts with</h1>
<p>Ask a room of developers to style a quote and most will type the same thing from muscle memory. As one CSS textbook puts it:</p>
<figure class="bq-07__fig">
<blockquote class="bq-07__quote">
<p>The left-border blockquote persists because it solves the real problem — <q>where does the quote end?</q> — with one line of CSS and no ambiguity.</p>
</blockquote>
<figcaption class="bq-07__cap">Sarah Drasner, <cite>Notes on Modern CSS</cite></figcaption>
</figure>
<p>Note the nested <em>inner quote</em> above: it got single marks automatically. That's the <code>quotes</code> property tracking depth — no hard-coded characters anywhere.</p>
</article>
<p class="bq-07__chip" aria-hidden="true">quotes · open-quote/close-quote · color-mix() wash</p>
</div>
</section>
```
## CSS
```css
.bq-07,
.bq-07 *,
.bq-07 *::before,
.bq-07 *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
.bq-07 {
width: 100%;
min-height: 100vh;
min-height: 100svh;
display: block;
--bg: oklch(0.98 0.005 240);
--ink: oklch(0.26 0.015 250);
--quiet: oklch(0.44 0.015 250);
--mut: oklch(0.55 0.015 250);
--rule: oklch(0.62 0.1 250);
font-family: 'Segoe UI',system-ui,sans-serif;
color: var(--ink);
}
.bq-07__stage {
width: 100%;
height: 100vh;
height: 100svh;
display: grid;
place-items: center;
align-content: center;
gap: 26px;
padding: clamp(20px,5vw,56px);
background: var(--bg);
overflow-y: auto;
}
.bq-07__article {
max-width: 60ch;
font-size: 16px;
line-height: 1.7;
}
.bq-07__article h1 {
font-size: clamp(22px,3vw,30px);
letter-spacing: -.02em;
margin-bottom: 14px;
text-wrap: balance;
}
.bq-07__article>p {
color: var(--quiet);
text-wrap: pretty;
}
.bq-07__article>p+p,
.bq-07__fig+p {
margin-top: 14px;
}
.bq-07__article code {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: .86em;
background: oklch(0.93 0.01 250);
padding: 1.5px 6px;
border-radius: 5px;
}
.bq-07__fig {
margin-block: 1.5em;
}
.bq-07__quote {
border-left: 4px solid var(--rule);
background: color-mix(in oklch,var(--rule) 10%,transparent);
padding: 14px 20px;
border-radius: 0 10px 10px 0;
font-family: Georgia,'Times New Roman',serif;
font-style: italic;
quotes: '\201C' '\201D' '\2018' '\2019';
}
.bq-07__quote p {
font-size: 1.05em;
line-height: 1.65;
color: var(--quiet);
}
.bq-07__quote p::before {
content: open-quote;
}
.bq-07__quote p::after {
content: close-quote;
}
.bq-07__quote q {
quotes: inherit;
font-weight: 600;
}
.bq-07__cap {
margin-top: 8px;
padding-left: 24px;
font-size: 13px;
color: var(--mut);
}
.bq-07__cap cite {
font-style: italic;
}
.bq-07__chip {
font-family: ui-monospace,Menlo,Consolas,monospace;
font-size: 11.5px;
color: var(--mut);
padding: 7px 13px;
border: 1px solid oklch(0 0 0/.1);
border-radius: 99px;
background: oklch(1 0 0);
}
@media (prefers-reduced-motion: reduce) {
.bq-07 * {
transition-duration: .01ms !important;
}
}
```How this works
The snippet itself, in its final form — short enough to memorize, structured enough to theme:
blockquote{
border-left:4px solid var(--rule);
background:color-mix(in oklch, var(--rule) 10%, transparent);
padding:14px 20px; margin-block:1.5em;
border-radius:0 10px 10px 0;
font-family:Georgia, serif; font-style:italic;
quotes:'\201C' '\201D' '\2018' '\2019';
}
blockquote p::before{ content:open-quote; }
blockquote p::after{ content:close-quote; }The under-taught part is the last three lines. The quotes property defines pairs of marks by nesting depth; open-quote/close-quote then insert the right pair AND track depth — quote a quote and the inner one automatically gets single marks. Set lang='fr' on the page and browsers with built-in quote tables switch to « guillemets » without you touching CSS. This is the correct alternative to hard-coding “ characters into your HTML.
The wash color is the other upgrade: color-mix(in oklch, var(--rule) 10%, transparent) means the background is always a 10% tint of whatever the border is — change one token and border + wash stay related. Hand-picked pairs (#ccc border, #f7f7f7 wash) drift apart the first time someone re-themes.
Make it yours
- House color: set --rule to your brand accent; the wash follows automatically. Gray reads neutral-editorial, brand hue reads owned.
- No wash: delete the background line for the ultra-classic look (this is the WordPress default vibe); keep the radius 0 in that case.
- Straight edge: border-radius:0 makes it formal/academic; the 0 10px 10px 0 curve makes it friendly/product-y. This one property is most of the personality.
- Bigger quotes: for pull-quote duty bump font-size to 1.15em and drop the italic — italics at large sizes get harder to read, not fancier.
Gotchas — read before shipping
- Per the HTML spec, <cite> names a WORK (a book, a film), not a person — for people, use plain text in a figcaption. The demo shows the compliant markup.
- open-quote without a quotes property falls back to browser defaults, which are usually right — but define the property anyway so nesting depth is guaranteed.
- font-style:italic on a serif at 14px is fine; the same italic at 22px+ tires readers — the classic snippet doesn't scale up, which is why pull quotes (demo 11) drop it.
- margin-block collapses with adjacent paragraph margins — that's good (it's what keeps rhythm), so don't 'fix' it with padding on the article.
Browser support
| Chrome | Safari | Firefox | Edge |
|---|---|---|---|
| 114+ | 17.5+ | 121+ | 114+ |
Floor set by oklch(), color-mix(), text-wrap as this demo is written. The core technique itself goes back further — Chrome 111+.
quotes/open-quote are CSS 2.1 — twenty years universal. The floor is only the color-mix() wash; replace with a flat tint for effectively unlimited support.