Back to All Rules
Serious1.3.1 Info and Relationships (Level A)Rule ID: td-has-header

Non-empty table data cells must have table headers

One or more non-empty `<td>` elements are not associated with any row or column headers.

Rule Description

Checks whether non-empty data cells can be programmatically associated with relevant header cells.

Why It Matters

  • Screen reader users need header context for each data cell
  • Tables become ambiguous when values are announced without labels
  • Data interpretation errors become more likely

How to Fix

Provide proper header associations using <th scope> or headers/id patterns.

Bad Example:

<table> <tr><td>Product</td><td>Price</td></tr> <tr><td>Headphones</td><td>$99</td></tr> </table>

Good Example:

<table> <tr><th scope="col">Product</th><th scope="col">Price</th></tr> <tr><td>Headphones</td><td>$99</td></tr> </table>

Common Mistakes

  • Using <td> for header rows
  • Missing scope in simple tables
  • Broken headers references in complex tables

Testing

  • Run table rules in automated checker
  • Navigate table with screen reader and verify announced headers
  • Inspect table accessibility tree in browser devtools

Automate Your Accessibility Testing

Our tool automatically checks for this rule and hundreds of other accessibility issues.

Start Your Free Trial