HTML elements Screen reader compatibility

HTML
Sep 11, 2022

Shows how different HTML elements 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)

a

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (92% average)100% 94% 100% 100% 96% 100% 91% 90%
Should work. Fails in 1% - 25% Click Here link with aria-describedby attributeGoodGoodGoodGoodBetterGoodBetterGood
Should work. Fails in 1% - 25% Click Here link with title attributeGoodGoodGoodGoodBetterGoodBetterBetter
Should work. Works in 100% Link containing img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% Link containing img with titleGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% Link text replaced by aria-label attributeGoodBetterGoodGoodBetterGoodGoodGood
Should work. Fails in 1% - 25% Link text replaced by aria-labelledby attributeGoodBetterGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% a element placeholder link with no event handler or href attributeGoodGoodGoodGoodGoodGoodBadGood
Should work. Fails in 1% - 25% fieldset containing linksGoodBetterGoodGoodGoodGoodBetterBad
Should fail. Fails in 51% - 75% A link with empty labelBadBadBadBadBadBadBetterBetter
Should fail. Fails in 76% - 100% A link with non-breaking space as labelBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Link target opens in new windowBadBadBadBadBadBadBetterBetter
Should fail. Fails in 76% - 100% Link containing img with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Link containing img without altBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% Link with aria-label containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 1% - 25% Link with aria-labelledby containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 51% - 75% Link with onclick but no hrefBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% Link with title containing img with no altGoodBetterGoodGoodBetterGoodBetterGood

abbr

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (0% average)0% 0% 0% 0% 0% 0% 0% 0%
Should work. Fails in 76% - 100% abbr with titleBadBadBadBadBadBadBadBad

acronym

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 76% - 100% acronym with titleBadBadBadBadBadBadBadBad

applet

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (74% average)100% 90% 100% 100% 63% 88% 53% 100%
Should work. Fails in 1% - 25% applet inside figure with figcaption elementGoodGoodGoodGoodBetterBetterGoodGood
Should work. Fails in 26% - 50% applet with aria-label attributeGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 26% - 50% applet with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 26% - 50% applet with title attributeGoodBetterGoodGoodBetterGoodBetterGood
Should work. Fails in 1% - 25% applet with fallback contentGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 26% - 50% applet with alt attributeGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 26% - 50% applet with no descriptionGoodBetterGoodGoodBetterGoodBetterGood

area

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (69% average)100% 62% 100% 100% 49% 100% 74% 12%
Should work. Fails in 1% - 25% area and img with alt attributesGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% area with alt attribute and img with null altGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 26% - 50% area with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 26% - 50% area with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBadBad
Should work. Fails in 26% - 50% area with title attributeGoodBadGoodGoodBadGoodBetterBad
Should fail. Fails in 51% - 75% Image map with no name attributeBadBetterBadBadBetterBadBadBad
Should fail. Fails in 76% - 100% area with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% area with null altBadBadBadBadBadBadBadBad

audio

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (1% average)0% 0% 0% 0% 0% 0% 0% 0%
Should work. Fails in 76% - 100% audio with aria-label attributeBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% audio with aria-labelledby attributeBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% audio with title attributeBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% audio with fallback contentBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% audio with no descriptionBadBadBadBadBadBadBetterBad

button

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (89% average)100% 100% 100% 100% 83% 100% 83% 83%
Should work. Fails in 1% - 25% button containing img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% button containing img with aria-labelGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% button containing img with aria-labelledbyGoodGoodGoodGoodBadGoodGoodGood
Should work. Fails in 1% - 25% button containing img with title attributeGoodGoodGoodGoodGoodGoodBadBad
Should work. Fails in 1% - 25% button with aria-label containing img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% button with title containing img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% button containing img with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% button containing img with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% button with aria-label containing img with no altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 1% - 25% button with title containing img with no altGoodGoodGoodGoodGoodGoodGoodGood

caption

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (93% average)100% 100% 100% 100% 90% 100% 100% 63%
Should work. Fails in 1% - 25% Data table with caption and thGoodGoodGoodGoodBetterGoodGoodBad
Should fail. Fails in 76% - 100% Data table with caption but no thBadBadBadBadBadBadBadBad

dd

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 76% - 100% Definition lists with images as bulletsBadBadBadBadBadBadBadBad

