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.
<!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.
<!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.