ON THIS PAGE 12 sections
Semantic HTML is the difference between drawing a page and publishing a document.
Both can look identical. The document also exposes what is navigation, what is primary content, which heading owns a section, where a link leads, what a table compares, and which control performs an action. That meaning is useful to browsers, accessibility APIs, crawlers, parsers, QA tools, and humans reading the source.
The SEO case is practical, not mystical: make the intended interpretation visible and testable.
What semantic HTML actually means
MDN defines semantics as the meaning or role of a piece of code. In HTML, the element itself communicates that role.
<nav> identifies navigation. <main> identifies the page’s dominant content. <article> marks a self-contained composition. <h1> through <h6> establish heading levels. <a href> exposes a destination. <button> exposes an action.
A generic div has no such meaning. It is useful as a layout wrapper, but a page made entirely of generic wrappers forces every consumer to infer structure from class names, visual placement, scripts, or surrounding text.
Semantic HTML does not require a novelty element for every block. The goal is a small, honest document model.
The document inspector
Open DevTools and ignore the visual design for a moment. Inspect the raw HTML and ask:
- Can I identify the page’s main content?
- Does the heading hierarchy describe the document without CSS?
- Are navigation destinations real links with resolvable URLs?
- Are actions native buttons with accessible names?
- Do lists and tables preserve relationships in their markup?
- Does the source contain the primary content, or does it depend on a later request?
This is not only an accessibility exercise. It is a way to remove ambiguity from the search delivery system described in the technical SEO pillar.
Semantics expose roles, hierarchy, destinations, and reading order in the document itself.
The div-shaped interface
<div class="header">
<div onclick="goHome()">Brand</div>
</div>
<div class="title">Technical SEO</div>
<div class="copy">...</div>
<div class="link" onclick="openPost()">Read</div> - No native landmark structure
- Click handlers hide destinations
- Heading hierarchy exists only visually
The semantic document
<header>
<a href="/" aria-label="Home">Brand</a>
</header>
<main>
<article>
<h1>Technical SEO</h1>
<p>...</p>
<a href="/writing/technical-seo/">Read</a>
</article>
</main> - Landmarks expose page regions
- Real links remain crawlable and operable
- The H1 states the document’s main subject
Use landmarks to expose page regions
Landmarks provide a stable map of the interface. A conventional content page normally needs a banner or header, navigation, one main region, and a footer. Search, complementary sidebars, and named regions are added when they serve an actual function.
Keep one visible main region for the page’s primary content. Do not nest main inside article, and do not create five competing main regions because a design system calls every panel “main.”
Native elements already carry landmark roles in the appropriate context. Adding role="navigation" to every nav is usually redundant. Adding role="button" to a clickable div still leaves you responsible for keyboard behavior, focus, disabled state, and activation semantics that a button already provides.
Build a heading hierarchy, not a font scale
The H1 should state the page’s main subject. H2s divide that subject into major sections. H3s belong inside those sections. CSS controls size; heading levels control hierarchy.
Common failure patterns:
- selecting H3 because its default size matches the design;
- jumping from H1 to H4 for visual reasons;
- repeating the site logo as an H1 on every page;
- rendering card titles as headings when the cards are unrelated controls;
- hiding the only descriptive heading and replacing it with fragmented animation spans.
A single clear H1 is the simplest convention for editorial QA. The important point is not an arbitrary count. It is that the document has one obvious primary subject and a coherent outline.
Use real links for routes
If activation moves the user to another URL, use an anchor with href. This gives the destination to crawlers and enables expected browser behavior: copy link, open in a new tab, show the target in the status bar, navigate by keyboard, and preserve link semantics.
Google’s crawlable links documentation recommends normal anchor elements with resolvable destinations. The anchor text should describe the destination in context. “Read our crawl, index, and render diagnostic” is more informative than a grid of twelve identical “Learn more” links.
Use a button when the action changes local state, submits a form, opens a menu, or starts a process. Styling an anchor as a button does not change its navigational role; that is fine when it still navigates.
Match data structures to HTML structures
Use unordered lists when order is irrelevant and ordered lists when sequence matters. Use description lists for name-value or term-description pairs. Use tables when cells have row and column relationships.
A comparison table built from nested div elements may look correct on desktop and lose its relationships in a screen reader, text extraction, mobile reflow, and Markdown conversion. A real table provides headers, scopes, captions, and a predictable reading model.
The same rule applies to figures. A chart, diagram, or editorial image that carries information belongs in figure with a useful figcaption. Decorative images should use empty alternative text. Informative images need an alternative that communicates their function or conclusion rather than describing every pixel.
Make forms operable before making them clever
Every form control needs a programmatic name. A visible label is normally the strongest option. Group related controls with fieldset and legend. Associate errors with the field and move focus deliberately when submission fails.
Placeholder text is not a label. A floating visual label that disappears from the accessibility tree is not a label. A custom select is not complete when it merely opens on mouse click.
These details matter to conversion as much as accessibility. The contact form that cannot be submitted with a keyboard is not a technical footnote; it is a broken acquisition path.
Server HTML first, enhancement second
Semantic components can still fail if their content arrives only after a brittle client-side request. Inspect both the original response and the rendered DOM.
For a content page, the response should usually contain the title, primary copy, canonical metadata, and important internal links. JavaScript can enhance filtering, search, transitions, calculators, and disclosure patterns without owning the only copy of the document.
This is progressive enhancement in operational terms: the core resource survives delayed JavaScript, blocked third-party code, an interrupted hydration step, and non-browser extraction.
Semantics and structured data solve different problems
Semantic HTML describes the document structure. Schema.org structured data describes entities and relationships in a machine-readable graph. They reinforce each other, but neither should contradict the visible page.
An article element does not automatically create Article structured data. An Article JSON-LD object does not fix a page whose author, date, and content are missing or contradictory. Use stable identifiers and canonical URLs, then validate that the structured facts match what a person can verify.
What semantic HTML cannot do
Semantics do not make generic prose useful. They do not create first-hand evidence. They do not replace reputation, internal architecture, performance, or query fit. They do not guarantee a rich result or an LLM citation.
They make a good page easier to understand, navigate, extract, test, and maintain. That is enough reason to treat them as infrastructure rather than polish.
A semantic release checklist
Before release, verify the page without relying on its screenshot:
- The document has a unique title and a clear H1.
- Heading levels describe the content hierarchy.
- One main region contains the primary page content.
- Navigation uses real anchors with useful destinations and text.
- Actions use native controls and work with a keyboard.
- Lists, tables, figures, and forms use structures that preserve their relationships.
- Informative images have useful alternatives; decorative images are ignored.
- Primary content and metadata exist in the response or render reliably.
- Structured data matches visible facts and canonical identifiers.
- The page remains understandable as text and usable at mobile width.
The test is deliberately boring. Boring document structure is durable infrastructure.
A release test for semantic pages
| State | Question | Observable evidence | Typical failure |
|---|---|---|---|
| Discovery | Does the engine know the URL exists? | Links, sitemap reports, URL Inspection | The URL is orphaned or only exposed through an uncrawlable control |
| Fetch | Can the crawler request a stable response? | Server logs, status, headers, response time | Robots block, timeout, 5xx, redirect chain |
| Render | Is the primary content present after processing? | Raw HTML vs rendered DOM, resource waterfall | Empty app shell, blocked JS/CSS, delayed or failed render |
| Index | Was this URL selected and stored? | Index status, canonical selection, snippet text | Noindex, duplicate, soft 404, alternate canonical |
| Serve | Can it compete for the intended query? | Query impressions, result format, landing URL | Wrong intent, weak evidence, stronger candidate |
Q01 What are the most important semantic HTML elements for SEO? +
Q02 Should a page have only one H1? +
Q03 Is ARIA good for SEO? +
Q04 Can Google crawl JavaScript links? +
- [01] DOC
- [02] DOC
- [03] DOC
- [04] DOC
The same pipelines I run for paying clients — written up first for subscribers.