div

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (93% average)100% 100% 100% 100% 100% 100% 100% 100%
Should work. Fails in 1% - 25% ARIA role=headingGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% Nested ARIA headingsBadBadBadBadBadBadBadBetter

embed

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (43% average)25% 78% 25% 25% 28% 55% 53% 34%
Should work. Fails in 1% - 25% embed inside figure with figcaptionGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 51% - 75% embed with aria-label attributeBadBetterBadBadBadBadBetterBetter
Should work. Fails in 76% - 100% embed with aria-labelledby attributeBadBetterBadBadBadBadBetterBetter
Should work. Fails in 76% - 100% embed with title attributeBadBetterBadBadBadBadBetterBetter
Should fail. Fails in 76% - 100% embed with alt attributeBadBadBadBadBadBadBetterBetter
Should fail. Fails in 76% - 100% embed with no descriptionBadBadBadBadBadBadBetterBad

fieldset

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (87% average)100% 92% 100% 100% 95% 100% 92% 56%
Should work. Fails in 1% - 25% Yes/No radio buttons inside fieldset elementGoodGoodGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% fieldset containing linksGoodBetterGoodGoodGoodGoodBetterBad
Should fail. Fails in 51% - 75% Yes/No radio buttons without fieldsetBadBadBadBadBadBadBadBetter
Should fail. Fails in 1% - 25% fieldset containing no controlsBadBadBadGoodBetterBetterBadBad
Should fail. Fails in 26% - 50% fieldset used to put border round textBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% fieldset with blank legendBadBadBadBadBadBadBadBad
Should fail. Fails in 26% - 50% fieldset with no legendBadBadBadBadBadBadBadBetter

figcaption

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (84% average)100% 100% 100% 100% 70% 60% 64% 64%
Should work. Fails in 1% - 25% applet inside figure with figcaption elementGoodGoodGoodGoodBetterBetterGoodGood
Should work. Fails in 1% - 25% embed inside figure with figcaptionGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 26% - 50% img with figcaptionGoodGoodGoodGoodBetterBetterBadBad

figure

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (84% average)100% 100% 100% 100% 70% 60% 64% 64%
Should work. Fails in 1% - 25% applet inside figure with figcaption elementGoodGoodGoodGoodBetterBetterGoodGood
Should work. Fails in 1% - 25% embed inside figure with figcaptionGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 26% - 50% img with figcaptionGoodGoodGoodGoodBetterBetterBadBad

