Overview
Every HTML element carries an implicit role that assistive technology, crawlers, and reader modes consume. A page of nested <div> elements gives them nothing; replacing each <div> with the element that names the region makes the page navigable without JavaScript. The checklist is html.
Put the unique page content in one <main>
Use exactly one <main> for content unique to this URL, not the chrome repeated across pages. It is the “main” landmark, so assistive technology users can jump to it. Point the skip link at it (<a href="#main">Skip to content</a>).
<body>
<header><!-- site chrome --></header>
<nav aria-label="Primary"><!-- primary nav --></nav>
<main id="main"><!-- unique page content --></main>
<footer><!-- site footer --></footer>
</body>Wrap self-contained content in <article>
Use <article> when the block makes sense on its own, such as a post, a product card, or a comment. Articles can nest, for example comments inside a post.
Group themed content with a headed <section>
Use <section> for a named thematic block and give it a heading. A <section> becomes a “region” landmark only when it has an accessible name (aria-labelledby pointing at its heading). Use <div> for styling-only wrappers, and <article> for self-contained content.
Label each <nav> and keep it for navigation
Use <nav> for primary navigation and for secondary blocks such as a table of contents or pagination. With more than one, give each an aria-label or aria-labelledby so users can tell them apart. Not every list of links needs <nav>; a row of legal links in a footer usually does not.
Use <aside> for tangential content
Use <aside> for content related to the main flow but not essential to it: a pull quote, a sidebar, a related-links callout. Inside an <article> it is tangential to the article; at page level, to the document. Do not use it for decoration or for content needed to understand the text.
Scope <header> and <footer> to their container
Each belongs to its nearest sectioning ancestor. A <header> directly under <body> is the “banner” landmark and a <footer> there is “contentinfo”; inside an <article> or <section> they are plain grouping elements, not landmarks.
<article>
<header><h2>Release notes for version 2.4</h2><time datetime="2026-05-01">May 1, 2026</time></header>
<p>This release adds bulk export and fixes two sync bugs.</p>
<footer>Tags: releases</footer>
</article>Mark site search with <search>
Wrap a search form in <search> to expose the “search” landmark without an ARIA role. It is Baseline widely available (since April 2026; newly available October 2023).
<search><form action="/find"><label for="q">Search</label><input id="q" name="q" type="search" /></form></search>Check every container before adding a <div>
Ask what the block is: page content is <main>, a self-contained piece is <article>, a headed theme is <section>, navigation is <nav>, tangential content is <aside>. Keep <div> for layout wrappers that carry no meaning. For ARIA on top of native elements, see html-aria-patterns; for data tables, html-tables.