VoiceOver/iOS HTML Support

A Work in progress: Last updated 02 October 2024.

Editor: Steve Faulkner

Github Repo: screen-reader-HTML-support

Found a bug? Please report it.

WORK IN PROGRESS

Note: 02 October 2024: The information for VoiceOver on iOS may be incorrect, incomplete and/or contradictory Until noted otherwise, do not rely upon it!

How HTML elements are supported by screen readers

Typical support patterns of HTML elements by screen readers:

Note: The combination of patterns supported varies from element to element and support for a particular element varies between screen reader software.

Support legend

VoiceOver on iOS (2024) HTML Support - Chrome Version 129.0.6668.90 (Official Build) (64-bit)
Element Test Case Represents AURAL UI Interaction Supported Notes
<a href> a with href Link with an href Announces "link" + link text

Swipe left/right, double-tap to activate

Rotor navigation to links, announces number of links

single finger swipe up/down to navigate when selected in rotor

Recognizes visited/unvisited state of links.

Link number anounced by rotor is incorrect as VO announces parts of a link text as seperate links. On the link test page there are 3 links, but VO reports as 9 links.

<abbr> abbr Abbreviated term Reads text only, not title No special interaction No additional semantics conveyed  if title is present.
<address> address Contact information Reads text only No special interaction No additional semantics conveyed.
<area> area Interactive area within an image map Announces alt text + "link" Swipe left/right to navigate Requires alt for accessibility.
<article> article Self-contained composition Reads text only, does not announce article Rotor to 'articles' Swipe down with one finger to navigate by <article> No additional semantics conveyed. Documentation states that swipe one finger up should naviagte back through articles, but does not appear to work. article does support aria-describedby and announces "Description..." after visible text.
<aside> aside Tangentially related content Announces "complementary" Rotor to 'landmarks' announces number of landmarks. Recognized as complementary region.
<audio> audio Audio content with controls Announces "audio" Double-tap to play/pause. Swipe up down with one finger to operate the time scrubber. Accessible buttons available in the player. The time scrubber operation is flaky when VoiceOver is enabled.
<b> Bold text bolded for utilitarian purposes Reads content as normal text No special interaction No specific emphasis exoected.
<base> no test Base URL for relative links No aural feedback Not interactive Typically ignored by VoiceOver.
<bdi> bdi Isolates a span of text Reads content as normal text No special interaction No aural impact; structure-only element.
<bdo> bdo Overrides the current text direction Reads content as normal text No special interaction No special semantics conveyed. Reads text correctly regardless of direction.
<blockquote> Block quote Quoted block content Reads content as normal text No special interaction No additional semantics conveyed.
<body> no test Document body Reads content No special interaction No unique aural feedback; body is implicit.
<br> br Line break within text Announces nothing No special interaction No additional semantics conveyed.Treated as one new line, regardless of number of <br> elements
<button> Button Operable button control Announces "button" + label

Double-tap to activate

Rotor navigation to buttons or form controls, announces number of buttons/controls

single finger swipe up/down to navigate when selected in rotor

Announced as "toggle button" label and state (pressed/unpressed) when button has aria-pressed.
<canvas> canvas Scriptable bitmap canvas Announces "graphic" if aria-label and Role="img" is provided, Other wise ignores canvas Focusable via swipe gestures if role="img" present or sub DOM contains content.

Sub DOM content announced if available.

Canvas not idenified without explicit role

<caption> Table caption Title for a table Announces as part of the table. Role not announced Rotor navigation to tables, announces number of tables

Properly linked to the table it describes.

When rotor set to Tables, single finger swipe up or down, moves to next/previous table,table caption is announced, the "start of table" the row and column number.

