Techniques for WCAG 2.0 and 2.1 Screen reader compatibility

WCAG
Nov 26, 2024

Shows how WCAG sufficient techniques and failures behave in commonly used screen readers.

The results include two types of test:

  • Expected to work - these tests show support when accessibility features are used correctly
  • Expected to fail - these tests show what happens when accessibility features are used incorrectly (marked with Expected to Fail)

WCAG sufficient techniques - reliability by user agent

Reliability of WCAG sufficient techniques in different screen reader / browser combinations. Expected failures (e.g. missing ALT on an IMG) are not included in the reliability graph.

The solid area in the graph shows percentage of tests that pass in all tested interaction modes. The cross hatched area shows partial passes that only work in some interaction modes.

An example of a partial pass is when form labels are read when tabbing, but ignored in browse mode.

ComboVersionsReliabilityTest Changes
JAWS ChromeJAWS 2024.2409.2 with Chrome 131
1 better
JAWS EdgeJAWS 2024.2409.2 with Edge 131
1 better
JAWS FirefoxJAWS 2024.2409.2 with FF 128
23 better
JAWS IEJAWS 2019.1912.1 with IE11
21 better
NVDA ChromeNVDA 2024.4 with Chrome 131
1 better 1 worse
NVDA EdgeNVDA 2024.4 with Edge 131
4 better
NVDA FirefoxNVDA 2024.4 with FF 128
26 better
NVDA IENVDA 2019.2 with IE11
4 better
VoiceOver MacVoiceOver macOS 14.6 with Safari 17.6
21 better
VoiceOver iOSVoiceOver iOS 17.7 with Safari iOS 17.7
11 better
WindowEyes IEWindowEyes 9.2 with IE11
14 better 1 worse
Dolphin IEDolphin SR 15.05 with IE11
SaToGo IESaToGo 3.4.96.0 with IE11
Average Including older versions

The average includes all versions, but some browser/AT combinations have tests for multiple versions (NVDA / JAWS / VoiceOver), while others only have tests for a single version (SaToGo and Dolphin).

WCAG sufficient techniques - reliability trend

This graph shows reliability over time for WCAG techniques in NVDA, JAWS and Voiceover. Other screen readers don't have enough historical data yet to plot trends.

100%80%60%40%20%0%201474%201573%201673%201776%201877%201978%202081%202181%202281%202382%202484%

WCAG sufficient techniques - very reliable

These are WCAG sufficient techniques, and work reliably across all tested screen readers, including older versions.

These work in 100% of the tested screen reader / browser combinations.

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (100% average)100% 100% 100% 100% 100% 100% 100% 100%
Should work. Works in 100% ARIA16 input type=text with aria-labelledby attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% H30 Link containing img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% H36 input type=image with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% H37 img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% H44 input type=text with label forGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% H67 img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% WCAG 3.1.1 Page with lang set on the html and p elementsGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% WCAG 3.1.1 text/html page with mismatching lang and xml:lang on the html elementGoodGoodGoodGoodGoodGoodGoodGood

WCAG sufficient techniques - reliable in recent versions

These are WCAG sufficient techniques, and are expected to work, and work in the latest versions of screen readers, but not in older versions marked with Better

