Skip to main content
Beta: Front-End Checklist is currently in beta. Some issues are still being fixed. Thanks for your patience.

Link table cells to headers using IDs

Checks that td headers attribute references valid th ids

Utilities
Quick take
Typical fix time 10 min
  • Use the `headers` attribute for complex tables where `scope` isn't enough
  • Ensure the `headers` attribute references valid `id` values of `<th>` elements
  • Separate multiple header IDs with spaces
Why it matters: In complex tables with multi-level headers, explicit header-to-cell linking ensures screen readers accurately announce the relationship between data and its context.

Rule Details

The headers attribute is used on <td> elements to explicitly associate them with header cells in complex tables.

Code Example

<table>
  <thead>
    <tr>
      <th id="h-region">Region</th>
      <th id="h-q1">Q1</th>
      <th id="h-q2">Q2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th id="r-north" headers="h-region">North</th>
      <td headers="r-north h-q1">$10k</td>
      <td headers="r-north h-q2">$12k</td>
    </tr>
  </tbody>
</table>

Why It Matters

  • Complex Tables: Essential for tables with headers that span multiple columns or rows.
  • Precision: Provides an unambiguous way for screen readers to identify which headers apply to a cell.
  • Improved UX: Helps users navigate and understand nested data structures.
  • Compliance: Meets advanced WCAG standards for complex data relationships.

Exceptions

  • Simple data tables can sometimes fail more from missing header relationships than from missing enhancements such as captions or mobile wrappers, so prioritize the strongest semantic issue.
  • Do not convert layout structures into data-table markup just to satisfy a rule; the correct fix may be to remove table semantics entirely.
  • When several table-accessibility issues overlap, resolve the header-cell relationship first because downstream announcements depend on it.

Standards

  • Align the implementation with W3C WAI: WCAG Overview and verify the rendered experience, not only the source code.
  • Align the implementation with MDN: Accessibility and verify the rendered experience, not only the source code.

Verification

Automated Checks

  • Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.
  • Run an automated accessibility checker such as axe or Lighthouse where applicable.

Manual Checks

  • Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.
  • Re-test one representative user flow with a screen reader if this rule affects a key interaction.

Use with AI

Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.

Check

Verify implementation

Verify that `td` headers attributes reference valid and existing `th` IDs.

Fix

Auto-fix issues

Correct the `headers` attribute to reference the appropriate `th` IDs.

Explain

Learn more

Explain when to use the `headers` attribute instead of `scope` for complex table structures.

Review

Code review

Review the rendered markup and interactive states that affect Link table cells to headers using IDs. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.

Sources

References used to support the guidance in this rule.

Further Reading

Tools and supplementary material for exploring the topic in more depth.

axe DevTools
deque.comTool

Rules that often go hand-in-hand with this one.

Use semantic table markup for screen readers

Data tables use proper semantic markup with headers, captions, and scope attributes for screen reader accessibility.

Accessibility
Define proper table headers

Checks that data tables have proper headers

Accessibility
Use unique IDs for active elements

All focusable or active elements must have a unique ID attribute.

Accessibility
Ensure tables have unique accessible names

Checks that data tables have unique accessible names

Accessibility

Was this rule helpful?

Your feedback helps improve rule quality. This stays internal for now.

Loading feedback...
0 / 385