Back to Learn
Pulseaccessibility
Table Cells Have Headers
What This Audit Checks
This audit verifies that every <td> cell in a data table is associated with at least one <th> header. It checks for headers in the same row, same column, or explicitly linked via the headers attribute.
Why It Matters
Screen readers announce column and row headers before reading a cell's value so users understand the data in context. Without headers, a cell's value like "42" has no meaning on its own, and users cannot navigate the table efficiently.
How to Fix It
- Add
<th>elements to the first row and/or first column of your table to define headers. - Use the
scopeattribute to clarify whether a header applies to a row or column:<th scope="col">Revenue</th> <th scope="row">Q1</th> - Use the
headersattribute on<td>elements for complex tables where headers are not in a simple row/column relationship. - Do not use data tables for layout. If the table is purely presentational, add
role="presentation"instead of headers.
<table>
<tr>
<th scope="col">Quarter</th>
<th scope="col">Revenue</th>
</tr>
<tr>
<td>Q1</td>
<td>$12,000</td>
</tr>
</table>
How Pulse Tracks This
Pulse flags this audit in your Lighthouse accessibility score. When the audit fails, Pulse shows which elements triggered it so you can fix them directly.