100% of these techniques are not accessibility supported (i.e. cause failures) in one or more of the tested screen reader / browser combinations. On average they cause failures in 12% of the tested combinations.

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (88% average)100% 90% 100% 98% 86% 98% 92% 88%
Should work. Fails in 1% - 25% ARIA1 Click Here link with aria-describedby attributeGoodGoodGoodGoodBetterGoodBetterGood
Should work. Fails in 1% - 25% ARIA10 button containing img with aria-labelledbyGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 1% - 25% ARIA10 img with aria-labelledbyGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 26% - 50% ARIA10 applet with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 26% - 50% ARIA10 object with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% ARIA12 ARIA role=headingGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA14 input type=image with aria-label attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA14 input type=text with aria-label attributeGoodBetterGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA16 input type=image with aria-labelledby attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA6 applet with aria-label attributeGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 26% - 50% ARIA6 object with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% ARIA6 button with aria-label containing img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA6 img with aria-labelGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA7 Link text replaced by aria-labelledby attributeGoodBetterGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% ARIA8 Link text replaced by aria-label attributeGoodBetterGoodGoodBetterGoodGoodGood
Should work. Fails in 1% - 25% H33 Click Here link with title attributeGoodGoodGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% H35 applet with fallback contentGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 1% - 25% H39 Data table with caption and thGoodGoodGoodGoodBetterGoodGoodBetter
Should work. Fails in 1% - 25% H51 Data table with th cell headersGoodGoodGoodGoodGoodGoodGoodBetter
Should work. Fails in 26% - 50% H53 object with fallback contentGoodBetterGoodBetterBetterBetterBetterGood
Should work. Fails in 1% - 25% H64 iframe with title attributeGoodBetterGoodGoodBetterGoodGoodGood
Should work. Fails in 1% - 25% H65 input type=image with title attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% H65 input type=text with title attributeGoodBetterGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% H71 Yes/No radio buttons inside fieldset elementGoodGoodGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% H73 Data table with summary and thGoodGoodGoodGoodBetterGoodBetterBetter

WCAG sufficient techniques - poorly supported

These are WCAG sufficient techniques, and are expected to work, but don't work in the latest versions of some screen readers. Screen readers where support got worse in the latest version are marked with Worse

100% of these techniques are not accessibility supported (i.e. cause failures) in one or more of the tested screen reader / browser combinations. On average they cause failures in 43% of the tested combinations.

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (57% average)60% 64% 55% 59% 55% 59% 58% 43%
Should work. Fails in 1% - 25% ARIA1 input type=text with aria-describedby attributeGoodGoodGoodGoodBadGoodBetterGood
Should work. Fails in 26% - 50% ARIA10 area with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBadBad
Should work. Fails in 51% - 75% ARIA10 embed with aria-labelledby attributeBetterBetterBadBadBadBadBetterBetter
Should work. Fails in 76% - 100% ARIA10 audio with aria-labelledby attributeBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% ARIA10 video with aria-labelledby attributeBetterBetterBadBadBadBadBetterBetter
Should work. Fails in 51% - 75% ARIA6 embed with aria-label attributeBetterBetterBadBadBadBadBetterBetter
Should work. Fails in 76% - 100% ARIA6 audio with aria-label attributeBadBadBadBadBadBadBadBad
Should work. Fails in 51% - 75% ARIA6 video with aria-label attributeBetterBetterBetterBadBadBadBetterBetter
Should work. Fails in 1% - 25% ARIA6 area with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% G196 button containing img with altGoodGoodWorseGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% H24 area and img with alt attributesGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 76% - 100% H28 abbr with titleBadBadBadBadBadBadBadBad
Should work. Fails in 26% - 50% H43 Data table with td headers attributeGoodGoodGoodGoodBadGoodBadBad
Should work. Fails in 26% - 50% H63 Data table with th scope on cell headersGoodBetterGoodGoodGoodGoodBetterBad
Should work. Fails in 1% - 25% H64 Example 2 iframe with fallback contentGoodBetterGoodGoodBetterGoodBadGood
Should work. Fails in 1% - 25% H91 fieldset containing linksGoodBetterGoodGoodGoodGoodBetterBad
Should work. Fails in 26% - 50% PDF1 PDF1 Image with alt textGoodBetterBadGoodBadBadGoodGood
Should work. Fails in 76% - 100% PDF16 PDF16 Document default language set to FrenchBadBetterBadBadBetterBadBadBad
Should work. Fails in 26% - 50% PDF18 PDF18 Document with doc titleGoodGoodGoodGoodGoodGoodBadBad
Should work. Fails in 51% - 75% PDF19 PDF19 Phrase language set to GermanBadBadBadBadBadBadGoodGood
Should work. Fails in 26% - 50% PDF4 PDF4 Decorative image marked as artifactBadGoodBadBadBetterBadGoodGood
Should work. Fails in 51% - 75% PDF6 PDF6 Table with header markupBadBetterBadBadBetterBadBetterGood
Should work. Fails in 51% - 75% PDF6 PDF6 Table with header markup and alt textBadBetterBadBadBetterBadBetterGood
Should work. Fails in 51% - 75% PDF9 PDF9 Document with headingsBadBetterBadBadBetterBadGoodGood
Should work. Fails in 76% - 100% WCAG 3.1.1 Page with xml:lang set on the html and p elementsBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% WCAG 3.1.1 application/xhtml+xml page with mismatching lang and xml:lang on the html elementBadBadBadBadBadBadBadBad
Should work. Fails in 26% - 50% WCAG 3.1.1 Match lang subtagsBadBadBadGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% placeholder links a element placeholder link with no event handler or href attributeGoodGoodGoodGoodGoodGoodBadGood

