CSS Blockquotes: 16 Examples + the Markup Quotes Should Use

Out of the box, a blockquote is an indented block of text and little else. Borders, spacing, type and quotation marks all come from your stylesheet, and the HTML Standard wants the attribution outside the blockquote.

Below are 16 CSS blockquote examples you can try and copy, followed by a guide to the markup, the quotes property and accessible styling.

By Bogdan Sandu · Updated October 28, 2026

Blockquote markup, styled

Every quote here uses the pattern the HTML Standard describes: the quoted words in a blockquote, the credit in a figcaption outside it, and cite only around the title of a work. The styling changes, the markup does not.

Left border with a linked source

  • border-inline-start
  • cite attribute
  • figcaption link

Attribution for the quotation, if any, must be placed outside the blockquote element.

From the HTML Standard, the blockquote element

The classic rule on the start edge, written with logical properties so it flips on right-to-left pages. The cite attribute holds the source URL for machines, and because browsers never show it, the figcaption repeats it as a visible link. The quote itself is a sentence from the HTML Standard.

View code
.bq-rule {
  width: min(100%, 560px);
  margin: 0;
}
.bq-rule blockquote {
  margin: 0;
  padding: 20px 24px;
  border-inline-start: 5px solid #1f6f78;
  border-start-end-radius: 12px;
  border-end-end-radius: 12px;
  background: #fff;
  box-shadow: 0 8px 24px rgba(15, 40, 45, .08);
}
.bq-rule blockquote p {
  margin: 0;
  font-size: clamp(1.05rem, .95rem + .5vw, 1.25rem);
  line-height: 1.55;
  color: #17282c;
}
.bq-rule figcaption {
  margin-top: 12px;
  padding-inline-start: 29px;
  font-size: .9rem;
  line-height: 1.5;
  color: #45565b;
}
.bq-rule figcaption a {
  color: #145a61;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.bq-rule figcaption a:hover {
  color: #0b3a3f;
}
.bq-rule figcaption a:focus-visible {
  outline: 3px solid #1f6f78;
  outline-offset: 2px;
  border-radius: 2px;
}

Centered serif quote

  • text-align: center
  • max-inline-size
  • top rule

Typography is a quiet craft. When it works, nobody notices the type, only that the reading felt easy.

Ines ValcourtType director, Halden Press

A centered quote drops the side border, because a rule on one edge makes centered text look off balance. A short rule above the quote does the same job, the measure is capped in ch so lines stay readable, and the credit is set in small spaced capitals.

View code
.bq-center {
  width: min(100%, 600px);
  margin: 0;
  padding: clamp(28px, 6vw, 48px) clamp(20px, 5vw, 44px);
  border-radius: 6px;
  background: #fbf7f0;
  text-align: center;
}
.bq-center blockquote {
  max-inline-size: 30ch;
  margin: 0 auto;
}
.bq-center blockquote::before {
  content: "";
  display: block;
  width: 48px;
  height: 2px;
  margin: 0 auto 22px;
  background: #a0522d;
}
.bq-center blockquote p {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-size: clamp(1.3rem, 1.1rem + 1vw, 1.75rem);
  font-style: italic;
  font-weight: 400;
  line-height: 1.4;
  color: #2b2118;
}
.bq-center figcaption {
  display: grid;
  gap: 4px;
  margin-top: 22px;
}
.bq-center__name {
  font-size: .8rem;
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: #2b2118;
}
.bq-center__role {
  font-size: .85rem;
  color: #73543a;
}

Multi-paragraph quote with correct marks

  • open-quote
  • no-close-quote
  • quotes

We started by printing every page of the old site and taping it to the studio wall. Forty-one pages, and eleven different ways of showing a quote.

Some had borders, some had marks typed into the text, two were images of text. None of them matched the brand book.

So the first component we shipped was not the header or the button. It was the quote.

Dana Okafor, on the Lumen Health redesign

Book convention opens every paragraph of a long quote but closes only the last one. Each paragraph gets open-quote, every paragraph except the last ends with no-close-quote, which prints nothing but steps the nesting level back down, so the second paragraph opens with a double mark instead of a single one.

View code
.bq-multi {
  width: min(100%, 580px);
  margin: 0;
  padding: clamp(22px, 5vw, 34px);
  border-radius: 14px;
  background: #fff;
  border: 1px solid #dde3ee;
}
.bq-multi blockquote {
  margin: 0;
  quotes: "\201C" "\201D" "\2018" "\2019";
}
.bq-multi blockquote p {
  margin: 0 0 14px;
  font-size: 1.02rem;
  line-height: 1.65;
  color: #1c2433;
}
.bq-multi blockquote p:last-child {
  margin-bottom: 0;
}
.bq-multi blockquote p::before {
  content: open-quote;
  color: #b4462c;
  font-weight: 700;
}
.bq-multi blockquote p:not(:last-child)::after {
  content: no-close-quote;
}
.bq-multi blockquote p:last-child::after {
  content: close-quote;
  color: #b4462c;
  font-weight: 700;
}
.bq-multi figcaption {
  margin-top: 18px;
  padding-top: 14px;
  border-top: 1px solid #e6e9f0;
  font-size: .9rem;
  color: #4b5568;
}