h1-h6

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (100% average)100% 100% 100% 100% 100% 100% 100% 100%
Should work. Works in 100% Heading is img with altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 1% - 25% Empty headingGoodGoodGoodGoodGoodGoodGoodBetter
Should fail. Fails in 76% - 100% Heading is img alt=filenameBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Heading is img with `alt=BadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Heading is img with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% Heading non-breaking spacesBadBetterBadGoodBetterGoodBetterGood
Should fail. Fails in 76% - 100% Heading only punctuationBadBadBadBadBadBadBadBetter
Should fail. Fails in 1% - 25% Heading only spacesGoodGoodGoodGoodGoodGoodGoodBetter
Should fail. Fails in 76% - 100% Nested headingsBadBadBadBadBadBadBadBad

html

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (59% average)56% 46% 69% 67% 54% 77% 54% 54%
Should work. Fails in 26% - 50% Match lang subtagsBadBadBadGoodGoodGoodGoodGood
Should work. Works in 100% Page with lang set on the html and p elementsGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 76% - 100% Page with xml:lang set on the html and p elementsBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% application/xhtml+xml page with mismatching lang and xml:lang on the html elementBadBadBadBadBadBadBadBad
Should work. Works in 100% text/html page with mismatching lang and xml:lang on the html elementGoodGoodGoodGoodGoodGoodGoodGood

iframe

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (88% average)100% 56% 100% 100% 95% 100% 75% 100%
Should work. Fails in 1% - 25% iframe with title attributeGoodBadGoodGoodBetterGoodGoodGood
Should work. Fails in 1% - 25% iframe with fallback contentGoodBadGoodGoodBetterGoodBadGood
Should fail. Fails in 76% - 100% iframe where src is a PNG imageBadBadBadBadBadBadBetterBad
Should fail. Fails in 51% - 75% iframe with title matching frame filenameBadBadBadBadBadBadBadGood
Should fail. Fails in 1% - 25% iframe with blank titleGoodBadGoodGoodBetterGoodBadGood
Should fail. Fails in 1% - 25% iframe with no fallback content and no titleGoodBadGoodGoodBetterGoodBadGood

img

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (86% average)100% 89% 100% 100% 78% 98% 83% 69%
Should work. Works in 100% Heading is img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% Link containing img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% Link containing img with titleGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% area and img with alt attributesGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% area with alt attribute and img with null altGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 26% - 50% area with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 26% - 50% area with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBadBad
Should work. Fails in 26% - 50% area with title attributeGoodBadGoodGoodBadGoodBetterBad
Should work. Fails in 1% - 25% button containing img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% button containing img with aria-labelGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% button containing img with aria-labelledbyGoodGoodGoodGoodBadGoodGoodGood
Should work. Fails in 1% - 25% button containing img with title attributeGoodGoodGoodGoodGoodGoodBadBad
Should work. Fails in 1% - 25% button with aria-label containing img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% button with title containing img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% img with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% img with aria-labelGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% img with aria-labelledbyGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 26% - 50% img with figcaptionGoodGoodGoodGoodBetterBetterBadBad
Should work. Works in 100% img with titleGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% img with null altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% Definition lists with images as bulletsBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Heading is img alt=filenameBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Heading is img with `alt=BadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Heading is img with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 51% - 75% Image map with no name attributeBadBetterBadBadBetterBadBadBad
Should fail. Fails in 76% - 100% Link containing img with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Link containing img without altBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% Link with aria-label containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 1% - 25% Link with aria-labelledby containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 1% - 25% Link with title containing img with no altGoodBetterGoodGoodBetterGoodBetterGood
Should fail. Fails in 76% - 100% area with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% area with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% button containing img with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% button containing img with null altBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% button with aria-label containing img with no altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 1% - 25% button with title containing img with no altGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 51% - 75% img with alt set to ASCII art smileyBadBadBadBadBadBadGoodGood
Should fail. Fails in 76% - 100% img with alt set to src filenameBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% img with aria-describedbyBadBadBadBadBadBadGoodBad
Should fail. Fails in 76% - 100% img with null alt and non-null title attributesBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% img with null alt and non-null aria-label attributesBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% img with null alt and non-null aria-labelledby attributesBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% img with server side image mapBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% img without altBadBadBadBadBadBadBadBad

input type=image

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (97% average)100% 100% 100% 100% 100% 100% 100% 100%
Should work. Works in 100% input type=image with altGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% input type=image with aria-label attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% input type=image with aria-labelledby attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% input type=image with title attributeGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% input type=image with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% input type=image with null altBadBadBadBadBadBadBadBad

input type=radio

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (93% average)100% 100% 100% 100% 91% 100% 89% 78%
Should work. Fails in 1% - 25% Yes/No radio buttons inside fieldset elementGoodGoodGoodGoodBetterGoodBetterBetter
Should fail. Fails in 51% - 75% Yes/No radio buttons without fieldsetBadBadBadBadBadBadBadBetter

input type=text

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (96% average)100% 94% 100% 100% 99% 98% 93% 100%
Should work. Fails in 1% - 25% input type=text inside label with text after controlGoodGoodGoodGoodGoodBetterGoodGood
Should work. Fails in 1% - 25% input type=text inside label with text before and after controlGoodGoodGoodGoodGoodBetterBadGood
Should work. Works in 100% input type=text inside label with text before controlGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% input type=text with aria-describedby attributeGoodGoodGoodGoodBetterGoodBadGood
Should work. Fails in 1% - 25% input type=text with aria-label attributeGoodBetterGoodGoodGoodGoodGoodGood
Should work. Works in 100% input type=text with aria-labelledby attributeGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% input type=text with label forGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 1% - 25% input type=text with title attributeGoodBetterGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% input type=text inside blank labelBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% input type=text with blank label forBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% input with aria-labelledby pointing to role=presentation elementGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 51% - 75% label elements reference controls with duplicate idsBadBadBadBadBadBadBadBad

label

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (98% average)100% 100% 100% 100% 100% 95% 92% 100%
Should work. Fails in 1% - 25% input type=text inside label with text after controlGoodGoodGoodGoodGoodBetterGoodGood
Should work. Fails in 1% - 25% input type=text inside label with text before and after controlGoodGoodGoodGoodGoodBetterBadGood
Should work. Works in 100% input type=text inside label with text before controlGoodGoodGoodGoodGoodGoodGoodGood
Should work. Works in 100% input type=text with label forGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% input type=text inside blank labelBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% input type=text with blank label forBadBadBadBadBadBadBadBad
Should fail. Fails in 51% - 75% label elements reference controls with duplicate idsBadBadBadBadBadBadBadBad

