auditmysitev2.0.2

Missing section headings

headings/section-without-heading

WCAG success criterion
2.4.10 (level AAA)
Outcome class
Hint only. An automated check that by design reports review hints only: its findings are marked for manual review, never as confirmed violations.
Area
Accessibility, Structure & Semantics
Default severity
low
axe-core rule
heading-order

Why we flag this

Users cannot jump directly to specific content.

Missing sub-headings in long content blocks.

What the rule checks

Scope. article elements and named section elements (regions).

Expectation. Asks for review once per page when articles or named sections contain no heading: whether a section needs a heading depends on its content (teaser cards are often headingless), so it is not a proven failure. A section named by aria-labelledby to its own heading has one; an unnamed section is no region and is not counted. One review at the html element.

Source. WCAG 2.2 SC 2.4.10 Section Headings (AAA, review); G141; HTML §4.3 sections

Detection: shared; needs dom, computed_style.

Failing example

The check flags this for review. Corpus case structure_heading_outline, element html. The page may contain further findings for other rules.

structure_heading_outline.htmlHTML
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Workshop guides – Acme Hardware</title>
    <style>
        body { font: 16px/1.5 sans-serif; margin: 0 16px; }
        a { display: inline-block; min-width: 44px; min-height: 44px; line-height: 44px; }
        input, button { min-width: 44px; min-height: 44px; }
        .print-only { display: none; }
    </style>
</head>
<body>
    <!-- A guide page with an uneven outline (#783). -->
    <a href="#main" class="skip-link">Skip to content</a>
    <header>
        <p>Acme Hardware</p>
    </header>
    <nav aria-label="Main">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/guides/">Guides</a></li>
        </ul>
    </nav>
    <main id="main">
        <h1 id="page-title">Workshop guides</h1>
        <h2>Woodwork</h2>
        <!-- h2 to h4: one level skipped. -->
        <h4 id="skipped-level">Choosing a saw</h4>
        <p>Crosscut or rip cut, depending on the grain.</p>
        <!-- Back up to h2, then one level down: both fine. -->
        <h2>Metalwork</h2>
        <h3>Drilling steel</h3>
        <p>Use cutting oil and a low speed.</p>
        <!-- Not rendered, so not part of the outline: h3 to (h5) is no skip. -->
        <h5 class="print-only">Printed safety sheet</h5>
        <h3>Filing</h3>
        <p>Push strokes only.</p>
        <!-- A second h1 for a sub-page area. -->
        <h1 id="second-title">Guide archive</h1>
        <!-- Teaser cards without headings: an article and a named section. -->
        <article>
            <p>How to sharpen a chisel in five minutes.</p>
        </article>
        <section aria-label="Popular downloads">
            <p>Measuring chart, cutting list template.</p>
        </section>
        <!-- An unnamed section is no region and needs no heading. -->
        <section>
            <p>Updated monthly.</p>
        </section>
    </main>
    <footer>
        <p>Acme Hardware, Berlin</p>
    </footer>
</body>
</html>

Passing example

The check reports nothing here. Corpus case structure_outline_clean. The page may contain further findings for other rules.

structure_outline_clean.htmlHTML
<!DOCTYPE html>
<html lang="en" xml:lang="en-GB">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Opening hours and contact – Acme Hardware Berlin</title>
    <style>
        body { font: 16px/1.5 sans-serif; margin: 0 16px; }
        a { display: inline-block; min-width: 44px; min-height: 44px; line-height: 44px; }
        input, button { min-width: 44px; min-height: 44px; }
    </style>
</head>
<body>
    <!-- Conforming look-alike for the structure rules (#783): every
         structure the rules look at is present and correct. -->
    <a href="#main" class="skip-link">Skip to content</a>
    <header>
        <p>Acme Hardware</p>
    </header>
    <nav aria-label="Main">
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/shop/">Shop</a></li>
            <li><a href="/contact/">Contact</a></li>
        </ul>
    </nav>
    <main id="main">
        <h1>Opening hours and contact</h1>
        <p>Our store in Berlin is open six days a week. We are happy to help you
           find the right tool for your project, and you can always call us before
           you visit to check that an item is in stock.</p>
        <h2>Opening hours</h2>
        <dl>
            <div><dt>Monday to Friday</dt><dd>8:00 to 18:00</dd></div>
            <div><dt>Saturday</dt><dd>9:00 to 14:00</dd></div>
        </dl>
        <h2>Directions</h2>
        <!-- English text with German proper names: names are exempt from
             3.1.2, and only two German function words occur. -->
        <p id="directions">The store is a short walk from the Haus der Kunst gallery and the
           old bridge that locals call die Brücke. Take the tram to the main square, then
           follow the river for about five minutes until you see our green sign.</p>
        <article>
            <h3>Store news</h3>
            <p>We now stock garden tools from local makers.</p>
        </article>
        <section aria-labelledby="contact-heading">
            <h2 id="contact-heading">Contact</h2>
            <p>Call us or send a message. Prices include <abbr title="value-added tax">VAT</abbr>.</p>
            <form action="/contact" method="post">
                <label for="contact-email">E-mail</label>
                <input id="contact-email" name="email" type="email" autocomplete="email" aria-describedby="contact-hint">
                <p id="contact-hint">We reply within one working day.</p>
                <button type="submit">Send</button>
            </form>
        </section>
    </main>
    <footer>
        <p>Acme Hardware, Berlin</p>
    </footer>
    <!-- Hidden leftover outside every landmark: not rendered, not content. -->
    <div hidden>Summer sale banner</div>
</body>
</html>

This page is generated from the rule catalogue and the rule contracts; see therule overview for how the outcome classes are derived.