skip to content

Which HTML elements expose implicit landmark roles, and what do landmarks give a screen-reader user that a page built from <div>s does not?

level: juniorimportance: must knowfreq 68%

answer

  1. a map users can jump between
  2. native element, not role attribute
  3. two of them need a name
  4. article is the odd one out

basics

~20 s

A top-level <header>, <nav>, <main>, <aside>, <footer>, <search> and a named <form> expose the banner, navigation, main, complementary, contentinfo, search and form landmark roles. Screen readers list landmarks so users jump between regions instead of reading everything.

solid answer

~50 s

Landmarks are named regions of a page that assistive technology can enumerate and jump between. HTML gives you most of them for free: `<nav>` is `navigation`, `<main>` is `main`, `<aside>` is `complementary`, `<search>` is `search`, a `<form>` with an accessible name is `form`, and a `<header>`/`<footer>` that is not nested inside sectioning content is `banner`/`contentinfo`. Two elements people expect to be landmarks are not: `<article>` maps to the `article` role, which is not a landmark, and `<section>` only becomes `region` when it has an accessible name — otherwise it is generic. The payoff is navigation: screen-reader users open a landmark rotor or press a landmark quick key and move straight to the navigation or the main content, which a page of anonymous `<div>`s cannot offer at all. That is why the native elements are worth using even when they look identical on screen.

go deeper

for a junior

Be able to name the landmark elements — header, nav, main, aside, footer — and say plainly that screen-reader users can jump between them, which is impossible on a page of divs.

for a middle

Explain the element-to-role mapping precisely, including the two conditional cases: form and section are landmarks only once they have an accessible name. Know that article is not a landmark.

for a senior

Show judgment about how many landmarks a page should have. Talk about content stranded outside every landmark, rotor noise from over-labelling, and auditing a real page's landmark list rather than trusting the markup.

for a principal

Own this as a system-wide convention: which components in a shared library are allowed to emit landmarks at all, so that composing three of them on one page does not produce duplicate banners or a dozen unnamed regions.

## What a landmark actually is A **landmark** is a region of a page that assistive technology can list and jump to directly. Screen readers expose them in a rotor or menu ("navigation", "main", "banner"…) and offer a quick key to cycle through them. This is the closest thing a non-visual user has to the glance a sighted user gives a page to find the menu, the content, and the footer. Landmarks come from ARIA's set of landmark roles — `banner`, `navigation`, `main`, `complementary`, `contentinfo`, `search`, `form`, `region` — but you rarely have to write `role=` yourself, because HTML elements already map to them. ## The element-to-role map | Element | Implicit role | Notes | | --- | --- | --- | | `<header>` | `banner` | only when not nested in sectioning content | | `<nav>` | `navigation` | always | | `<main>` | `main` | one non-hidden `<main>` per document | | `<aside>` | `complementary` | tangential, related content | | `<footer>` | `contentinfo` | only when not nested in sectioning content | | `<search>` | `search` | a recent addition to HTML | | `<form>` | `form` | landmark only when it has an accessible name | | `<section>` | `region` | landmark only when it has an accessible name | The two conditional rows matter in interviews. A `<form>` or a `<section>` with no accessible name is deliberately *not* exposed as a landmark, because a page full of unnamed "region" entries is noise rather than navigation. Give the element an `aria-label` or point `aria-labelledby` at its heading and it appears in the landmark list under that name. ## What is not a landmark `<article>` maps to the `article` role. That role is genuinely useful — it tells assistive technology this is a self-contained composition, and some screen readers announce entering and leaving it — but it is **not** in the landmark set, so `<article>` does not appear in the landmark rotor. Likewise `<div>` and `<span>` map to `generic`: no role, no name, nothing to navigate by. A page whose entire skeleton is `<div class="header">`, `<div class="nav">`, `<div class="content">` produces an empty landmark list, and the only way through it is to read linearly or hunt by heading. ## A minimal correct skeleton ```html <body> <header> <a href="/">Acme</a> <nav aria-label="Primary"> <ul><li><a href="/docs">Docs</a></li></ul> </nav> <search> <form role="search" action="/search"> <label for="q">Search docs</label> <input id="q" name="q" type="search"> </form> </search> </header> <main> <h1>Installing Acme</h1> <p>…</p> <aside aria-label="Related guides">…</aside> </main> <footer> <p>© 2026 Acme</p> </footer> </body> ``` Every landmark here came from choosing an element, not from writing a role attribute. That ordering is the first rule of ARIA: prefer the native element, and only reach for `role=` when no element does the job. ## Why interviewers ask this Because it separates "I know the tag names" from "I know what the tags buy me". The elements have almost no visual effect — `<nav>` and `<div>` render the same — so the only reason to prefer them is the semantics they carry into the accessibility tree, and, secondarily, the signal they give tools that parse page structure. A candidate who says "semantic HTML is better for SEO" and stops there has missed the mechanism; a candidate who can say which element becomes which role, and which two are conditional, has actually used this. ## Common failure modes Over-landmarking is as bad as none: wrapping every visual block in `<section aria-label="…">` produces a rotor with twenty regions and helps nobody. Landmarks are a coarse map — typically one banner, one or two navs, one main, a complementary or two, one contentinfo. Content that is not inside *any* landmark is also a known problem: screen-reader users navigating landmark to landmark will simply never land on it, so keep the page's real content inside `<main>` and its neighbours rather than floating between them.

  • Why does <section> only count as a landmark when it has an accessible name?
    Because an unnamed region is useless to navigate to. Assistive technology would list a stack of identical "region" entries with nothing to tell them apart, so HTML's accessibility mapping only exposes `<section>` as `region` when `aria-label` or `aria-labelledby` gives it a name. Without one it maps to generic — still fine as a structural element, just not in the landmark list.
  • If ARIA landmark roles exist, why not just write role="navigation" on a div?
    It works, but it is strictly more code for strictly less behaviour. The native element gives the role for free, cannot drift out of sync with the markup, and carries the element's other semantics with it. The first rule of ARIA is not to use ARIA where a native element does the job; hand-written roles are for cases HTML genuinely has no element for.
  • Does <article> show up in a screen reader's landmark list?
    No. `<article>` maps to the `article` role, which is not one of the landmark roles, so it is absent from the landmark rotor. It still carries meaning — it marks a self-contained composition, and some screen readers announce entering and exiting one — but if you want that block reachable as a landmark you need an actual landmark around or instead of it.

saying these in an interview costs you the question

  • Claiming semantic elements are purely for SEO ranking
  • Saying <article> is a landmark role
  • Thinking <section> is always announced as a region
  • Wrapping every visual block in its own landmark
  • Believing <div> with a class name conveys semantics

context