legend

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (87% average)100% 92% 100% 100% 95% 100% 92% 56%
Should work. Fails in 1% - 25% Yes/No radio buttons inside fieldset elementGoodGoodGoodGoodBetterGoodBetterBetter
Should work. Fails in 1% - 25% fieldset containing linksGoodBetterGoodGoodGoodGoodBetterBad
Should fail. Fails in 1% - 25% fieldset containing no controlsBadBadBadGoodBetterBetterBadBad
Should fail. Fails in 26% - 50% fieldset used to put border round textBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% fieldset with blank legendBadBadBadBadBadBadBadBad
Should fail. Fails in 26% - 50% fieldset with no legendBadBadBadBadBadBadBadBetter
Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 76% - 100% CSS stylesheet link with media=auralBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% CSS stylesheet link with media=speechBadBadBadBadBadBadBadBad

map

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (69% average)100% 62% 100% 100% 49% 100% 74% 12%
Should work. Fails in 1% - 25% area and img with alt attributesGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% area with alt attribute and img with null altGoodGoodGoodGoodBetterGoodGoodGood
Should work. Fails in 26% - 50% area with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBad
Should work. Fails in 26% - 50% area with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBadBad
Should work. Fails in 26% - 50% area with title attributeGoodBadGoodGoodBadGoodBetterBad
Should fail. Fails in 51% - 75% Image map with no name attributeBadBetterBadBadBetterBadBadBad
Should fail. Fails in 76% - 100% area with no altBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% area with null altBadBadBadBadBadBadBadBad

object

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (45% average)100% 38% 100% 75% 42% 75% 50% 34%
Should work. Fails in 51% - 75% object with aria-label attributeGoodBetterGoodGoodBetterGoodBetterBetter
Should work. Fails in 51% - 75% object with aria-labelledby attributeGoodBetterGoodGoodBetterGoodBetterBetter
Should work. Fails in 51% - 75% object with title attributeGoodBetterGoodGoodBetterGoodBetterBetter
Should work. Fails in 51% - 75% object with fallback contentGoodBetterGoodBadBetterBadBetterGood
Should fail. Fails in 51% - 75% object with alt attributeGoodBetterBetterBadBetterBadBetterBetter
Should fail. Fails in 76% - 100% object with no descriptionGoodBetterBetterBadBetterBadBetterBetter

p

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (59% average)56% 46% 69% 67% 54% 77% 54% 54%
Should work. Fails in 26% - 50% Match lang subtagsBadBadBadGoodGoodGoodGoodGood
Should work. Works in 100% Page with lang set on the html and p elementsGoodGoodGoodGoodGoodGoodGoodGood
Should work. Fails in 76% - 100% Page with xml:lang set on the html and p elementsBadBadBadBadBadBadBadBad
Should work. Fails in 76% - 100% application/xhtml+xml page with mismatching lang and xml:lang on the html elementBadBadBadBadBadBadBadBad
Should work. Works in 100% text/html page with mismatching lang and xml:lang on the html elementGoodGoodGoodGoodGoodGoodGoodGood

pre

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 76% - 100% Space separated tablesBadBadBadBadBadBadBadBad

span

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (100% average)100% 100% 100% 100% 100% 100% 100% 100%
Should work. Works in 100% input type=text with aria-labelledby attributeGoodGoodGoodGoodGoodGoodGoodGood
Should fail. Fails in 76% - 100% Space separated wordsBadBadBadBadBadBadBadBad
Should fail. Fails in 1% - 25% input with aria-labelledby pointing to role=presentation elementGoodGoodGoodGoodGoodGoodGoodGood