Quote with a highlighted phrase

  • mark
  • box-decoration-break
  • emphasis added

The checkout was fine. The shipping estimate was the moment people left, and we had spent a month staring at the wrong screen.

Priya Raman, product lead at Tallow and Co. Emphasis added.

Inside a quotation, the mark element means a highlight you added, not one the speaker made, so the caption says so. box-decoration-break: clone gives each wrapped line of the highlight its own padding and rounded ends.

View code
.bq-mark {
  width: min(100%, 560px);
  margin: 0;
  padding: clamp(22px, 5vw, 32px);
  border-radius: 18px;
  background: #1d1d1f;
}
.bq-mark blockquote {
  margin: 0;
}
.bq-mark blockquote p {
  margin: 0;
  font-size: clamp(1.15rem, 1rem + .8vw, 1.45rem);
  font-weight: 500;
  line-height: 1.5;
  color: #f4f1ea;
}
.bq-mark mark {
  padding: .04em .22em;
  border-radius: 4px;
  background: #ffd95a;
  color: #1d1d1f;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}
.bq-mark figcaption {
  margin-top: 16px;
  font-size: .9rem;
  color: #bdb8ad;
}
.bq-mark figcaption em {
  color: #ffd95a;
}

Inline q quotes in four languages

  • q element
  • quotes: auto
  • lang attribute

The style guide was blunt: Never set a quote in capitals, and never label it Quote either.

Im Handbuch steht nur ein Satz: Gute Typografie ist unsichtbar.

La consigne était simple : Moins de couleurs, plus de contraste.

編集者のメモ:余白も文字の一部です。

Short quotes inside a sentence use q, and the browser adds the marks. With quotes: auto the marks follow the lang attribute, so the same rule prints curly quotes in English, low-high marks in German, guillemets in French and corner brackets in Japanese. The English line nests a q to show the second-level marks.

View code
.bq-inline {
  display: grid;
  gap: 10px;
  width: min(100%, 580px);
}
.bq-inline p {
  display: grid;
  grid-template-columns: 2.4rem 1fr;
  align-items: baseline;
  gap: 12px;
  margin: 0;
  padding: 14px 16px;
  border-radius: 12px;
  background: #fff;
  font-size: 1rem;
  line-height: 1.55;
  color: #1f2430;
}
.bq-inline__tag {
  display: inline-grid;
  place-items: center;
  min-height: 24px;
  border-radius: 6px;
  background: #e8ecf8;
  font-family: ui-monospace, Consolas, monospace;
  font-size: .8rem;
  color: #2c3a73;
}
.bq-inline q {
  quotes: auto;
  color: #2c3a73;
  font-weight: 600;
}

Right-to-left quote with logical properties

  • dir="rtl"
  • border-inline-start
  • padding-inline

Good design is not noticed. It is felt.

Layla Haddad, studio talk

التصميم الجيد لا يُلاحَظ، بل يُحَسّ.

ليلى حداد، حديث في الاستوديو

One rule set styles both quotes. border-inline-start, padding-inline-start and the start-edge radius properties follow the writing direction, so the Arabic quote gets its rule on the right without a single extra selector. With border-left the rule would stay on the wrong side.

View code
.bq-rtl {
  display: grid;
  gap: 14px;
  width: min(100%, 520px);
}
.bq-rtl__fig {
  margin: 0;
  padding-block: 16px;
  padding-inline: 22px 18px;
  border-inline-start: 5px solid #6d28d9;
  border-start-end-radius: 14px;
  border-end-end-radius: 14px;
  background: #fff;
  text-align: start;
}
.bq-rtl__fig blockquote {
  margin: 0;
}
.bq-rtl__fig blockquote p {
  margin: 0;
  font-size: 1.2rem;
  font-weight: 600;
  line-height: 1.6;
  color: #24164a;
}
.bq-rtl__fig figcaption {
  margin-top: 6px;
  font-size: .88rem;
  color: #574a73;
}

Editorial and pull quotes

Quotes that sit inside long-form pages: a pull quote with a hanging mark, a dark feature quote, a quote over a photo, and a quote with its own print stylesheet.

Pull quote with a hanging mark

  • hanging-punctuation
  • aside
  • container query

Most visitors read a sign once, at walking pace, while thinking about something else. The redesign of the Eastbank ferry terminal started from that fact, not from the brand colors.

The team cut the number of words on every panel by half and moved the gate numbers to the top. As the lead designer put it, the best sign is the one nobody has to read twice. Arrows now point at doors, not at corridors.

A pull quote repeats a line from the article, so it is an aside hidden from screen readers instead of a blockquote. The opening mark comes from ::before with open-quote, and hanging-punctuation: first pushes it into the margin where the browser supports it. Elsewhere a negative text-indent inside @supports not does the same job. The quote floats beside the text once the container is wide enough.

View code
.bq-pull {
  width: min(100%, 640px);
  container-type: inline-size;
}
.bq-pull__body {
  padding: clamp(20px, 5vw, 36px);
  border-radius: 14px;
  background: #fff;
}
.bq-pull__body > p {
  margin: 0 0 14px;
  font-size: .98rem;
  line-height: 1.7;
  color: #2a2f38;
}
.bq-pull__body > p:last-child {
  margin-bottom: 0;
}
.bq-pull__quote {
  margin: 4px 0 18px;
  padding: 14px 0 14px 18px;
  border-block: 2px solid #9a3412;
}
.bq-pull__quote p {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-size: 1.45rem;
  font-weight: 600;
  line-height: 1.3;
  color: #7c2d12;
  quotes: "\201C" "\201D";
  hanging-punctuation: first;
}
.bq-pull__quote p::before {
  content: open-quote;
  color: #c2410c;
}
.bq-pull__quote p::after {
  content: close-quote;
  color: #c2410c;
}
@supports not (hanging-punctuation: first) {
  .bq-pull__quote p {
    text-indent: -.45em;
  }
}
@container (min-width: 520px) {
  .bq-pull__quote {
    float: right;
    width: 44%;
    margin: 6px 0 12px 24px;
  }
}

Dark feature quote

  • content alt text
  • Fraunces
  • dark palette

We stopped designing pages and started designing states. The page is only the state you happen to land on first.

Marta KowalczykDesign lead, Fernhill Studio

The oversized mark is decoration, so it uses the content alternative-text syntax with an empty string after the slash. Browsers that do not parse that form keep the first declaration. Both text colors clear 4.5:1 on the dark card, which is the check people skip when they invert a light quote.

View code
.bq-dark {
  position: relative;
  width: min(100%, 580px);
  margin: 0;
  padding: clamp(56px, 10vw, 72px) clamp(22px, 5vw, 40px) clamp(26px, 5vw, 36px);
  border-radius: 20px;
  background: #16181d;
  border: 1px solid #2a2d35;
}
.bq-dark::before {
  content: "\201C";
  content: "\201C" / "";
  position: absolute;
  top: 6px;
  left: clamp(16px, 4vw, 32px);
  font-family: "Fraunces", Georgia, serif;
  font-size: 6.5rem;
  line-height: 1;
  color: #f5b041;
}
.bq-dark blockquote {
  margin: 0;
}
.bq-dark blockquote p {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-size: clamp(1.25rem, 1.05rem + 1vw, 1.7rem);
  font-weight: 400;
  line-height: 1.4;
  color: #f1ece2;
}
.bq-dark figcaption {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 12px;
  align-items: baseline;
  margin-top: 24px;
  font-size: .9rem;
}
.bq-dark__name {
  font-weight: 700;
  color: #f5b041;
}
.bq-dark__role {
  color: #a9a49a;
}

Quote over a photo with a scrim

  • grid stacking
  • object-fit
  • solid scrim

We stood at the edge for an hour and nobody said a word. Some views do the talking for you.

Jonas Eide, trail guide in Rogaland

The photo and the quote share one grid area, so the figure grows with the text instead of cutting it off. A solid translucent scrim sits behind the words only, which keeps white text above 4.5:1 even where the sky is almost white. The figcaption stays the last child of the figure, as the content model requires.

View code
.bq-photo {
  display: grid;
  grid-template-rows: minmax(150px, 1fr) auto auto;
  width: min(100%, 540px);
  min-height: 340px;
  margin: 0;
  overflow: hidden;
  border-radius: 18px;
  background: #0b1a2c;
}
.bq-photo__img {
  grid-area: 1 / 1 / 4 / 2;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 50% 60%;
}
.bq-photo__quote,
.bq-photo__cap {
  grid-column: 1;
  position: relative;
  background: rgba(6, 17, 31, .8);
}
.bq-photo__quote {
  grid-row: 2;
  margin: 0;
  padding: 22px clamp(18px, 5vw, 30px) 8px;
}
.bq-photo__quote p {
  margin: 0;
  font-family: "Fraunces", Georgia, serif;
  font-size: clamp(1.1rem, 1rem + .7vw, 1.4rem);
  line-height: 1.45;
  color: #fff;
}
.bq-photo__cap {
  grid-row: 3;
  padding: 4px clamp(18px, 5vw, 30px) 20px;
  font-size: .88rem;
  color: #d5e2ef;
}

Testimonials, reviews and social quotes

Customer words with the person behind them. The name, role and rating always sit in the figcaption or next to the quote, never inside the blockquote.

Testimonial with avatar and role

  • figcaption grid
  • initials avatar
  • content alt text

We moved our booking form over on a Friday afternoon. By Monday, no-shows were down and nobody at the front desk had to ask how it worked.

Nadia AlvarezPractice manager, Brightwater Dental

The avatar, name and role all live in the figcaption, so the blockquote holds only the words the customer said. The avatar is a monogram marked aria-hidden, since the name next to it already says who it is, and the decorative mark carries empty alternative text.

View code
.bq-testi {
  width: min(100%, 460px);
  margin: 0;
  padding: clamp(24px, 6vw, 34px);
  border-radius: 22px;
  background: #fff;
  box-shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 12px 32px rgba(16, 24, 40, .08);
}
.bq-testi blockquote {
  margin: 0;
}
.bq-testi blockquote::before {
  content: "\201C";
  content: "\201C" / "";
  display: block;
  height: 40px;
  font-family: "Fraunces", Georgia, serif;
  font-size: 4rem;
  line-height: 1;
  color: #0f766e;
}
.bq-testi blockquote p {
  margin: 0;
  font-size: 1.05rem;
  line-height: 1.65;
  color: #1f2a37;
}
.bq-testi figcaption {
  display: grid;
  grid-template-columns: 48px 1fr;
  align-items: center;
  gap: 14px;
  margin-top: 22px;
  padding-top: 18px;
  border-top: 1px solid #e7ebf0;
}
.bq-testi__avatar {
  display: grid;
  place-items: center;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: #0f766e;
  font-size: .9rem;
  font-weight: 700;
  letter-spacing: .04em;
  color: #fff;
}
.bq-testi__who {
  display: grid;
  gap: 2px;
}
.bq-testi__name {
  font-weight: 700;
  color: #111827;
}
.bq-testi__role {
  font-size: .88rem;
  color: #4b5563;
}

Social post quote card

  • figcaption first
  • time element
  • text only
Theo Kurtz@theokurtz.dev

Reminder: browsers never show the cite attribute on a blockquote. If readers should find the source, put the link in the caption.

214 reposts1,380 likes

A quoted post styled as a card, built from text alone, with no platform logo or embed script. The figcaption comes first here, which the figure content model allows, and the date sits in a time element with a machine-readable datetime.

View code
.bq-social {
  width: min(100%, 480px);
  margin: 0;
  padding: 18px 20px;
  border: 1px solid #dfe3e8;
  border-radius: 16px;
  background: #fff;
}
.bq-social__head {
  display: grid;
  grid-template-columns: 44px 1fr;
  align-items: center;
  gap: 12px;
}
.bq-social__avatar {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: #e4532c;
  font-size: .85rem;
  font-weight: 700;
  color: #fff;
}
.bq-social__id {
  display: grid;
  min-width: 0;
}
.bq-social__name {
  font-weight: 700;
  color: #0f1419;
}
.bq-social__handle {
  overflow: hidden;
  font-size: .9rem;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: #536471;
}
.bq-social__text {
  margin: 14px 0 0;
}
.bq-social__text p {
  margin: 0;
  font-size: 1.08rem;
  line-height: 1.5;
  color: #0f1419;
}
.bq-social__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 4px 16px;
  margin: 14px 0 0;
  padding-top: 12px;
  border-top: 1px solid #eff3f4;
  font-size: .85rem;
  color: #536471;
}