WCAG failures

These are WCAG failures, and are expected to fail.

100% of these techniques fail in one or more of the tested screen reader / browser combinations. On average they cause failures in 74% of the tested combinations.

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 1% - 25% ARIA8 Link with aria-label containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 76% - 100% F22 Link target opens in new windowBadBadBadBadBadBadBetterBetter
Should fail. Fails in 51% - 75% F30 iframe with title matching frame filenameBadBadBadBadBadBadBadGood
Should fail. Fails in 76% - 100% F30 img with alt set to src filenameBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F32 Space separated wordsBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F34 Space separated tablesBadBadBadBadBadBadBadBad
Should fail. Fails in 51% - 75% F42 Link with onclick but no hrefBadBadBadBadBadBadBadBad
Should fail. Fails in 26% - 50% F43 fieldset used to put border round textBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F65 input type=image with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F65 input type=image with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F65 img without altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F65 Link containing img without altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F71 Look alike unicode charsBadBadBadBadBadBadBadBad
Should fail. Fails in 51% - 75% F72 img with alt set to ASCII art smileyBetterBetterBadBadBadBadGoodGood
Should fail. Fails in 51% - 75% F77 label elements reference controls with duplicate idsBadBadBadBadBadBadBadBad
Should fail. Fails in 26% - 50% F87 CSS content: property on linkGoodGoodGoodGoodBetterGoodGoodGood
Should fail. Fails in 1% - 25% F87 CSS content: property on divGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% F89 Link containing img with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F91 Data table with no th elementsBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% F92 Data table with role=presentationBadBadBadBadBadBadBadBad

Key

Tests expected to fail (due to authoring errors) are marked with Expected to Fail.

  • Works in all Works in 100% of tested screen readers
  • 75% to 99% Fails in 1% - 25% of tested screen readers
  • 50% to 74% Fails in 26% - 50% of tested screen readers
  • 25% to 49% Fails in 51% - 75% of tested screen readers
  • 0% to 24% Fails in 76% - 100% of tested screen readers
  • Stable Stable - works, or doesn't cause problems, in all versions of a specific combination of screen reader and browser
  • Better Better - works, or doesn't cause problems, in the most recent version of a specific combination of screen reader and browser (improvement)
  • Worse Worse - causes problems in the most recent version of a specific combination of screen reader and browser, but used to work in older versions (regression)
  • Broken Broken - causes problems in all versions of a specific combination of screen reader and browser

Test notes

All tests were carried out with screen reader factory settings. JAWS in particular has a wide variety of settings controlling exactly what gets spoken.

Screen readers allow users to interact in different modes, and can produce very different results in each mode. The modes used in these tests are:

  • Reading Content read using the “read next” command in a screen reader
  • Tabbing Content read using the “tab” key in a screen reader
  • Heading Content read using the “next heading” key in a screen reader
  • Touch Content read when touching an area of screen on a mobile device

In the “What the user hears” column:

  • Commas represent short pauses in screen reader voicing
  • Full Stops represent places where voicing stops, and the “read next” or “tab” or “next heading” command is pressed again
  • Ellipsis … represent a long pause in voicing
  • (Brackets) represent voicing that requires a keystroke to hear