<cite> cite Reference to a creative work Reads content as normal text No special interaction No specific aural emphasis.
<code> code Inline code or programming syntax Reads element content No special interaction No unique treatment; read as normal text.
<col> no test Defines column properties No aural indication Not directly interactive Impact conveyed through table structure only.
<colgroup> colgroup Groups multiple columns in a table No aural indication Not directly interactive Structure-enhancing, with no direct aural output.
<data> data Data and its human-readable equivalent Reads element content No special interaction Treated as regular text.
<datalist> datalist Provides options for an input field Announces "text field, listbox popup" Double-tap to select List of suggestions appear in browser suggestions rather than as a listbox. With VO enabled cannot display listbox.
<dd> dd Content of a term's description announces start of "description list" Reads element content suffixed with "Description" announces "description list end"   Properly grouped with its dt.
<del> del Marked as deleted Announces "deletion" then text No special interaction  
<details> details Expandable/collapsible content Announces <summary> text, button, collapsed or expanded (when details content is visible) Double-tap to expand/collapse Recognizes expanded/collapsed state.
<dfn> dfn Indicates a defining instance of a term Reads element content not role No special interaction No unique treatment beyond reading.
<dialog> dialog Modal dialog

On button that invokes a dialog: announces button text, pop up button, popup dialog

On dialog: anounces "web dialog", accessible name reads auto focused control on dialog