Product review with a star rating

  • rating as text
  • aria-hidden stars
  • figure

4 out of 5

Warm light, fiddly hinge

The light is soft enough for late evenings and the dimmer goes properly low. The hinge needed tightening after a week, which should not happen on a lamp at this price.

Sam Ortega, verified buyer, reviewing the Arlo desk lamp.

The stars are decoration, so they are hidden from assistive technology and the rating is written out as text right next to them. The review title and body sit inside the blockquote because they are the customer words, while the reviewer and date go in the figcaption.

View code
.bq-review {
  width: min(100%, 500px);
  margin: 0;
  padding: clamp(20px, 5vw, 28px);
  border-radius: 14px;
  background: #fffdf7;
  border: 1px solid #ece3cc;
}
.bq-review__rating {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 4px 10px;
  margin: 0;
}
.bq-review__stars {
  font-size: 1.3rem;
  letter-spacing: .08em;
  line-height: 1;
}
.bq-review__on {
  color: #b45309;
}
.bq-review__off {
  color: #d6ccb6;
}
.bq-review__score {
  font-size: .9rem;
  font-weight: 700;
  color: #3f3422;
}
.bq-review__text {
  margin: 14px 0 0;
}
.bq-review__text p {
  margin: 0;
  font-size: 1rem;
  line-height: 1.6;
  color: #2b2618;
}
.bq-review__text .bq-review__title {
  margin-bottom: 6px;
  font-size: 1.1rem;
  font-weight: 700;
}
.bq-review__by {
  margin-top: 14px;
  font-size: .85rem;
  line-height: 1.5;
  color: #6a5c3e;
}

