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
scopein simple tables - Broken
headersreferences 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
External Resources
Automate Your Accessibility Testing
Our tool automatically checks for this rule and hundreds of other accessibility issues.
Start Your Free Trial