Focus moves to dialog on open Recognizes and traps focus within modal dialog. When dialog closed does not return focus to triggering control unless the dialog has an accessible name.
<div> div Generic block container Reads element content No special interaction  
<dl> dl List of term-definition pairs announces start of "description list" Not recognised as a list in rotor navigation  
<dt> dt Term in a definition list Reads element content suffixed with "term" Part of list navigation Associated with the following dd.
<em> em Emphasized text Reads with emphasis No special interaction Uses different intonation for emphasis.
<embed> embed Embeds external resources Announces "embedded object" Swipe to interact Behavior depends on embedded content.
<fieldset> fieldset Groups related form controls Announces "group start/end" Swipe to navigate form controls Recognizes fieldset and legend association.
<figcaption> FigureCaption Caption for a figure element Reads caption text No special interaction Recognized as part of the figure.
<figure> figure Self-contained content Announces "figure" Swipe to navigate Properly reads as a grouped item.
<footer> footer Page or section footer Announces "content info" Rotor to 'landmarks' Recognized as a landmark region.
<form> form Collects user input Announces "form" Swipe to navigate form controls Recognizes form controls and fieldsets.
<h1> to <h6> headings Headings with different levels Announces "heading level X" Rotor to 'headings', swipe to navigate Properly identifies heading level and content.
<head> head [no test]   No aural indication No special interaction No direct aural impact.
<header> header Header section Announces "banner" Rotor to 'landmarks' Identified as a landmark region.
<hgroup>            
<hr> hr Horizontal rule or separator Announces "separator" Swipe left/right to navigate Properly indicates a thematic break.
<html> html [no test] Main HTML element No aural indication No special interaction No direct aural impact.
<i> i          
<iframe> iframe Nested browsing context Announces "frame" Swipe left/right to navigate Recognizes frame's title if available.
<img> img Embedded image Announces "image" + alt text Double-tap to interact Reads alt or "image" if missing.
<input type="button"> input [button] Clickable button Announces "button" + label Double-tap to activate Reads the label and responds to activation.
<input type="checkbox"> input [checkbox] Check/uncheck control Announces "checkbox, checked/unchecked" Double-tap to toggle state Recognizes label and state (checked/unchecked).
<input type="color"> input [color] Color selection control Announces "color picker" Double-tap to open color picker Allows selection of colors from the palette.
<input type="date"> input [date] Date selection control Announces "date edit" Swipe to navigate values, double-tap Provides date-specific input options.
<input type="datetime-local"> input [datetime-local] Date selection control Announces "date edit" Swipe to navigate values, double-tap Provides date-specific input options.
<input type="email"> input [email] Email address entry Announces "email edit" Normal text entry interaction Provides email-specific keyboard.
<input type="file"> input [file] File selection/upload control Announces "file upload" Double-tap to choose files Allows file browsing and selection.
<input type="hidden"> input [hidden] [no test] Non-visible input No aural feedback Not interactive Used for form data; ignored by VoiceOver.
<input type="image"> input [image] Submit button with an image Announces "image button" + alt text if present Double-tap to activate Acts like a regular button, but with an image.
<input type="month"> input [month] Month and year input Announces "month edit" Swipe to navigate, double-tap Provides a month/year picker interface.
<input type="number"> input [number] Numeric entry Announces "number edit" Swipe to increase/decrease value Provides numeric keypad for input.
<input type="password"> input [password] Password entry field Announces "secure text field" Normal text entry interaction Characters are masked as entered.
<input type="radio"> input [radio] Radio button option Announces "radio button" + checked/unchecked Double-tap to select Recognizes grouping with other radio buttons.
<input type="range"> input [range] Range input using a slider Announces "slider" + current value Swipe to adjust value Allows setting a value within a defined range.
<input type="reset"> input [reset] Resets form fields Announces "reset button" Double-tap to activate Resets all form inputs to their default values.
<input type="search"> input [search] Search query entry Announces "search edit" Normal text entry interaction Provides search-specific keyboard.
<input type="submit"> input [submit] Form submission button Announces "submit button" Double-tap to submit Submits the form data to the server.
<input type="tel"> input [tel] Telephone number entry Announces "phone edit" Normal text entry interaction Provides a phone-specific keypad.
<input type="text"> input [text] Single-line text entry Announces "text field" Normal text entry interaction Standard text input field.
<input type="time"> input [time] Time picker control Announces "time edit" Swipe to adjust values, double-tap Provides an hour/minute input interface.
<input type="url"> input [url] URL entry field Announces "URL edit" Normal text entry interaction Provides URL-specific keyboard.
<input type="week"> input [week] Week number input Announces "week edit" Swipe to adjust values, double-tap Allows selection of a week within a year.
<ins> ins Recently added text Announces "insertion" before inserted text No special interaction  
<kbd> kbd User keyboard input representation Reads element content No special interaction No special treatment beyond normal text.
<label> label Descriptive label for input Announces label when focusing on input Swipe to focus on associated input Provides context for form controls.
<legend> legend Caption for a fieldset Announces as part of fieldset No special interaction Provides context to grouped form controls.
<li> li Item in an ordered/unordered list Announces position in list Swipe to navigate Recognizes item count and position.
<link> link [no test] Link to external resources (CSS, icons) No aural feedback Not interactive Generally ignored by screen readers.
<main> main Main content area Announces "main" Rotor to 'landmarks', swipe to navigate Recognized as a landmark region.
<map> map Collection of areas within an image No direct aural indication Interaction via associated <area> elements VoiceOver recognizes linked areas in the map.
<mark> mark Highlighted or relevant text Reads content as normal text No special interaction No unique emphasis conveyed.
<meta> meta [no test] Metadata about the HTML document No aural feedback Not interactive Used for SEO and browser processing.
<meter> meter Visual gauge or meter Announces "meter" + value Swipe to interact Announces the current value.
<nav> nav Navigation links Announces "navigation" Rotor to 'landmarks' Identified as a navigation landmark.
<noscript> Alternative content for JS Content for non-JS enabled browsers Reads element content No special interaction Displayed if JavaScript is disabled.
<object> Embedded object Generic embedded object Announces "object" Swipe to interact Behavior depends on embedded object type.
<ol> Ordered list Numbered list of items Announces "ordered list" Swipe to navigate Recognizes list structure and item count.
<optgroup> Option group Grouping of options in a dropdown Announces "group" label Swipe within dropdown Provides context in select menus.
<option> Select option Selectable option in a dropdown Announces option text Swipe to select Recognizes the selected state.
<output> Calculation result Result of a calculation Reads output value No special interaction Announces changes dynamically.
<p> Paragraph Block of text Reads content as normal text No special interaction Standard reading behavior.
<picture> Responsive image container Responsive image element Announces selected image Swipe to navigate Reads the most appropriate image source.
<pre> Preformatted text Text with preserved whitespace Reads content with preserved spaces No special interaction Retains formatting, including line breaks.
<progress> Progress bar Progress indicator Announces "progress bar" + value Swipe to interact Announces the current progress value.
<q> Inline quotation Short inline quotation Announces quotation marks No special interaction Properly indicates start/end of quotes.
<rp> Ruby fallback parentheses Ruby text fallback for non-ruby-enabled browsers Reads content as normal text No special interaction Displayed only if ruby text not supported.
<rt> Ruby annotation text Ruby text for pronunciation guides Reads content as normal text No special interaction Read inline with the main text.
<ruby> Ruby annotation container Container for ruby text annotations Reads main and rt text together No special interaction Provides pronunciation guidance inline.
<s> Strikethrough text Strikethrough text styling Reads content as normal text No special interaction No indication of strikethrough.
<samp> Sample output Sample output from a program Reads content as normal text No special interaction No unique aural distinction.
<script> JavaScript Embedded or external JavaScript No aural feedback Not interactive Executes without screen reader feedback.
<section> Section Thematic grouping of content Announces "region" if labeled Rotor to 'landmarks' Acts as a landmark region when labeled.
<select> Select dropdown Drop-down menu for multiple options Announces "popup button" Double-tap to open, swipe to select Reads all available options.
<small> Fine print Less important text Reads content as normal text No special interaction No specific aural change.
<source> Media source Source for media elements No direct aural feedback Not interactive Used within <audio> and <video>.
<span> Inline container Generic inline container Reads content as normal text No special interaction Treated as part of text flow.
<strong> Strong emphasis Important text Reads with emphasis No special interaction Uses a stronger voice inflection.
<style> CSS styles Embedded stylesheets No aural feedback Not interactive Applies CSS styles; ignored by screen reader.
<sub> Subscript text Subscript text Reads content as normal text No special interaction No indication of subscript.
<summary> Disclosure summary Summary for <details> Announces "summary" Double-tap to expand/collapse Acts as a trigger for the <details> element.
<sup> Superscript text Superscript text Reads content as normal text No special interaction No indication of superscript.
<svg> Scalable Vector Graphics Vector graphics in XML format Announces "graphic" if labeled Swipe to navigate Reads accessible labels, if provided.
<table> Data table Tabular data Announces "table with X rows and Y columns" Swipe to navigate cells Provides structured navigation through rows/columns.
<tbody> Table body Table content container Included in table navigation No special interaction Part of overall table structure.
<td> Table data cell Cell within a table row Reads content Part of table navigation Properly linked with headers.
<template> Template container Client-side template content No aural feedback Not interactive Hidden unless instantiated by JavaScript.
<textarea> Multi-line text input Editable multi-line text area Announces "text area" Normal text entry interaction Allows multiple lines of input.
<tfoot> Table footer Footer section of a table Included in table navigation No special interaction Part of the overall table structure.
<th> Table header cell Header cell within a table Announces "column header" or "row header" Part of table navigation Recognizes association with td cells.
<thead> Table header Header section of a table Included in table navigation No special interaction Part of the overall table structure.
<time> Time Date/time representation Reads content No special interaction Displays human-readable time/date.
<title> Document title Title of the document Announces when page loads No direct interaction Read out when the page/tab gains focus.
<tr> Table row Row within a table Included in table navigation No special interaction Properly reads cell content within rows.
<track> Media track Subtitles, captions, or descriptions Announces track type when enabled Swipe to activate/deactivate Used with <audio> and <video> elements.
<u> Underlined text Text with underline styling Reads content as normal text No special interaction No unique aural distinction for underline.
<ul> Unordered list Bullet list Announces "list with X items" Swipe to navigate list items Properly recognizes and reads list structure.
<var> Variable Variable or argument in text/code Reads element content No special interaction No unique treatment beyond normal text.
<video> Video player Embedded video with controls Announces "video" Double-tap to play/pause Provides full media controls.
<wbr> Word break opportunity Suggests a line break opportunity No direct aural feedback No special interaction Breaks handled visually via CSS/layout.