Patterns that look like quotes

An interview transcript, a documentation callout and a row of quotes. Two of them are not blockquotes at all, and the notes explain which element fits instead.

Interview Q and A transcript

  • p and b
  • grid columns
  • container query

From an interview with type designer Ruth Amsel, Margin Notes, issue 14.

Margin NotesWhy did you redraw the quotation marks before anything else?

Ruth AmselBecause they sit at the very edge of a paragraph. If they are too heavy, every quote looks like it starts with a stain.

Margin NotesAnd the fix?

Ruth AmselLighter, smaller, and hung outside the text block, so the words line up and the marks do not.

HTML has no element for conversations, and the HTML Standard suggests plain paragraphs with the speaker name in a b or span element. That is what this transcript uses. The names sit in their own column on wide screens and stack above each answer when the container gets narrow.

View code
.bq-qa {
  width: min(100%, 600px);
  padding: clamp(18px, 5vw, 30px);
  border-radius: 14px;
  background: #fff;
  container-type: inline-size;
}
.bq-qa__intro {
  margin: 0 0 16px;
  font-size: .88rem;
  font-style: italic;
  color: #4b5563;
}
.bq-qa__line {
  display: grid;
  gap: 2px;
  margin: 0;
  padding: 10px 0;
  border-top: 1px solid #edf0f4;
  font-size: 1rem;
  line-height: 1.6;
  color: #1f2937;
}
.bq-qa__who {
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: #1e40af;
}
.bq-qa__line--q {
  font-weight: 600;
  color: #111827;
}
.bq-qa__line--q .bq-qa__who {
  color: #9d174d;
}
@container (min-width: 460px) {
  .bq-qa__line {
    grid-template-columns: 9.5rem 1fr;
    gap: 16px;
  }
  .bq-qa__who {
    padding-top: .2em;
  }
}

