ADA Compliance Professionals

    Single banner landmark per page only

    Last updated:

    Who it helps:
    Blind
    Standard:
    WCAG 2.2 Level A

    Pages must not contain more than one banner landmark

    A page must have exactly one banner landmark. Use it for the site-wide header and remove additional banner roles.

    This appears when multiple headers or UI fragments each use role="banner". It primarily affects screen reader users who rely on landmark navigation.

    Why It Matters

    Landmarks let assistive technology jump between major areas quickly. If a page exposes multiple banners, users cycle through redundant headers before reaching content.

    Users with blindness or low vision depend on a clear set of landmarks. Extra banners add noise and slow navigation. Clean landmarks also support efficient bypass of repeated blocks.

    Common Causes

    • Applying role="banner" to more than one header element.
    • Adding role="banner" to both a top bar and a secondary marketing or section header.
    • Component libraries that ship their own header with role="banner" and are used multiple times.
    • Micro-frontend or SPA layouts that mount multiple app shells with banner roles.
    • Copy/paste of markup into modals or panels that reintroduces a banner role.

    How to Fix

    1. Keep one banner role only:
      • Choose a single, top-level site header wrapper to carry role="banner".
      • Remove role="banner" from all other elements.
    2. Use header elements safely:
      • You may use multiple <header> elements, but do not give them role="banner" unless it’s the single, site-level header.
      • For section-specific headers, use plain <header> or a heading (h1–h6). If needed, use role="region" with a clear aria-label, not role="banner".
    3. Structure your layout:
      • Typical order: <header role="banner"></header>, <main id="main" role="main"></main>, and one or more <nav> with aria-labels.
    4. SPAs and routed views:
      • The banner persists across route changes. Do not mount additional banners when views swap.
    5. Embedded content:
      • Iframes are separate documents and may contain their own single banner. Inside the host document, keep only one banner.

    Recommendation: Provide a visible skip link to the main content in addition to proper landmarks to satisfy bypass expectations.

    How to Test

    • Code/DOM check:
    • Search for role="banner". Confirm there is exactly one instance per document.
    • Screen reader check (desktop):
    • NVDA: Press NVDA+F7, open Landmarks list. Ensure “Banner” appears once.
    • JAWS: Open the Regions list (Insert+Ctrl+R) or cycle landmarks. Verify a single Banner.
    • VoiceOver (macOS): Open the Web Rotor (Ctrl+Option+U), Landmarks. Confirm one Banner.
    • Mobile screen reader:
    • iOS VoiceOver: Rotor > Landmarks. Ensure one Banner.
    • Android TalkBack: Local context menu > Landmarks (if available). Confirm one Banner.
    • Keyboard sanity:
    • Use your skip link to jump to main content. Landmark navigation should not trap you in multiple banners.

    Good Example

    HTML
    <header role="banner">
      <a class="brand" href="/">Acme Co.</a>
      <nav aria-label="Primary navigation">
        <ul>
          <li><a href="/products">Products</a></li>
          <li><a href="/pricing">Pricing</a></li>
          <li><a href="/support">Support</a></li>
        </ul>
      </nav>
    </header>
    <main id="main" role="main">
      <h1>Welcome</h1>
      <section>
        <header>
          <h2>Latest Updates</h2>
        </header>
        <p>News content…</p>
      </section>
    </main>

    Bad Example

    HTML
    <header role="banner">
      <div class="topbar">Free shipping this week!</div>
    </header>
    <header role="banner">
      <a href="/" class="logo">Acme Co.</a>
    </header>
    <main role="main">
      <h1>Catalog</h1>
    </main>

    Quick Checklist

    • Exactly one element has role="banner" in the document.
    • The banner wraps the global site header (logo, primary nav, etc.).
    • No dialogs, modals, or secondary sections use role="banner".
    • Additional headers use plain <header> or role="region" with labels, not banner.
    • Landmark order is clear: banner, main, navigation, complementary, contentinfo as needed.
    • SPA routes do not add extra banners when views change.
    • Iframes manage their own landmarks separately from the host page.