Skip to content

Test your website now

Free, no card. We read only public pages.

Run free audit →

Accessibility · WCAG 1.3.1 level A

Data Cells in Larger Tables Must Have Associated Headers

Associate data cells with useful headers. Use th, scope or valid explicit references, and review small tables and the disabled rule coverage separately.

Published · Updated

What the check tests

Check
a11y.axe.td-has-header - Non-empty <td> elements in larger <table> must have an associated table header
Passes when
Ensure that each non-empty data cell in a <table> larger than 3 by 3 has one or more table headers
Scope
graded on every page crawled
Conformance
WCAG level A
Fix effort
small - under an hour

In one paragraph

Non-empty data cells in larger tables must have an associated header means cell values need the contextual relationships their table requires. Encode real headers rather than relying on bold styling or visual position alone. The supplied experimental rule is not executed in WebAuditOS, and its size threshold is not a WCAG exemption for small tables. Review meaningful header associations manually across the actual data structure.

Why it matters

A value such as 15 EUR is useful only when users can identify the destination and service it belongs to. Native header cells and appropriate relationships can provide that context during table navigation, subject to actual user-agent support.

The right structure depends on the data. Simple rows and columns may need straightforward th and scope; grouped complex tables may require a carefully designed association model. A caption names the table but does not replace the contextual headers for each data cell.

A visual header built from bold td text can fail to encode relationships. Conversely, mechanically converting every first cell to th can misrepresent data. Review content meaning rather than applying one transformation to every table.

How WebAuditOS evaluates this finding

The supplied td-has-header description targets selected data tables whose first three rows meet its multi-column heuristic. It checks documented non-empty cells and header relationships, with applicability exceptions. Those are engine boundaries, not the full scope of accessible data presentation.

The source says the rule is experimental and not requested in the current tag-based run, so it produces no finding in this report. Other table-reference checks can still run. Its nominal critical impact is not a reported severity here, and no finding does not establish header coverage.

How to fix it

  1. Distinguish data tables from obsolete layout use. For actual data, identify the row and column questions each value answers. Do not add data-header semantics to decorative layout.
  2. Use native header markup for a simple relationship. An illustrative table is:
<table>
  <caption>Illustrative delivery rates</caption>
  <thead><tr><th scope="col">Destination</th><th scope="col">Standard</th><th scope="col">Express</th></tr></thead>
  <tbody><tr><th scope="row">Czechia</th><td>5 EUR</td><td>9 EUR</td></tr><tr><th scope="row">Slovakia</th><td>6 EUR</td><td>10 EUR</td></tr></tbody>
</table>

Use actual data and relationships. The example is not a universal template for complex grouped headers.

  1. For more complex structures, simplify the presentation when appropriate or apply correct header groups and explicit references. A headers attribute contains the relevant header IDs, not arbitrary human-readable text.
  2. Keep IDs unique and references within the appropriate table relationships. Adding a valid-looking token that points to a data cell or another table does not establish the intended association.
  3. Preserve meaningful spanning headers. A broad header may represent a real category rather than a fake title; decide whether caption, grouping, or another structure describes it best.
  4. Test reading order and header announcements with supported table navigation. Check responsive transformations, sorted data, virtualisation, and cells inserted later, not only a small static screenshot.
  5. Review small tables too. A 2-by-2 table can still need relationships even though the experimental rule's size gate ignores it. Do not omit context solely because there are few cells.
  6. Record manual results and rescan other table checks. A clean top-level violations report cannot validate this disabled rule or every embedded or dynamic table.

What the fix can break

Changing cells from td to th can affect styling, sorting, exports, and scripts. Preserve functional data and test visual presentation while repairing semantics.

Flattening a multi-level table without understanding it can lose distinctions users need. Prefer a simpler equivalent only when it still communicates the information accurately.

Do not add aria-label to every cell as a universal substitute for real relationships. That can duplicate or override useful content while leaving the structural model incomplete.

Questions

Is the three-by-three gate a WCAG size exemption?

No. It is the documented heuristic for this rule. Smaller data tables still need appropriate meaningful relationships.

Does a caption replace column and row headers?

No. Table identity and cell context are different needs.

Why is no finding not evidence that headers were checked?

The supplied experimental rule is excluded from the scan configuration. Inspect associations manually and through appropriate additional tools.

Review headers references, header-to-data relationships, and the automation limits guide.

What severity does this get in the report?

None, today - the rule is experimental in axe-core and our scan does not run experimental rules, so it never produces a finding. axe declares the rule critical; if it ran and failed, the mapping of critical and serious to high, moderate to medium and minor to low would make it high.

Standards and sources

In the report

Test this on your own site

Every scan runs a11y.axe.td-has-header on every page it crawls, on every plan. The finding carries this id, so a line in a report can be matched to the explanation above - and the free scan needs no account.