Documentation callout as an aside

  • aside
  • aria-labelledby
  • not a blockquote

Set the cite attribute of a blockquote to the URL of the source document.

Docs often style notes and warnings like quotes, with a side rule and a tint. They are not quotations, so blockquote is the wrong element. An aside with a visible label names the region for screen readers, and the icon is decorative SVG.

View code
.bq-doc {
  display: grid;
  gap: 12px;
  width: min(100%, 580px);
  padding: clamp(18px, 5vw, 28px);
  border-radius: 12px;
  background: #fff;
  font-size: .95rem;
  line-height: 1.6;
  color: #24292f;
}
.bq-doc p {
  margin: 0;
}
.bq-doc code {
  padding: .1em .35em;
  border-radius: 5px;
  background: #eef1f5;
  font-family: ui-monospace, Consolas, monospace;
  font-size: .85em;
  color: #1f2328;
  white-space: nowrap;
}
.bq-doc__note {
  display: grid;
  gap: 6px;
  padding: 12px 16px;
  border-inline-start: 4px solid #0969da;
  border-radius: 6px;
  background: #eef5ff;
}
.bq-doc__title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 700;
  color: #0550ae;
}
.bq-doc__note--warn {
  border-inline-start-color: #9a6700;
  background: #fff8e5;
}
.bq-doc__note--warn .bq-doc__title {
  color: #7d4e00;
}
.bq-doc__note code {
  background: rgba(255, 255, 255, .8);
}

Swipeable row of quotes

  • scroll-snap
  • focusable region
  • no script

Setup took one coffee. The second coffee was spent admiring the reports.

Omar Haddad, Finch Bakery

Our volunteers stopped asking me where the rota lives. That alone was worth it.

Grace Liu, Northside Food Bank

Clients pay invoices faster when the invoice actually looks like it came from us.

Ben Achterberg, Kestrel Joinery

Need arrows, dots or autoplay? That is a slideshow, and the CSS slideshow examples cover it.

Swipe or scroll the row sideways, or focus it and use the arrow keys.

Three testimonials in a native scroll-snap row, with no script and no autoplay. The scroller is a labelled, focusable region so keyboard users can scroll it with the arrow keys. Arrows, dots and timed rotation turn it into a slideshow, which is a separate component with its own accessibility work.

View code
.bq-row {
  width: min(100%, 600px);
}
.bq-row__track {
  display: grid;
  grid-auto-flow: column;
  grid-auto-columns: min(82%, 380px);
  gap: 14px;
  padding: 6px 4px 14px;
  overflow-x: auto;
  overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory;
  scroll-padding-inline: 4px;
  border-radius: 12px;
}
.bq-row__track:focus-visible {
  outline: 3px solid #4338ca;
  outline-offset: 2px;
}
.bq-row__card {
  display: grid;
  align-content: space-between;
  gap: 16px;
  margin: 0;
  padding: 22px;
  border-radius: 16px;
  background: #fff;
  border-top: 4px solid #4338ca;
  scroll-snap-align: start;
}
.bq-row__card:nth-child(2) {
  border-top-color: #0e7490;
}
.bq-row__card:nth-child(3) {
  border-top-color: #be123c;
}
.bq-row__card blockquote {
  margin: 0;
}
.bq-row__card blockquote p {
  margin: 0;
  font-size: 1.05rem;
  line-height: 1.55;
  color: #1e1b3a;
}
.bq-row__card figcaption {
  font-size: .85rem;
  font-weight: 600;
  color: #4b4f63;
}
.bq-row__more {
  margin: 6px 4px 0;
  font-size: .88rem;
  line-height: 1.5;
  color: #3f4356;
}
.bq-row__more a {
  color: #3730a3;
  text-underline-offset: 3px;
}
.bq-row__more a:focus-visible {
  outline: 3px solid #4338ca;
  outline-offset: 2px;
}
@media (prefers-reduced-motion: no-preference) {
  .bq-row__track {
    scroll-behavior: smooth;
  }
}

