1Screen Reader Compatibility
▶
Screen readers are software applications that interpret the content and structure of a web page and relay that information to users through synthesized speech or a refreshable Braille display. For users who are blind, have low vision, or have other disabilities that prevent them from reading visual content directly, screen readers are often the primary means of interacting with digital interfaces. Building screen reader compatible experiences is not simply a matter of legal compliance — it is a fundamental requirement of inclusive design. When a page is built without accessibility in mind, a screen reader user may encounter unlabeled buttons, images with no description, dynamic content changes that go completely unannounced, or entire sections of navigation that are impossible to locate efficiently. This topic examines the four pillars of screen reader compatibility in depth: semantic HTML and landmark roles, ARIA labels and descriptions, image and media accessibility, and dynamic content and live regions.
Semantic HTML and Landmark Roles
Every HTML element carries a certain amount of built-in meaning, and that meaning is exactly what screen readers depend on to describe a page to its user. When you write <button>Submit</button>, the browser exposes that element to the accessibility tree with a role of button and a name of Submit. The screen reader then announces something like "Submit, button" and the user knows they can press Enter or Space to activate it. This built-in contract between native HTML elements and assistive technologies is called implicit ARIA semantics, and it is the most reliable foundation you can give any accessible interface.
Native semantic elements carry implicit roles, states, and properties without any extra markup. Consider the following examples of elements and the roles they convey to the accessibility tree:
| HTML Element | Implicit ARIA Role | What a Screen Reader Announces |
|---|---|---|
<button> |
button | Element name, then "button" |
<nav> |
navigation | "Navigation" landmark |
<h1> through <h6> |
heading (with level) | Text content, then "heading level N" |
<main> |
main | "Main" landmark |
<header> |
banner (when top-level) | "Banner" landmark |
<footer> |
contentinfo (when top-level) | "Content information" landmark |
<aside> |
complementary | "Complementary" landmark |
<input type="checkbox"> |
checkbox | Label text, then "checkbox, checked/unchecked" |
<a href="..."> |
link | Link text, then "link" |
Landmark regions deserve special attention because they dramatically improve navigation efficiency for screen reader users. Most screen readers offer a keyboard shortcut that opens a list of all landmark regions on the page, letting the user jump directly to the section they want rather than tabbing through every element sequentially. The landmark elements — <header>, <nav>, <main>, <aside>, <footer>, and <section> (when given an accessible name) — create a navigable map of the page. A well-structured page should have exactly one <main> landmark, a <header> containing site-wide branding and primary navigation, and <nav> elements wrapping every significant navigation menu. When multiple <nav> elements appear on the same page, each one should be given a distinct accessible name using aria-label so users can distinguish between "Primary navigation", "Breadcrumb navigation", and "Footer navigation" in the landmarks list.
By contrast, generic container elements like <div> and <span> have no implicit role whatsoever. They are invisible to the semantic layer of the accessibility tree. A <div> styled to look like a button and given a click handler will behave like a button visually, but a screen reader will announce it as nothing more than a group or will skip it entirely. The user will have no way of knowing it is interactive. When you cannot use a native element, you must supply its semantics explicitly with ARIA roles and additional keyboard interaction support:
<!-- Avoid: a div pretending to be a button -->
<div class="btn" onclick="submitForm()">Submit</div>
<!-- Better: a real button -->
<button type="submit">Submit</button>
<!-- Acceptable when a native element truly cannot be used -->
<div role="button" tabindex="0"
onkeydown="handleKey(event)"
onclick="submitForm()">Submit</div>
Note that even when you add role="button" and tabindex="0", you still need to manually handle keyboard events — specifically pressing Enter and Space — because that behavior is built into native <button> elements but must be scripted for custom widgets. This is the core principle behind the accessibility community's maxim: use the platform. Native HTML semantics are free, reliable, and battle-tested across every screen reader and browser combination. Custom ARIA solutions require more code and more testing to achieve the same level of support.
Heading hierarchy is another critical dimension of semantic structure. Screen reader users frequently navigate by jumping between headings using the H key (in NVDA or JAWS) or by pulling up a headings list, making headings a kind of table of contents for the page. Headings should form a logical outline: one <h1> per page representing the page's primary topic, followed by <h2> elements for major sections, <h3> for subsections, and so on. Skipping levels — for example going from <h2> directly to <h4> — creates a disorienting gap. Choosing heading levels based on visual size rather than document hierarchy is one of the most common accessibility mistakes on the web.
ARIA Labels and Descriptions
WAI-ARIA (Web Accessibility Initiative – Accessible Rich Internet Applications) provides a vocabulary of attributes that can supplement or override the information native HTML exposes to the accessibility tree. Three of the most important are aria-label, aria-describedby, and aria-labelledby. Understanding when and how to use each one is essential for building interfaces that communicate clearly to screen reader users.
aria-label provides an accessible name for an element as a plain string. When present, it completely overrides whatever the element's visible text content or associated label would otherwise convey. It is most useful for interactive elements that have no visible text label, such as icon-only buttons:
<!-- An icon button with no visible text label -->
<button aria-label="Close dialog">
<svg aria-hidden="true" focusable="false">...</svg>
</button>
Here, the SVG icon is marked aria-hidden="true" to prevent the screen reader from attempting to interpret its internal markup, while the aria-label on the button provides the accessible name "Close dialog". Without either attribute, the button might be announced as simply "button" with no name at all, leaving the user with no idea what it does. Use aria-label sparingly — it creates a disconnect between the visible interface and what is announced, which can be confusing for users of voice control software who try to activate elements by speaking their visible names.
aria-labelledby associates an element with one or more other elements whose text content forms the accessible name. Unlike aria-label, the name comes from the actual visible text of the referenced elements, which keeps the accessible name synchronized with what all users see:
<h2 id="billing-heading">Billing Address</h2>
<form aria-labelledby="billing-heading">
...
</form>
<!-- Multiple IDs are space-separated and concatenated -->
<span id="qty-label">Quantity</span>
<span id="product-name">Blue Widget</span>
<input type="number"
aria-labelledby="qty-label product-name"
value="1" />
<!-- Announced as: "Quantity Blue Widget, spin button" -->
aria-labelledby can reference any element on the page, even elements that are not visually near the widget being labeled, and it takes precedence over both the native label mechanism and aria-label in the accessible name computation hierarchy.
aria-describedby works similarly but serves a different purpose: it links an element to supplementary descriptive text that provides context rather than naming the element. After announcing the element's name and role, the screen reader will pause briefly and then read the description. This is ideal for things like form field instructions, password requirements, or error messages:
<label for="email">Email address</label>
<input type="email" id="email"
aria-describedby="email-hint email-error" />
<p id="email-hint">We will never share your email with third parties.</p>
<p id="email-error" role="alert">Please enter a valid email address.</p>
<!-- Announced as: "Email address, edit text. We will never share your
email with third parties. Please enter a valid email address." -->
A common mistake is over-using aria-describedby to repeat information already conveyed visually in the label, which leads to verbose and redundant announcements. Reserve it for genuinely supplementary information. Another consideration is that descriptions are not always surfaced by screen readers unless the user explicitly requests them with certain key combinations, so critical information should be part of the label, not the description.
The table below summarizes the key differences between these three attributes:
| Attribute | Purpose | Source of Text | Priority in Name Computation |
|---|---|---|---|
aria-labelledby |
Provides the accessible name from referenced elements | Text content of referenced DOM elements | Highest (overrides everything) |
aria-label |
Provides the accessible name as an inline string | Literal attribute value | Second (overrides native label) |
aria-describedby |
Provides supplementary description | Text content of referenced DOM elements | Does not affect name; announced separately |
Image and Media Accessibility
Images and multimedia content present a fundamental accessibility challenge: they are inherently visual or auditory, and screen reader users need textual equivalents to access the information they contain. The correct approach depends entirely on whether an image or piece of media is informative — conveying meaning essential to understanding the content — or decorative — present only for visual aesthetics.
Informative images require alternative text written into the alt attribute of the <img> element. Good alt text is not a description of the image as a photograph — it is a textual equivalent of the information the image communicates in context. Consider a graph showing quarterly revenue growth. The alt text should not say "A bar chart in blue and gray." It should convey the actual data, for example: "Bar chart showing quarterly revenue: Q1 $1.2M, Q2 $1.5M, Q3 $1.8M, Q4 $2.1M — consistent growth throughout the year." If a longer explanation is required, the image can be linked to a separate description using aria-describedby or a visible long description nearby.
<!-- Informative image with meaningful alt text -->
<img src="revenue-chart.png"
alt="Bar chart showing quarterly revenue growth from $1.2M in Q1
to $2.1M in Q4 of the current fiscal year." />
<!-- Image used as a functional link -- alt describes the destination -->
<a href="/home">
<img src="logo.png" alt="Acme Corporation homepage" />
</a>
Decorative images should use an explicitly empty alt attribute: alt="". This signals to the screen reader that the image carries no meaningful information and should be skipped entirely. Omitting the alt attribute entirely is different — when alt is absent, some screen readers will announce the image's filename, which is often a long, meaningless string that disrupts the reading experience. Never omit alt; always make a deliberate choice between descriptive text and an empty string.
<!-- Decorative image: empty alt tells screen readers to skip it -->
<img src="decorative-swirl.png" alt="" />
<!-- Decorative SVG inline -- aria-hidden removes it from the tree -->
<svg aria-hidden="true" focusable="false">...</svg>
For complex images like charts, diagrams, maps, and infographics, the brief alt attribute alone is often insufficient. Several patterns exist for providing extended descriptions:
- Visible caption or adjacent text: Place a full description in the surrounding prose and reference it in the alt text, e.g.,
alt="See the table below for full data." aria-describedbypointing to a details element: Link the image to a collapsible<details>block containing the long description.- Figcaption: Wrap the image in a
<figure>element and use<figcaption>for a visible description that all users can see.
Video and audio content require their own set of equivalents. Synchronized captions (closed captions or subtitles for the deaf and hard of hearing) must be provided for all prerecorded video content that contains dialogue or other meaningful audio. Captions are a text track — a WebVTT file typically — that displays the spoken words and important non-speech sounds (like "[applause]" or "[telephone ringing]") synchronized with the video timeline. In HTML5, captions are added with the <track> element:
<video controls>
<source src="tutorial.mp4" type="video/mp4" />
<track kind="captions"
src="tutorial-captions.vtt"
srclang="en"
label="English captions"
default />
</video>
Audio descriptions are an additional narration track that describes visual information not conveyed through the primary audio — for example, a presenter writing on a whiteboard that viewers can see but listeners cannot. Audio descriptions are required under WCAG 2.1 Success Criterion 1.2.5 for prerecorded video at Level AA. For live video content, captions are required at the same level (SC 1.2.4). A transcript — a text document containing all spoken content plus descriptions of meaningful visuals — is a supplementary form of access that benefits screen reader users as well as users who prefer to read or search through content.
Dynamic Content and Live Regions
Traditional web pages load once and stay static. Screen readers can read through the rendered content in a predictable linear fashion. Modern web applications, however, are highly dynamic: content loads asynchronously, notifications appear and disappear, form validation errors are injected into the DOM, chat messages arrive in real time, and shopping cart counts update without any page navigation. When these changes happen outside the user's current focus, screen reader users have no way of knowing anything changed — unless the interface explicitly tells the assistive technology about the update. This is the problem that ARIA live regions solve.
An ARIA live region is any element marked with the aria-live attribute or given one of the implicit live region roles. When content within a live region changes, the screen reader interrupts or queues an announcement of the new content, even though the user's keyboard focus has not moved to that element. The two primary values for aria-live reflect different levels of urgency:
aria-live="polite"— The screen reader waits until the user finishes their current action or utterance before announcing the change. This is the correct choice for the vast majority of dynamic updates: search results loading, filtered list counts updating, progress notifications, and non-critical status messages.aria-live="assertive"— The screen reader interrupts whatever it is currently announcing to deliver the new content immediately. This should be reserved for genuinely critical, time-sensitive information — for example, a session timeout warning or a critical system error. Used indiscriminately,assertivecreates a disruptive and hostile experience by constantly interrupting the user's reading flow.
<!-- Status message region for form submission feedback -->
<div role="status" aria-live="polite" aria-atomic="true">
<!-- JavaScript will inject text here after form submission -->
</div>
<!-- Alert region for critical errors -->
<div role="alert" aria-live="assertive" aria-atomic="true">
<!-- JavaScript will inject error text here when needed -->
</div>
The role="status" and role="alert" roles are shorthand implicit live regions. role="alert" carries an implicit aria-live="assertive" and is appropriate for error messages. role="status" carries an implicit aria-live="polite" and suits success messages and status updates. The aria-atomic="true" attribute instructs the screen reader to announce the entire contents of the region when any part changes, rather than announcing only the changed node — this produces a more coherent announcement for messages assembled from multiple text nodes.
Status messages — confirmations like "Your message has been sent", "3 items match your search", or "Changes saved" — must be programmatically exposed. WCAG 2.1 Success Criterion 4.1.3 (Status Messages, Level AA) specifically requires that status messages be determinable through role or property so they can be announced without receiving keyboard focus. The key implementation pattern is to keep the live region element in the DOM at all times (even when empty) and inject or update its text content via JavaScript when the status changes. Injecting the region itself dynamically after the status is available is unreliable, because some screen readers register live regions only at page load:
<!-- DO: Region is present in the DOM from the start -->
<div id="status-msg" role="status" aria-live="polite"></div>
<!-- JavaScript updates the content -->
<script>
function showStatus(message) {
document.getElementById('status-msg').textContent = message;
}
// After form submission:
showStatus('Your changes have been saved successfully.');
</script>
<!-- DON'T: Creating the element dynamically and inserting it -->
<script>
function showStatusBad(message) {
const div = document.createElement('div');
div.setAttribute('role', 'status');
div.setAttribute('aria-live', 'polite');
div.textContent = message;
document.body.appendChild(div); // Screen readers may miss this
}
</script>
Additional aria-live related attributes further refine announcement behavior:
| Attribute | Values | Effect |
|---|---|---|
aria-live |
off, polite, assertive |
Sets when changes are announced. off disables announcements. |
aria-atomic |
true, false |
When true, the entire region is re-read on any change. When false, only changed nodes are announced. |
aria-relevant |
additions, removals, text, all |
Specifies which types of DOM changes trigger an announcement. Defaults to additions text. |
aria-busy |
true, false |
When true, tells the screen reader to wait before announcing changes in the region (useful during bulk DOM updates). |
A real-world example ties all these concepts together. Consider an email client built as a single-page application. The page should have a <header> landmark containing the application name and user account controls, a <nav> landmark with aria-label="Mailbox folders" for the sidebar, a <main> landmark for the message list, and a second <nav> with aria-label="Message pagination" for paging controls. Heading levels should reflect the hierarchy: the inbox name as an <h1>, each message thread subject as an <h2>. When the user sends a message, a role="status" region announces "Message sent." When the application detects an authentication failure, a role="alert" region announces "Session expired. Please log in again." Images used as contact avatars carry alt text with the contact's name, while purely decorative separator graphics use alt="". Compose button icons carry aria-label values. Every custom dropdown menu built from <div> elements is given the ARIA menu role pattern with role="menu", role="menuitem", and appropriate keyboard interaction. This coherent application of all four areas of screen reader compatibility ensures that a user navigating entirely by keyboard and screen reader can accomplish the same tasks as any other user.
2Videos on This Topic
▶
Screen readers turn an interface into speech or braille, but they can only convey what the underlying code actually communicates. A heading that is merely large, bold text is just text to a screen reader; a heading marked up as a heading becomes a navigable structure a user can jump through. This topic looks at the layer beneath the visual design — semantic HTML elements, landmark roles, ARIA labels and descriptions, text alternatives for images and media, and announcements for content that changes after page load.
This matters in CEN3722 because interface design is not finished when it looks right. A prototype that passes a visual review can still be unusable for someone who is blind or has low vision if its structure is invisible to assistive technology. Learning to think in terms of roles, names, states, and reading order gives you a vocabulary for evaluating and repairing interfaces, and connects directly to WCAG success criteria you will apply later in the module.
The three videos below come from the same accessibility instructor and are best watched in order. As you watch, pay attention to one recurring theme: ARIA supplements semantic HTML, it does not replace it. Note which native HTML elements already carry accessibility information for free, when an ARIA attribute is genuinely needed, and how incorrect ARIA can make an interface worse than no ARIA at all. Keep a running list of the specific elements and attributes mentioned so you can check for them in your own prototypes.
3Video 1: Semantic HTML & Accessibility (Updated)
▶
Stefany Newman - Accessibility Instructor · 10:28 · 11,540 views · 5y ago · captions — Watch on YouTube
About this video
An updated introduction to semantic HTML, explaining how choosing elements for their meaning rather than their appearance reinforces the structure of page content. Based on its description, it covers the difference between elements that convey meaning and those that only affect presentation, and why that distinction matters for assistive technology. Expect examples of common semantic elements and headings used to build a navigable document structure.
Why this video
It directly supports the Semantic HTML subtopic and establishes the foundation the other two videos build on, from an instructor who specializes in accessibility teaching.
4Video 2: What are ARIA Landmarks?
▶
Stefany Newman - Accessibility Instructor · 11:43 · 12,010 views · 5y ago · captions — Watch on YouTube
About this video
This video focuses on ARIA landmarks — the attributes and roles that mark out regions of a page such as navigation, main content, and complementary areas. It introduces WAI-ARIA as a set of attributes added to HTML and explains the role landmarks play in letting screen reader users move quickly between major sections. Expect discussion of which landmarks exist and how they map onto page regions.
Why this video
It covers the Landmark Roles subtopic specifically, showing how structural navigation works in practice rather than treating accessibility as a checklist item.
5Video 3: What is WAI-ARIA?
▶
Stefany Newman - Accessibility Instructor · 13:18 · 7,882 views · 4y ago · captions — Watch on YouTube
About this video
A broader explanation of what WAI-ARIA is and how it relates to native HTML. The description makes clear the central point: ARIA only helps when used correctly and can never replace semantic HTML, so the video addresses why and when ARIA is appropriate. This is the natural place to encounter ARIA attributes used for naming and describing elements.
Why this video
It frames the ARIA Labels and Descriptions subtopic with the correct caution about misuse, which is essential before students start adding ARIA to their own prototypes.
6How These Videos Support the Learning Outcomes
▶
Together these videos give students the technical grounding needed to recognize WCAG-related requirements around structure, name, role, and value (MO1) and to inspect an existing interface for barriers that affect users of screen readers (MO2). The emphasis on correct semantic markup and the appropriate, limited use of ARIA gives students concrete changes they can make when revising interface prototypes for accessibility (MO3). By showing how much of a page's meaning is invisible unless it is coded deliberately, the videos also make tangible the consequences of exclusion for blind and low-vision users, supporting reflection on the ethical and legal responsibilities of designers (MO4). Note that the videos concentrate on semantics, landmarks, and ARIA; you should supplement them with course readings on image and media alternatives and on live regions for dynamic content.
7About These Videos
▶
These videos were chosen from YouTube on October 3, 2026. Each has captions; the player turns them on. Videos on YouTube can be changed or removed — if one no longer plays, tell your instructor. If a player does not appear, use its Watch on YouTube link.