Fixes by subject · 88 techniques
How to Fix Page Structure and Headings
Headings are how most screen reader users get around a page, and 1.3.1 reaches a lot further than headings.
Screen reader users pull up a list of a page's headings and jump straight to the section they want, the way a sighted reader scans down the page. Text that only looks like a heading never appears in that list. This is also the biggest subject in the library, more than a fifth of it, because 1.3.1 Info and Relationships reaches into tables, lists, forms and landmarks as well as headings. The techniques here cover marking up headings, lists and regions properly, and keeping reading order meaningful when CSS moves things around. They also cover giving every page a descriptive title, and the failures that come from formatting text instead of structuring it. One thing to settle before you start, because it saves an argument later. WCAG sets no number of h1 elements and does not require heading levels to run without a skip, so a tidy outline is good work here rather than a Level AA obligation.
All 88 techniques
They run in technique order, and each one carries a tag. Sufficient techniques satisfy a rule. Advisory ones help without being required. Failures document a specific way of getting it wrong. None of them is mandatory, because W3C publishes techniques as documented ways of meeting a criterion rather than the only ways, so your own approach conforms as long as it meets the criterion.
- H42Sufficient1.3.1Use real heading tags, not styled bold text
- H48Sufficient1.3.1Mark up lists with real list elements
- H44Sufficient1.1.1, 1.3.1, 3.3.2, 4.1.2Attach a real label to every form field
- H25Sufficient2.4.2Give every page a descriptive title
- ARIA16Sufficient4.1.2, 1.3.1Name controls from visible text with aria-labelledby
- H33Sufficient2.4.4, 2.4.9Supplement vague link text with a title attribute
- H34Sufficient1.3.2Keep mixed-direction text reading in the right order
- H39Sufficient1.3.1Caption data tables so their purpose is clear
- H40Sufficient3.1.3Mark up term-and-definition pairs as description lists
- H43Sufficient1.3.1Connect complex table cells to headers with ids
- H49Sufficient1.3.1Use real markup for emphasized or special text
- H51Sufficient1.3.1Use real table markup for tabular data
- H56Sufficient1.3.2Fix nested right-to-left text with the dir attribute
- H63Sufficient1.3.1Add scope to table header cells
- H64Sufficient4.1.2, 2.4.1Give every iframe a descriptive title
- H65Sufficient1.1.1, 1.3.1, 4.1.2Label form fields when a visible label will not fit
- H69Sufficient2.4.1, 2.4.10Start every content section with a real heading
- H71Sufficient1.3.1, 3.3.2Group related form fields with fieldset and legend
- H77Sufficient2.4.4Give list links context from their list item
- H78Sufficient2.4.4Give links context from their enclosing paragraph
- H79Sufficient2.4.4Give table links context from cells and headers
- H80Advisory2.4.4Give links context from the heading above them
- H81Sufficient2.4.4Give nested list links context from parent items
- H85Sufficient1.3.1Group long select lists with optgroup
- H97Sufficient2.4.1, 1.3.1Wrap navigation link groups in nav elements
- H99Advisory2.4.5Let users jump between pages of content
- H101Sufficient1.3.1Identify page regions with semantic HTML elements
- T1Sufficient1.3.1Separate plain-text paragraphs the standard way
- T2Sufficient1.3.1Format plain-text lists with standard conventions
- T3Sufficient1.3.1Format plain-text headings with standard conventions
- ARIA1Sufficient1.3.1, 3.3.2Attach help text to inputs with aria-describedby
- ARIA2Advisory1.3.1, 3.3.1, 3.3.2Tell screen readers a field is required
- ARIA11Sufficient1.3.1, 1.3.6, 2.4.1Add landmarks so users can skip around
- ARIA12Sufficient1.3.1Use role=heading when h1-h6 is impossible
- ARIA13Sufficient1.3.1Name repeated landmarks so they are distinguishable
- ARIA17Sufficient1.3.1, 3.3.2Group related form fields with ARIA roles
- ARIA20Sufficient1.3.1Mark leftover page areas with role=region
- ARIA24Sufficient1.3.1Give meaningful font icons role=img
- ARIA26Sufficient1.3.1, 2.4.8Mark the current page with aria-current
- C6Sufficient1.3.2, 1.4.5, 1.4.9, 2.4.1Keep source order meaningful when CSS repositions content
- C8Sufficient1.3.2, 1.4.5, 1.4.9, 1.4.12Space letters with CSS, not blank characters
- C22Sufficient1.3.1, 1.4.4, 1.4.5, 1.4.9Style real text instead of text images
- C27Sufficient1.3.2, 2.4.3Match DOM order to visual order
- SCR24Sufficient2.4.4, 2.4.6, 2.4.9, 3.2.5Open new windows only when the user asks
- F1Failure1.3.2Do not rearrange meaning with CSS positioning
- F2Failure1.3.1Do not fake structure with styled text
- F25Failure2.4.2Do not ship page titles that identify nothing
- F32Failure1.3.2Never spread words apart with real spaces
- F33Failure1.3.1, 1.3.2Do not fake columns with white space characters
- F34Failure1.3.1, 1.3.2Do not format tables with white space characters
- F42Failure1.3.1, 2.1.1, 4.1.2Do not emulate links with scripted spans
- F43Failure1.3.1Do not use structural markup for visual effects
- F46Failure1.3.1Never put th or caption in a layout table
- F48Failure1.3.1Do not publish data tables as preformatted text
- F49Failure1.3.2Do not use layout tables that read as nonsense
- F63Failure2.4.4Do not strand link context away from the link
- F90Failure1.3.1Do not mis-wire headers and id attributes in tables
- F91Failure1.3.1Do not style table headers instead of marking them up
- F92Failure1.3.1Do not put role="presentation" on meaningful content
- F111Failure1.3.1, 2.5.3, 4.1.2Do not leave labeled controls without a name
- G57Sufficient1.3.2Put content in a meaningful reading order
- G63Sufficient2.4.5, 2.4.8Offer a site map as another route
- G64Sufficient2.4.5Provide a table of contents for long documents
- G65Sufficient2.4.8Show a breadcrumb trail on deep pages
- G88Sufficient2.4.2Write page titles that describe the page
- G115Sufficient1.3.1Mark up structure with semantic elements
- G117Sufficient1.3.1State in text what styling alone conveys
- G127Sufficient2.4.2, 2.4.8Show each page's place in its collection
- G130Sufficient2.4.6Write headings that describe their sections
- G131Sufficient2.4.6, 3.3.2Write labels that describe their fields
- G138Sufficient1.3.1Add semantic markup wherever color carries meaning
- G140Sufficient1.3.1, 1.4.5, 1.4.9Keep content and structure separate from presentation
- G141Sufficient1.3.1, 2.4.10Organize every page with a heading hierarchy
- G162Sufficient1.3.1, 2.5.3, 3.3.2Position labels where users expect them
- G185Sufficient2.4.5Link every site page from the home page
- G189Sufficient2.4.4, 2.4.9Offer a switch to self-describing link text
- G190AdvisoryLink inaccessible objects to accessible versions
- G201Advisory2.4.4, 2.4.6, 2.4.9, 3.2.5Warn users before opening a new window
- PDF3Sufficient1.3.2, 2.1.1, 2.4.3Fix the reading and tab order in PDFs
- PDF6Sufficient1.3.1Tag PDF tables as real tables
- PDF9Sufficient1.3.1, 2.4.1Tag PDF headings with real heading tags
- PDF10Sufficient1.3.1, 3.3.2, 4.1.2Label every field in your PDF forms
- PDF11Sufficient1.3.1, 2.1.1, 2.4.4, 2.4.9Tag PDF links so they are announced
- PDF12Sufficient1.3.1, 4.1.2Give PDF form fields a name, role, and value
- PDF17Sufficient1.3.1, 2.4.8, 3.2.3Make PDF page numbers match the printed pages
- PDF18Sufficient2.4.2Give every PDF a real document title
- PDF20Sufficient1.3.1Repair mistagged tables with Acrobat's Table Editor
- PDF21Sufficient1.3.1Tag PDF lists so they read as lists
More on Structure and headings
The other 13 subjects
Knowing the technique is not the same as knowing you need it.
The free scan checks 10 pages in a real browser and maps every machine-checkable failure to the exact fix guide that clears it.