What is a CSS blockquote?

When a stylesheet takes over the indent, border, spacing and type of a blockquote element, the HTML container for extended quotations from another source, you get what people call a CSS blockquote.

The element only says the text is quoted. How it looks is left to CSS.

The underlying HTML markup carries no design beyond the indent, so one quote can be a sidebar rule under one stylesheet and a card under another. A pull-style callout works too.

Blockquote, q and cite compared

The blockquote element is block-level and meant for extended quotations. Browsers indent it but add no quotation marks (DAISY Accessible Publishing Knowledge Base).

The q element does the same job inside a sentence, for short quotations, and browsers insert language-appropriate quotation marks on their own, according to MDN Web Docs. The cite element is something else again. It marks the title of a creative work and renders in italics by default (MDN Web Docs).

Placement is what decides it. If the quote sits inside a sentence, it’s q. If it stands on its own lines, it’s blockquote.

Default browser styles

Every browser shows the same blockquote defaults, because the HTML Standard’s rendering rules define them.

  • Margin of 1em at the top and bottom (HTML Standard, rendering rules)
  • 40px of margin on the start and end sides (HTML Standard, rendering rules)
  • Display set to block (HTML Standard, rendering rules)
  • An implicit ARIA role of blockquote (MDN Web Docs)
  • Baseline widely available, and available across browsers since July 2015 (MDN Web Docs)

MDN Web Docs points to the margin properties as the way to change that indent.

The rule itself has changed shape over time. Older stylesheets wrote it with physical properties, margin-left: 40px and margin-right: 40px in the CSS 2.1 sample style sheet, while the current standard writes the indent as margin-inline: 40px, so it follows the writing direction.

How to mark up a quote and its source

The quoted text goes in a blockquote, the blockquote goes in a figure, and the figcaption sits beside it, outside the blockquote. Only the title of the work goes inside cite.

The HTML Standard requires attribution to sit outside the blockquote. Its own example credits a Carl Sagan passage through a figcaption, and a plain paragraph after the quote works just as well.

<figure>
  <blockquote cite="https://example.com/source-article">
    <p>The quoted passage goes here.</p>
  </blockquote>
  <figcaption>
    Author Name, <cite>Title of the Work</cite>
  </figcaption>
</figure>

The cite attribute takes a URL to the source document. Browsers do not render it, so it never replaces a visible credit, and a clickable source needs an anchor element inside the figcaption.

The DOM exposes the value as the cite property of HTMLQuoteElement (MDN Web Docs).

The cite element holds a title, not a person. The HTML Standard forbids people’s names inside it, so the author goes in plain text next to it.

The W3C’s own HTML 5.2 Recommendation allowed the name of the author in cite. That text is gone from practice, since the W3C HTML spec has redirected to the WHATWG version since 2019 (Adrian Roselli).

The current standard puts attribution outside the blockquote, and MDN’s own blockquote example puts nothing but the quoted text inside it. Older drafts allowed it inside, and plenty of tutorials still do it that way. The Nu Html Checker accepts a footer in there too, because validators cannot enforce the rule (Adrian Roselli, DAISY Knowledge Base).

I’d go with the outside pattern. It’s the only one the current standard supports, and the figcaption doubles as a styling hook.

CSS copied from older tutorials usually targets blockquote footer or blockquote cite. A figcaption outside the blockquote stays unstyled until the selector changes.

How to style a blockquote with CSS

Start with the margin, since everything else sits on top of it.

  1. Reset the margin. Replace the 1em and 40px defaults with your own spacing, and reset the figure too, because the standard gives it the same 40px inline margin.
  2. Add a border on the inline-start edge with border-inline-start, in a color from your palette.
  3. Padding comes next, enough for the text to clear the border. A background tint is optional, and only worth it if the text still passes the contrast check.
  4. Set font-size and line-height. Italics make sense only when the quote runs a line or two.
  5. Give the attribution its own figcaption rule, and reset cite to normal style if the italics clash.
blockquote {
  margin: 2rem 0;
  padding: 0.5rem 1.25rem;
  border-inline-start: 4px solid #2f6f8f;
  background-color: #f3f7f9;
  font-size: 1.125rem;
  line-height: 1.6;
}

figure {
  margin: 2rem 0;
}

figure blockquote {
  margin: 0;
}

figcaption {
  margin-top: 0.5rem;
  font-size: 0.9rem;
}

