Structure & headings
A Table Header Has No Data Cells Under or Beside It
A header cell labels nothing, so screen reader users hear a heading with no data, or can't tell which header goes with which cell.
th-has-data-cellsWCAG 2.0Introduced in WCAG 2.0.Level AA — the minimum. Missing it blocks people outright.
- Status
- SeriousSerious — Significant friction, or information that is lost.CurrentScanners run this rule today.
- Owner
- DesignDevContentTest
- Audit
- Automated+ManualA scanner finds it; a person confirms the fix.
Why it matters
Screen readers read a table one cell at a time. As you move, they read out the header for that row or column, so you know what each number means.
When a header has no cells to label, that link breaks. People hear headers that lead nowhere, or the table looks broken and they give up.
Who it affects
| Who | What they experience | Impact |
|---|---|---|
| Screen reader users | They hear a header that leads to empty space, and the table's layout stops making sense. | High impact |
| Low-vision users (magnification) | Affected if they use a screen reader; on screen they may just see an empty column. | Partial impact |
| Cognitive and neurodivergent users | An empty or mismatched column makes the table harder to follow. | Partial impact |
Business & product impact
| Area | Why | Impact |
|---|---|---|
| Legal | It relates to WCAG 1.3.1 at Level A, the minimum. Australia's Disability Discrimination Act complaints point to WCAG 2.2 Level AA, and EN 301 549 applies in Europe. | High impact |
| Conversion | Price, plan and timetable tables drive decisions. A confusing table can stop someone choosing. | Moderate impact |
| SEO | No real search benefit — don't sell it as one. | Low impact |
| Brand trust | A broken table feels careless to anyone who meets it. | Low impact |
| Cost to fix | Usually quick: remove the extra header or add the missing cells. Fix it in the table template once. | High impact |
Fixing it in code
A header left over from a removed column
Don't
<table>
<tr><th>Plan</th><th>Price</th><th>Notes</th></tr>
<tr><td>Basic</td><td>$10</td></tr>
<tr><td>Pro</td><td>$20</td></tr>
</table>A screen reader says: “Notes, column 3 … then nothing in that column”
Do
<table>
<tr><th>Plan</th><th>Price</th></tr>
<tr><td>Basic</td><td>$10</td></tr>
<tr><td>Pro</td><td>$20</td></tr>
</table>A screen reader says: “Price, $10”
Every header now labels real cells, so each cell gets a meaningful header.
Fixing it in design and content
Plan the table grid before styling it
Don't
A designer adds a header for a column that is sometimes empty, or uses a header cell just to make a label bold.
Do
Each header sits over or beside cells it describes. Empty columns are hidden, and bold text uses styling, not a header cell.
Headers are for labelling data, not for looks.
Designer's handoff note
Sketch each table as a grid. Every header must have at least one cell in its row or column.
If a column can be empty, decide whether to hide it or show "None".
Quick test
Tool
NVDA (opens in a new tab) (free, Windows) or VoiceOver (opens in a new tab) (Mac)
Checklist
- Pass
- Every header labels cells, and each cell is read with a header that fits.
- Fail
- A header leads to empty cells, or cells are read with the wrong header.
What a green scan still misses
A scanner can see a header with no cells. It can't tell whether the header text actually describes the data — read the table aloud to check.
Reference
- Rule ID
th-has-data-cells- Raised by
- axe-core: “Table headers in a data table must refer to data cells”
- WCAG
- 1.3.1 Info and Relationships (opens in a new tab) · Level A · since WCAG 2.0
- Other standards
- EN 301 549 9.1.3.1 · RGAA 5.7.1
- Last reviewed
- 14 October 2026