LEARNING OBJECTIVES ⌵
- Master the Master Semantic Layout Decision Tree to evaluate and choose the exact HTML element for any UI component.
- Resolve the definitive differences between
<article>vs<section>vs<div>vs<aside>. - Understand the scoping rules of
<header>and<footer>when used at the document root level versus nested inside an<article>or<section>. - Map HTML5 semantic elements to accessibility landmark roles in assistive technology screen readers.
- Execute an architectural audit of complex multi-pane application layouts to ensure pristine semantic integrity.
📖 The Mental Model & Story (Intuitive Foundation)
Imagine a master carpenter building a luxury house. The carpenter has a specialized toolchest containing precision tools:
- A heavy framing hammer for load-bearing timber (
<main>). - A specialized router for door frames (
<header>). - A miter saw for window trim (
<section>). - Plain rolls of duct tape (
<div>).
+-------------------------------------------------------------------------------+
| THE CARPENTER'S TOOLCHEST |
| |
| - A novice carpenter uses duct tape (<div>) for every joint, frame, and roof |
| beam. The house might stand for a few days, but the first inspection fails. |
| |
| - An over-zealous apprentice tries to carve every single nail using a miter |
| saw (<section>), creating unnecessary complex carvings everywhere. |
| |
| - The MASTER CARPENTER selects the EXACT tool engineered for each specific |
| joint, using duct tape (<div>) only when bundling wires behind the wall! |
+-------------------------------------------------------------------------------+
Architecting semantic HTML is identical. We don't avoid <div> completely out of dogmatism, nor do we drown our page in generic tags. We follow a clear, deterministic decision tree.
Technical Deep Dive & Specifications
The Master Semantic Decision Tree
Whenever you are about to write an opening tag for a container or component, follow this sequential decision flow:
+----------------------------------+
| WHAT AM I WRITING MARKUP FOR? |
+----------------------------------+
|
+---------------------------+---------------------------+
| |
[Top-Level Landmarks] [Component Containers]
| |
v v
Is it the central unique Does it make complete sense on its
content of the page? own if syndicated in an RSS feed?
--> YES: <main> --> YES: <article>
--> NO: continue --> NO: continue
| |
Is it primary site navigation? Is it a thematic grouping of content
--> YES: <nav> that requires a heading?
--> NO: continue --> YES: <section>
| --> NO: continue
Is it introductory masthead / banner? |
--> YES: <header> Is it tangentially related to the main
--> NO: continue content (callout, sidebar, ad)?
| --> YES: <aside>
Is it copyright, colophon, or footer? --> NO: continue
--> YES: <footer> |
--> NO: continue Is it solely for CSS Flexbox/Grid,
decorations, or scripting?
--> YES: <div>
In-Depth Semantic Battles
Battle 1: <article> vs <section>
<article>: Represents a self-contained, independent composition that could be distributed or republished independently (e.g., in an RSS feed, a widget, or another website). Examples: A blog post, a user review, a news article, a standalone forum comment, an interactive dashboard widget.<section>: Represents a generic thematic section of a document. It should typically have an<h2>-<h6>heading. A<section>is a chapter or subsection within a larger whole.
WHICH CAN NEST INSIDE WHICH?
BOTH! You can nest <section> inside <article>, OR <article> inside <section>!
Example A: A single article with sections:
<article>
<h1>The Web Layout Engine</h1>
<section><h2>History</h2><p>...</p></section>
<section><h2>Modern CSS</h2><p>...</p></section>
</article>
Example B: A section containing multiple articles:
<section>
<h2>Customer Reviews</h2>
<article><h3>Review by Alice</h3><p>...</p></article>
<article><h3>Review by Bob</h3><p>...</p></article>
</section>
Battle 2: Document <header> vs Article <header>
The <header> element is scoped to its nearest ancestor sectioning container:
- When placed directly in
<body>, it represents the Page Banner landmark (role="banner"). - When placed inside
<article>or<section>, it is NOT a page banner; it represents the introductory metadata header for that specific article or section (role="generic"or section header).
Battle 3: <aside> Scoping
- At the page root level: Represents the Page Sidebar / complementary information (
role="complementary"). - Inside an
<article>: Represents a Pullquote, related glossary note, or tangential side-comment for that specific article.
Accessibility Landmark Mapping Matrix
Modern screen reader users navigate websites using Landmark Navigation shortcuts (e.g. D in NVDA/JAWS, VO + U Rotor in Apple VoiceOver):
| HTML5 Element | Implicit ARIA Role | Screen Reader Landmark Announced | Best Practice Guidelines |
|---|---|---|---|
<header> (in <body>) |
role="banner" |
"Banner" | Exactly one per page at root level. |
<main> |
role="main" |
"Main landmark" | Exactly one visible <main> per document. |
<nav> |
role="navigation" |
"Navigation" | Add aria-label="Primary" or aria-label="Pagination" to distinguish multiple navs. |
<aside> |
role="complementary" |
"Complementary" | Sidebar, related links, promotional callouts. |
<footer> (in <body>) |
role="contentinfo" |
"Content information" | Copyright, privacy policy, footer links. |
<section> |
role="region" (only if labeled) |
"Region: [Label]" | MUST have aria-labelledby="heading-id" or aria-label to become a landmark! |
<article> |
role="article" |
"Article" | Self-contained syndicated units. |
<div> |
role="generic" |
(None / Ignored) | Use strictly for CSS styling and layout grouping. |
💻 Interactive Code Playground
Starter Code
Line-by-Line Code Breakdown
- Line 90 (
<header class="site-header">): Top-level banner landmark containing branding and user profile. - Line 99 (
<div class="app-layout">): A<div>is used intentionally because this container exists solely to establishdisplay: flexbetween the sidebar and the main content area. - Line 102 (
<nav class="app-sidebar" aria-label="Application Navigation">): Dedicated navigation landmark with an explicitaria-labelidentifying its role. - Line 112 (
<main class="app-main" id="main-content">): Exactly one<main>landmark defining the central unique content of the page. - Lines 123 & 131 (
<article class="dashboard-card" aria-labelledby="...">): Each widget is an independent<article>with its heading tied viaaria-labelledby.
Expected Browser Render Output
+-------------------------------------------------------------------------------+
| CloudPulse OS Admin: root@cloudpulse |
+-------------------------------------------------------------------------------+
| [NAVIGATION] | System Overview |
| > Dashboard | Real-time infrastructure monitoring telemetry. |
| Clusters | |
| Security | +------------------------+ +----------------------------+ |
| Billing | | Cluster Health | | API Gateway Throughput | |
| | | 99.98% | | 48.2k req/sec | |
| | | All 24 nodes healthy | | Latency: 1.2ms avg | |
| | +------------------------+ +----------------------------+ |
+-------------------------------------------------------------------------------+
| (c) 2026 CloudPulse Systems Inc. • All Rights Reserved. |
+-------------------------------------------------------------------------------+🏋️ Hands-On Exercise
🎯 The Challenge: The Full-Page Semantic Architectural Audit
Scenario: A marketing agency built a landing page using 100% <div> tags. Your task is to perform an architectural audit and rewrite the HTML so that:
- The top header is marked as
<header>with an embedded<nav>. - The central content is wrapped in
<main>. - The feature grid section is wrapped in
<section aria-labelledby="features-heading">containing three<article>feature cards. - The related sidebar testimonial is wrapped in an
<aside>. - The bottom area is wrapped in
<footer>.
🏁 Starter Code Sandbox
⚠️ Common Pitfalls
- Adding Redundant
role="main"to<main>: In modern HTML5,<main>automatically has implicit ARIArole="main". Addingrole="main"is unnecessary noise. - Using
<section>Without an Accessible Name: A<section>element does NOT generate aregionlandmark in assistive technologies unless it has anaria-labelledbyoraria-labelattribute. - Having Multiple
<main>Elements Visible Simultaneously: A document must contain only one visible<main>element at any time.
💡 Pro Tips
- Add "Skip to Main Content" Links: Always place a hidden skip link as the very first child of
<body>(<a href="#main-content" class="sr-only-focusable">Skip to Main Content</a>). This allows keyboard and screen reader users to bypass long navigation menus instantly. - Use
<section>for Thematic Chunks with Headings: If a chunk of content doesn't deserve a heading (<h2>-<h6>), it usually doesn't deserve to be a<section>. Use a<div>instead.
📌 Key Takeaways
- Use the Master Semantic Decision Tree to evaluate components based on standalone syndication (
<article>), thematic grouping (<section>), or pure styling (<div>). <main>marks the primary unique content of the page; exactly one visible<main>is permitted per document.<header>and<footer>can be scoped to the whole page (role="banner"/role="contentinfo") or locally inside<article>/<section>.<section>only becomes a screen-reader accessible landmark if it is labeled viaaria-labelledbyoraria-label.- Use
<div>intentionally for CSS Grid/Flexbox layout wrappers, container constraints, and decorative graphics. - --