border-inline-start has worked across browsers since January 2020 (MDN Web Docs) and is Baseline widely available, so it needs no fallback in current browsers. On a right-to-left page the border moves to the right edge by itself, where border-left would stay put.

A tinted background lowers the color contrast of the text. WCAG Success Criterion 1.4.3 sets the minimum at 4.5:1 for normal text and 3:1 for large text, and the W3C’s Understanding document adds that ratios are not rounded, so 4.499:1 fails.

A bare blockquote selector also hits quotes inside comments and third-party widgets, so scope the rule with a class or a content wrapper.

Nesting is the other catch. A blockquote inside a blockquote repeats the border and padding, and since the HTML Standard’s examples include nested blockquotes, a blockquote blockquote rule that lightens or drops the inner border is worth adding.

Adding quotation marks with the quotes property and pseudo-elements

Browsers add no quotation marks to a blockquote (DAISY Knowledge Base). You generate them with ::before and ::after, set content to open-quote and close-quote, and let the quotes property choose the characters.

blockquote {
  quotes: "\201C" "\201D" "\2018" "\2019";
}

blockquote p:first-of-type::before {
  content: open-quote;
}

blockquote p:last-of-type::after {
  content: close-quote;
}

Each pair of strings in the quotes property is an opening and a closing mark, and every further pair serves the next nesting level (MDN Web Docs). quotes: auto picks marks that suit the language set by the lang attribute, and quotes: none makes open-quote and close-quote produce nothing.

For a large decorative mark, give ::before a font-size in em units so the glyph scales with the quote text. Position it absolutely against a relatively positioned blockquote.

hanging-punctuation: first pushes the opening mark outside the text edge so the words stay aligned. As of October 2026 the web-features dataset still classes it as limited availability, and Safari is the engine that ships it (Adactio).

Where it’s missing, a negative text-indent inside an @supports not (hanging-punctuation: first) block does a similar job. The hung mark can trigger a horizontal scrollbar when the text has no spare space at its edge.

Whether a block quote should carry marks at all is a style question. Chicago-style guidance sets prose of five or more lines as a block with no quotation marks, because the indent already signals the quotation (Seattle University Library’s Chicago guide).

Long extracts follow that convention and keep the border or indent as the only signal. Short testimonials are where decorative marks earn their place.

Never type marks into the HTML and generate them in CSS as well, or readers see both.

Which blockquote style fits your content?

Long extracts inside body copy suit a plain border rule. Grids of short quotes do better as background cards, a single line lifted from the same article calls for a pull quote, and customer quotes with a name and role want a testimonial layout.

PatternBest forMarkupFails when
Border ruleLong extracts in articlesblockquoteThe quote is one short line and the rule outweighs it
Background cardGrids of short quotesblockquote inside a cardThe tint pushes the text under the contrast minimum
Pull quoteOne line repeated from the articleaside, or blockquote with aria-hiddenScreen reader users hear the line twice
TestimonialCustomer quotes with name and roleblockquote plus figcaptionThe name or avatar sits inside the blockquote

The border rule is quiet and cheap, and it reads as a quotation without any decoration. The catch is little emphasis on a one-line quote.

A background card turns each quote into a self-contained unit, though the fill competes with the surrounding text and needs its own contrast check.

Pull quotes draw skimmers into the article. They also duplicate text and need deliberate markup.

Testimonials give the attribution as much weight as the quote, at the price of the most markup and the most CSS.

A pull quote repeats text that already sits in the article, so it fails the HTML Standard’s requirement that blockquote content be quoted from another source.

component.gallery recommends an aside here, with a q or blockquote nested inside only when the line also comes from another source. The DAISY Knowledge Base goes the other way with a duplicated blockquote that has the doc-pullquote role and aria-hidden, so assistive technology skips the repeat. That role comes from the digital publishing extension of ARIA.

Card styles suit testimonial grids, where each quote already lives in its own box, the same logic behind most card layouts built in CSS.

For quotes inside running text, skip the card. A tinted box splits the reading flow, and the border rule does the same job with less weight.

Responsive, dark mode and accessible blockquote styles

The clamp() function handles scaling for type and padding, and a prefers-color-scheme block handles colors. Meaning should stay in the HTML either way, because generated content is not announced the same way everywhere.

Responsive and dark mode

The clamp() function takes a minimum, a preferred value and a maximum, and it has worked across browsers since July 2020 (MDN Web Docs).

blockquote {
  padding: clamp(0.75rem, 2vw, 1.5rem);
  font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem);
  overflow-wrap: break-word;
  color: var(--quote-text);
  background-color: var(--quote-bg);
  border-inline-start: 4px solid var(--quote-rule);
}

:root {
  --quote-text: #1d2a33;
  --quote-bg: #f3f7f9;
  --quote-rule: #2f6f8f;
}

@media (prefers-color-scheme: dark) {
  :root {
    --quote-text: #e6edf1;
    --quote-bg: #1b252c;
    --quote-rule: #6db3d1;
  }
}

Keep a rem term in the preferred value so browser zoom still scales the text. Pair the quote with the responsive typography rules used for body copy so it never outgrows its column.

