1.3.1 Info and Relationships

Level: A | Principle: Perceivable | Since: WCAG 2.0 | Automation: Partial (axe-core)


What This Means

Information, structure, and relationships conveyed through visual presentation must also be available programmatically. If something looks like a heading, it must BE a heading (<h1><h6>). If something looks like a list, it must BE a list (<ul>, <ol>). If a table has headers, they must be marked up as <th>.

Screen readers rely on semantic HTML to understand page structure. Without it, a visually organized page becomes a flat wall of text.

Who This Affects

  1. Screen reader users — they navigate by headings, lists, and landmarks
  2. Users of reading tools — tools that extract structure depend on semantic HTML
  3. Users who customize CSS — custom stylesheets rely on correct semantics

Common Pitfalls

1. Using visual styling instead of semantic elements

<!-- Bad: looks like a heading but isn't one -->
<p style="font-size: 24px; font-weight: bold">Section Title</p>

<!-- Good -->
<h2>Section Title</h2>

2. Skipping heading levels

<!-- Bad: jumps from h1 to h3 -->
<h1>Page Title</h1>
<h3>Section</h3>

<!-- Good -->
<h1>Page Title</h1>
<h2>Section</h2>

3. Lists not using list elements

<!-- Bad -->
<div>• Item one</div>
<div>• Item two</div>

<!-- Good -->
<ul>
  <li>Item one</li>
  <li>Item two</li>
</ul>

4. List items outside a list

<!-- Bad -->
<li>Orphaned list item</li>

<!-- Good -->
<ul>
  <li>Properly nested list item</li>
</ul>

5. Tables without proper headers

<!-- Bad -->
<table>
  <tr><td>Name</td><td>Email</td></tr>
  <tr><td>Gandalf</td><td>gandalf@shire.com</td></tr>
</table>

<!-- Good -->
<table>
  <tr><th>Name</th><th>Email</th></tr>
  <tr><td>Gandalf</td><td>gandalf@shire.com</td></tr>
</table>

How to Test

  1. Open DevTools (F12) and inspect the page structure. Verify that visual headings use <h1>-<h6> elements (not styled <p> or <div> tags).
  2. Check heading levels are sequential and do not skip levels (e.g., no <h1> followed by <h3> without an <h2>).
  3. Verify that visual lists use <ul>, <ol>, or <dl> elements, and that all <li> elements are inside a list parent.
  4. Inspect data tables for proper <th> headers and check that complex tables use scope or headers attributes.
  5. Disable CSS in the browser and read the page to confirm the content still has a logical, understandable structure.
  6. Pass: All visual structure (headings, lists, tables, form groups) is conveyed through correct semantic HTML elements.
  7. Fail: Any heading is a styled <div>/<p>, lists use non-list markup, table headers are <td> instead of <th>, or structure breaks when CSS is disabled.

axe-core Rules

| Rule | What It Checks | |------|---------------| | heading-order | Heading levels increase by one | | list | <ul> and <ol> only contain <li> | | listitem | <li> must be inside <ul> or <ol> | | definition-list | <dl> only contains <dt> and <dd> | | th-has-data-cells | <th> must relate to data cells |

Tools

Test this criterion with the Heading Structure Checker.

Sources

  1. W3C WCAG 2.2 — Understanding 1.3.1
  2. axe-core: heading-order
  3. MDN: HTML Semantic Elements