table

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (76% average)89% 81% 89% 93% 86% 96% 66% 35%
Should work. Fails in 1% - 25% Data table with caption and thGoodGoodGoodGoodBetterGoodGoodBad
Should work. Fails in 51% - 75% Data table with role=columnheader headers but no thBadBadBadBadBadBadBadBad
Should work. Fails in 1% - 25% Data table with role=gridGoodGoodGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% Data table with summary and thGoodGoodGoodGoodBetterGoodBetterBad
Should work. Fails in 26% - 50% Data table with td headers attributeGoodGoodGoodGoodBadGoodBadBad
Should work. Fails in 26% - 50% Data table with th scope on cell headersGoodBetterGoodGoodGoodGoodBetterBad
Should work. Fails in 1% - 25% Data table with th cell headersGoodGoodGoodGoodGoodGoodGoodBetter
Should work. Fails in 1% - 25% Layout table with role=presentationGoodGoodGoodGoodGoodGoodGoodBetter
Should work. Fails in 1% - 25% Layout table with single cellGoodGoodGoodGoodGoodGoodGoodBetter
Should fail. Fails in 26% - 50% Data table th cell headers with no scopeGoodBetterGoodGoodBetterGoodGoodBad
Should fail. Fails in 76% - 100% Data table with caption but no thBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with role=noteBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with role=presentationBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with summary but no thBadBadBadBadBadBadBadBad
Should fail. Fails in 51% - 75% Data table with thead, tfoot but no thBadBadBadBadBadBadGoodBetter
Should fail. Fails in 76% - 100% Data table with no th elementsBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with null summary and no thBadBadBadBadBadBadBadBad

tbody

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (31% average)0% 0% 0% 33% 82% 60% 0% 0%
Should work. Fails in 51% - 75% Data table with role=columnheader headers but no thBadBadBadBadBadBadBadBad

td

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (69% average)75% 73% 75% 83% 80% 90% 50% 43%
Should work. Fails in 51% - 75% Data table with role=columnheader headers but no thBadBadBadBadBadBadBadBad
Should work. Fails in 26% - 50% Data table with td headers attributeGoodGoodGoodGoodBadGoodBadBad
Should work. Fails in 1% - 25% Layout table with role=presentationGoodGoodGoodGoodGoodGoodGoodBetter
Should work. Fails in 1% - 25% Layout table with single cellGoodGoodGoodGoodGoodGoodGoodBetter

tfoot

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 51% - 75% Data table with thead, tfoot but no thBadBadBadBadBadBadGoodBetter

th

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (78% average)100% 89% 100% 100% 82% 100% 66% 24%
Should work. Fails in 1% - 25% Data table with caption and thGoodGoodGoodGoodBetterGoodGoodBad
Should work. Fails in 1% - 25% Data table with role=gridGoodGoodGoodGoodBetterGoodBetterBad
Should work. Fails in 1% - 25% Data table with summary and thGoodGoodGoodGoodBetterGoodBetterBad
Should work. Fails in 26% - 50% Data table with td headers attributeGoodGoodGoodGoodBadGoodBadBad
Should work. Fails in 26% - 50% Data table with th scope on cell headersGoodBetterGoodGoodGoodGoodBetterBad
Should work. Fails in 1% - 25% Data table with th cell headersGoodGoodGoodGoodGoodGoodGoodBetter
Should fail. Fails in 26% - 50% Data table th cell headers with no scopeGoodBetterGoodGoodBetterGoodGoodBad
Should fail. Fails in 76% - 100% Data table with caption but no thBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with role=noteBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with role=presentationBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with summary but no thBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with no th elementsBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% Data table with null summary and no thBadBadBadBadBadBadBadBad

thead

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Should fail. Fails in 51% - 75% Data table with thead, tfoot but no thBadBadBadBadBadBadGoodBetter

tr

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (31% average)0% 0% 0% 33% 82% 60% 0% 0%
Should work. Fails in 51% - 75% Data table with role=columnheader headers but no thBadBadBadBadBadBadBadBad

video

Screen ReaderNVDAJAWSVoiceOver
BrowserEdgeFFCrEdgeFFCrMaciOS
Reliability when used correctly (26% average)0% 33% 0% 0% 6% 0% 63% 63%
Should work. Fails in 51% - 75% video with aria-label attributeBadBetterBadBadBadBadBetterBetter
Should work. Fails in 76% - 100% video with aria-labelledby attributeBadBetterBadBadBadBadBetterBetter
Should work. Fails in 51% - 75% video with title attributeBadBetterBadBadBadBadBetterBetter
Should fail. Fails in 76% - 100% video with fallback contentBadBadBadBadBadBadBadBad
Should fail. Fails in 76% - 100% video with no descriptionBadBadBadBadBadBadBadBad

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