Put the palette swap inside a media query and define colors as custom properties, so the blockquote rule itself stays untouched. The prefers-color-scheme feature became available across browsers in January 2020 (MDN Web Docs), and the web-features dataset dates its Baseline widely available status to 15 July 2022.

Run the contrast check again on the dark palette. A pass in light mode does not carry over.

Accessibility

Sources disagree about the figure wrapper. Adrian Roselli’s 2023 tests in NVDA, JAWS, Orca and macOS VoiceOver found the figure and figcaption pattern unnecessarily verbose, according to Garrett Dimon’s summary, while the DAISY Knowledge Base says the figure choice does not significantly change the experience for assistive technology users.

The difference is method. Roselli compared actual announcements, and DAISY gives general markup guidance.

That makes the figure wrapper a trade-off, not a requirement. Where verbosity matters, a paragraph after the blockquote keeps attribution outside the quote and satisfies the same rule.

The same tests found that no screen reader used the cite attribute, and JAWS read the URL aloud (Roselli, via Dimon).

Generated marks are a separate problem. MDN’s content page says CSS-generated text is not in the DOM, so some assistive technology and browser combinations will not announce it. Sara Soueidan notes that Chrome and Firefox now expose pseudo-elements in the accessibility tree.

Treat a decorative glyph as decoration either way. The blockquote role already announces the quotation, so the glyph adds nothing for screen reader users.

blockquote::before {
  content: "\201C";
  content: "\201C" / "";
}

The slash syntax supplies empty alternative text and marks the glyph as decorative. Browsers that do not parse it drop the second declaration and keep the first, as a Mozilla Bugzilla discussion of the feature notes.

Blockquote output in Bootstrap, Tailwind CSS and WordPress

Bootstrap styles blockquote through opt-in classes. Add .blockquote to the element, wrap it in a figure, and use a figcaption with .blockquote-footer for the source. Text utilities such as text-center and text-end on the figure align the quote (Bootstrap 5.3 documentation).

Tailwind CSS resets blockquote margin to 0 through Preflight, so the quote has no indent until you add utility classes, according to the Tailwind CSS documentation. The first-party typography plugin restyles raw HTML such as blockquote through its prose class, per the plugin’s documentation, and Tailwind projects that publish long articles usually reach for it.

WordPress works differently. The core/quote block saves the quote text in a blockquote and the citation in a cite element, and it ships 2 block styles, Default and Plain (the block’s block.json in the Gutenberg repository).

They also disagree on where attribution lives. Bootstrap’s documentation follows the standard and keeps it outside, while the Quote block’s saved markup places the cite element inside the blockquote (Gutenberg source).

Selectors written for one pattern miss the other, so a stylesheet shared across builders needs both. To restyle .blockquote without editing the framework, override Bootstrap’s CSS in a stylesheet that loads after it, and scope your selectors with a class so the two rule sets do not fight.

CSS blockquote FAQ

How do you center a blockquote?

Set text-align: center on the blockquote. To center the box itself, add a max-inline-size and margin-inline: auto.

Swap a one-sided border for a top or bottom rule, because a rule on a single side makes a centered quote look misaligned.

Can a blockquote have a hover effect?

Yes. Add a :hover rule with a transition on color, background-color or border-color, and wrap the transition in a prefers-reduced-motion: no-preference query.

A blockquote is not focusable and touch screens have no hover, so keep information out of the hover state.

Does the style attribute work on a blockquote?

Yes. A style attribute overrides rules from a style tag or an external stylesheet and affects only that one blockquote (Dofactory HTML reference).

It cannot hold a media query or a pseudo-element, so quotation marks and dark mode still belong in a stylesheet.

Should a blockquote carry schema.org Quotation markup?

It’s optional and never replaces the blockquote element. The Quotation type is a CreativeWork subtype that describes a quote in structured data with properties such as text, creator and isPartOf.

Adoption stays small, since schema.org’s usage counter lists both the Quotation type and its spokenByCharacter property at 1K to 10K domains (Google, August 2026).

Can a blockquote hold more than one paragraph?

Yes, and another blockquote as well. The content model is flow content, so a blockquote takes several paragraphs, lists or nested quotes.

The HTML Standard’s own examples nest one blockquote inside another.

Keeping CSS Blockquote Styles Consistent Across a Site

CSS blockquote styles stay consistent when one scoped rule set, loaded after any framework stylesheet, governs every quote and keeps its colors in custom properties.

Fix the attribution markup first, because selectors written for a footer inside the blockquote miss a figcaption outside it. Write the scoped rule set after that, and test dark mode and narrow screens last.

A class-based scope shields comments and widgets, but older posts without the class stay unstyled until someone migrates them.

As of October 2026 only Safari ships hanging-punctuation, and the negative text-indent fallback can go once Chrome and Firefox follow.

Type settings are the next layer to audit, and the guide to accessible typography covers how font size, line height and spacing hold up for readers.