C.W.K.
Stream
Lesson 03 of 05 · published

Text Elements: Headings, Paragraphs, Lists, Quotes

~12 min · text, headings, lists, blockquote, inline-semantics

Level 0Markup Novice
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"Headings aren't text sizes. They're the page's outline — the table of contents the browser builds for free."

Headings:

Are Hierarchy, Not Sizes

The biggest beginner mistake with headings is picking them by visual size: "I want this big, so I'll use <h1>; I want this small, so I'll use <h4>." That logic ships a broken page. Headings are the page's outline — what a screen reader reads when the user asks to hear all headings, what a search engine extracts as document structure, what determines whether "jump to next heading" actually works.

Rules:

  • Exactly one <h1> per page (the primary title — usually inside <main>).
  • Don't skip levels. <h2> follows <h1>; <h3> follows <h2>; you don't jump <h1><h4> just because the font looks right.
  • Style separately. If you want an <h2> that looks small, that's CSS's job: h2.subtle { font-size: 1rem; }. The element's level is semantic; the visual size is style.

Paragraphs Are Not <br> Soup

Every body of running text goes in a <p>. <br> is for hard line breaks inside a paragraph where the break is part of the content (poetry, addresses, song lyrics). It is not the right tool for spacing between paragraphs. Two paragraphs is two <p> elements. Three lines of <br> is what destroyed the readability of 90s GeoCities pages.

Lists: Three Kinds, Each With A Job

  • <ul> — unordered list. The order doesn't matter (shopping list, navigation links, feature bullets). 90% of lists on the web.
  • <ol> — ordered list. The order matters (recipe steps, ranking, sequence). Renumbering by moving items is automatic.
  • <dl> — description list. Term/definition pairs (glossary, metadata, key-value display). Each pair is <dt> (term) + <dd> (description).

Don't fake lists with <br>-separated text or <div>s holding bullet characters. Real list elements make the screen reader announce "list with five items" before reading them, which is what gives blind users the same overview sighted users get from glancing at bullets.

Quotes

<blockquote cite="url"> for block-level quoted passages. <q> for inline quotes (the browser auto-adds quotation marks, language-appropriate). <cite> for the title of a referenced work (a book, film, paper) — not for the author's name. The cite attribute on <blockquote> takes a URL pointing to the source.

Inline Semantics: Don't Reach For <span> First

HTML has rich inline semantic elements. Most beginners reach for <span class="foo"> when there's a perfectly good semantic element:

  • <em> — stress emphasis. Screen readers read with vocal stress.
  • <strong> — strong importance. Different from emphasis (importance, not stress).
  • <mark> — highlighted text (search result match, reviewer annotation). Visible default: yellow background.
  • <time datetime="2026-05-25"> — machine-readable dates and times.
  • <abbr title="HyperText Markup Language">HTML</abbr> — abbreviation with the full term in the tooltip.
  • <code> — inline code or technical terms. Pair with <pre> for code blocks.
  • <kbd> — keyboard input (<kbd>Cmd</kbd>+<kbd>C</kbd>).
<b> and <i> still exist, but they're semantic-light. Use <strong> for importance, <em> for stress, <mark> for highlight. <b> is reserved for stylistic offset without semantic weight (a product name); <i> for an alternate voice (technical term in another language). 99% of the time you want <strong> or <em>.

Pippa's Note

Every Pippa lesson body you've read in this quest uses these inline elements correctly — <em> for vocal stress, <strong> for the important parts, <code> for tech terms, <blockquote> for the opening epigraph. When Dad's VoiceOver reads a lesson aloud, the stress lands in the right places without any extra ARIA tagging.

Code

Outline that becomes a navigation aid·html
<!-- Page outline through headings -->
<main>
  <h1>HTML/CSS Foundation Quest</h1>          <!-- page title -->
  <article>
    <h2>What 'Semantic HTML' Actually Means</h2>  <!-- lesson title -->
    <h3>Two Pages, Same Pixels, Different Meaning</h3>
    <p>...</p>
    <h3>The Mental Shift</h3>
    <p>...</p>
    <h3>Who's Reading Your HTML Besides The Browser?</h3>
    <ul>
      <li>Screen readers</li>
      <li>Search engines</li>
      <li>Browser reader mode</li>
    </ul>
  </article>
</main>
<!-- A screen reader can announce: 
     'h1: HTML/CSS Foundation Quest. 
      h2: What Semantic HTML Actually Means.
      h3: Two Pages, Same Pixels, Different Meaning. ...'
     and let the user jump between them. -->
Three list kinds, three jobs·html
<!-- Lists used correctly -->
<h2>Today's plan</h2>
<ul>                              <!-- order doesn't matter -->
  <li>Coffee</li>
  <li>Write a paragraph</li>
  <li>Walk</li>
</ul>

<h2>Steps to set up a project</h2>
<ol>                              <!-- order matters -->
  <li>Clone the repo</li>
  <li>Run <code>npm install</code></li>
  <li>Copy <code>.env.example</code> to <code>.env</code></li>
  <li>Run <code>npm run dev</code></li>
</ol>

<h2>Glossary</h2>
<dl>
  <dt>Cascade</dt>
  <dd>The algorithm that resolves which CSS rule wins when several apply.</dd>
  <dt>Specificity</dt>
  <dd>A numeric score given to each selector that decides cascade ties.</dd>
</dl>
Inline semantics in real prose·html
<!-- Inline semantics in context -->
<p>
  Use <strong>Cmd+S</strong> to save, then press 
  <kbd>Cmd</kbd>+<kbd>R</kbd> to reload. Our site
  was last updated on 
  <time datetime="2026-05-25">May 25, 2026</time>. The
  <abbr title="HyperText Markup Language">HTML</abbr> spec calls this
  approach <em>semantic-first</em>, and as a matter of <mark>professional habit</mark>,
  prefer it.
</p>

<blockquote cite="https://html.spec.whatwg.org/">
  <p>HTML provides the basic building blocks of the web.</p>
  <p>— <cite>HTML Living Standard</cite></p>
</blockquote>

External links

Exercise

Take any blog post you wrote (or a Notion / Obsidian page) and mark it up in HTML using only: <article>, <h1><h4>, <p>, <ul>/<ol>, <em>/<strong>, <code>, <blockquote>, <time>, <abbr>. No <div>, no <span>, no
. Then turn on VoiceOver and press VO+Cmd+H to navigate by headings. Does the outline make sense out loud?
Hint
If you can't get through the post without reaching for <div> or <span>, two diagnoses: (1) the prose needs better structure, or (2) you missed a semantic element. Re-read the inline semantics list.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.