2.4.6 Headings and Labels

Level: AA | Principle: Operable | Since: WCAG 2.0 | Automation: Partial (axe-core)


What This Means

Headings and labels must describe the topic or purpose of the content they introduce. An empty heading, a vague heading like "Section 1", or a form label that says "Field" provides no useful information.

Who This Affects

  1. Screen reader users — they navigate by headings to find content quickly
  2. Cognitive disability users — clear headings help them understand page structure
  3. Everyone — descriptive headings improve scannability

Common Pitfalls

1. Empty headings

<!-- Bad: heading with no content -->
<h2></h2>

<!-- Bad: heading with only whitespace -->
<h2>   </h2>

2. Vague headings

<!-- Bad -->
<h2>More Info</h2>
<h2>Details</h2>
<h2>Section 1</h2>

<!-- Good -->
<h2>Shipping and Returns Policy</h2>
<h2>Payment Methods</h2>
<h2>Customer Reviews</h2>

3. Vague form labels

<!-- Bad -->
<label for="field1">Input</label>
<label for="field2">Field</label>

<!-- Good -->
<label for="first-name">First name</label>
<label for="email">Email address</label>

How to Fix

Every heading should answer: "What is this section about?" Every label should answer: "What should the user enter here?"

<!-- Descriptive headings -->
<h1>A11y Scan Documentation</h1>
<h2>Getting Started</h2>
<h3>Installing the Extension</h3>
<h3>Running Your First Scan</h3>
<h2>Understanding Results</h2>

<!-- Descriptive labels -->
<label for="company">Company name</label>
<input id="company" type="text">

<label for="employees">Number of employees</label>
<select id="employees">
  <option>1-10</option>
  <option>11-50</option>
</select>

How to Test

  1. Open a screen reader and list all headings on the page (VoiceOver: VO+U then Headings; NVDA: H key to cycle through headings).
  2. Read each heading and verify it clearly describes the content of its section (not vague like "More Info" or "Section 1").
  3. Tab to each form field and verify the announced label describes what to enter (not generic like "Input" or "Field").
  4. Check for empty headings by inspecting the DOM for <h1>-<h6> elements with no text content or only whitespace.
  5. Pass: Every heading describes its section's topic, every label describes the expected input, and no empty headings exist.
  6. Fail: Any heading is empty, vague, or misleading, or any form label fails to describe what the user should enter.

axe-core Rules

| Rule | What It Checks | |------|---------------| | empty-heading | Headings must not be empty |

Note: axe-core can detect empty headings but cannot judge whether heading text is descriptive — that requires manual review.

Tools

Test this criterion with the Heading Structure Checker.

Sources

  1. W3C WCAG 2.2 — Understanding 2.4.6
  2. axe-core: empty-heading
  3. WebAIM: Headings