UI/UX Atlas
Accessibility Intermediate

Screen Readers & Assistive Technology

Assistive technology isn't a niche edge case — understanding how real users navigate with screen readers, switches, and magnifiers unlocks the semantic rigor that makes every interface more robust.

10 min read

The full lesson

About 7–8% of people worldwide use some form of assistive technology to navigate digital interfaces. That includes screen readers, switch access, voice control, magnification software, and refreshable Braille displays. Designing for these tools is not a charitable afterthought. It is the strongest test of whether your semantic structure, interaction model, and information architecture actually hold up. Get this right, and your product becomes more robust for every user.

What Assistive Technology Is (and Is Not)

Assistive technology (AT) is any hardware or software that helps a person interact with a computer. The category is broader than most designers expect:

  • Screen readers — convert the accessibility tree into speech or Braille output (JAWS, NVDA, VoiceOver, TalkBack, Narrator).
  • Magnification software — enlarge a portion of the screen (ZoomText, macOS Zoom, Windows Magnifier). Users see only a small slice of the viewport at a time.
  • Switch access — reduce input to one or two physical switches; software scans through options automatically (iOS Switch Control, Android Switch Access).
  • Voice control — let users drive the entire UI by speaking commands (Dragon NaturallySpeaking, Voice Control on macOS/iOS).
  • Refreshable Braille displays — physical hardware that renders the accessibility tree as touchable raised pins; typically used alongside a screen reader.
  • Eye-tracking systems — translate gaze into cursor movement and dwell-clicks.

None of these tools see pixels. They query the accessibility tree — a parallel representation of the DOM that browsers expose through platform accessibility APIs (MSAA, IAccessible2, ATK, NSAccessibility, UIAutomation). If your component does not surface correct roles, names, states, and values in that tree, it simply does not exist for AT users.

How Screen Readers Actually Work

Understanding the mechanics helps you avoid the most common design and development mistakes.

Reading modes

Screen readers operate in two main modes:

  1. Browse / virtual cursor mode — the reader builds a virtual document from the accessibility tree. The user navigates by headings, landmarks, links, form controls, or line by line using arrow keys. This is the default mode for reading web content.
  2. Forms / application mode — activated when focus moves into an interactive widget. Arrow keys are passed through to the widget instead of being used for navigation. Placing role="application" in the wrong spot is one of the most destructive AT bugs a developer can ship.

The transition between modes is triggered by element roles. A role="textbox" switches into forms mode. A role="document" inside a complex widget switches back. Designers need to understand this because it shapes how component keyboard behavior must be built.

Name, Role, Value — the fundamental contract

Every interactive element must expose three things to the accessibility tree:

PropertyWhat it answersExample
NameWhat is this thing called?”Search”, “Submit order”, “Close dialog”
RoleWhat kind of thing is it?button, checkbox, link, combobox
Value / StateWhat is it set to right now?checked, expanded, selected, disabled

This maps directly to WCAG 2.2 criterion 4.1.2 Name, Role, Value. If you build a custom toggle switch from a div and style it to look like a checkbox, you have broken all three — unless you also add role="checkbox", aria-checked, and an accessible name.

Announcement order and DOM order

Screen readers announce content in DOM order, not visual order. CSS that visually reorders elements — using order in flexbox or grid-area placement — does not change DOM order.

A product card where the image is visually first but the heading is first in the DOM will announce the heading first. That is fine. But if the “Add to cart” button appears before the product name in the DOM just to achieve a visual layout, screen reader users hear the button before they know what they are adding.

Do

Keep DOM order and visual order aligned. Use CSS Grid and Flexbox for visual presentation, but structure your HTML so the reading sequence makes sense without CSS applied. Test by disabling stylesheets or checking the screen reader’s reading order view.

Don't

Rely on visual position to imply relationships. Do not use CSS order to shuffle interactive elements into a sequence that differs from their DOM position — screen readers and keyboard users follow DOM order, not paint order.

The Screen Reader Landscape in 2026

Knowing which tools your users actually use helps you decide where to focus testing. The WebAIM Screen Reader Survey (most recent wave) consistently shows:

Screen ReaderPrimary platformUsage share (approx.)
JAWSWindows~40%
NVDAWindows~30%
VoiceOvermacOS / iOS~20%
TalkBackAndroid~5%
NarratorWindows~3%

Testing with only one reader is not enough. JAWS and NVDA on Windows with Chrome or Firefox, plus VoiceOver on iOS with Safari, cover the vast majority of real-world usage. Each reader has its own quirks around live regions, modal dialogs, and dynamic content updates.

ARIA: the Repair Layer

ARIA (Accessible Rich Internet Applications) is a W3C specification that adds roles, properties, and states to the HTML accessibility tree. The foundational rule is worth memorizing word for word: “No ARIA is better than bad ARIA.” Incorrect ARIA attributes actively break the accessibility tree — they do not merely fail to help.

The five rules of ARIA use

  1. If you can use a native HTML element with the right semantics, use it.
  2. Do not change native semantics unless you have no alternative.
  3. All interactive ARIA controls must be operable by keyboard.
  4. Never use role="presentation" or role="none" on a focusable element.
  5. All interactive elements must have an accessible name.

Common ARIA patterns (and their pitfalls)

Live regionsaria-live="polite" queues an announcement after the user pauses; aria-live="assertive" interrupts immediately. Live regions let dynamic content changes be announced without moving focus. Use role="status" for non-urgent updates (a “Saved” toast) and role="alert" for errors that need immediate attention. The element must exist in the DOM before content is injected — adding an aria-live region dynamically defeats the mechanism.

Expanded/collapsed state — custom accordions and disclosure widgets must use aria-expanded="true|false" on the trigger button, with aria-controls pointing to the panel’s ID. Do not use aria-hidden to hide the panel. Use hidden or display:none instead, so the panel is removed from both the visual render and the accessibility tree when collapsed.

Modal dialogs — the dialog element (now with strong browser support) handles most focus trapping and role exposure automatically. For custom implementations, the modern approach is the inert attribute on everything outside the dialog. This removes all background content from the accessibility tree and tab order in one step — replacing the fragile tabindex tricks that used to be standard.

Labels vs. descriptionsaria-label replaces the accessible name entirely. aria-labelledby computes the name from another element’s text. aria-describedby adds a supplemental description (announced after the name and role). Overusing aria-label on elements that already have visible text creates a mismatch: a button that looks like “Delete” but carries aria-label="Remove this item from your cart" now has two different names — one for sighted users, another for AT users. That is an inconsistency, not an improvement.

Designing for Magnification and Low Vision

Screen reader users get most of the attention, but low-vision users who rely on magnification software are a larger group — and they have a distinct set of design needs.

Magnification software operates at 200–1600% zoom. At 400% zoom, only about 6% of the original viewport is visible at once. Content must be able to reflow — to linearize into a single column without horizontal scrolling. This is required under WCAG 2.2 1.4.10 Reflow (AA). Intrinsic CSS Grid and fluid layouts pass this test. Fixed-width containers that overflow do not.

Typography choices for magnification

  • Use rem and em for font sizes so text respects browser zoom. Pure px sizes break at 200% zoom. Pure vw-based sizing breaks when users zoom in, because viewport units do not scale with OS text-size settings.
  • Modern best practice is fluid type using clamp() with rem floors. This serves both responsive scaling and zoom compliance at once.
  • Variable fonts reduce network requests and allow smooth intermediate weights — but always verify the variable font includes every weight used for body copy and headings.

Spacing and touch targets at high zoom

At high magnification, interactive elements that are fine at 1x become tiny relative to the visible area. WCAG 2.2 2.5.8 Target Size (Minimum) (AA, new in 2.2) requires a minimum target size of 24×24 CSS pixels, with exceptions for inline text links and native controls. The AAA criterion 2.5.5 raises the bar to 44×44px, which aligns with Apple’s HIG and Google’s Material guidance.

Voice Control and How Naming Breaks It

Voice control software (Dragon, Voice Control on iOS/macOS) lets users activate elements by speaking their visible name: “Click Submit” or “Tap Add to cart.” This works reliably only when two conditions are met:

  • The accessible name matches the visible label text. If a button’s visual label is “Go” but its aria-label is “Proceed to checkout,” saying “Click Go” does nothing.
  • Links and buttons have unique, descriptive names. A page with twelve “Read more” links forces the user to use a numbered grid overlay — a significant cognitive and motor burden.

WCAG 2.2 2.5.3 Label in Name (A) formalizes this requirement. If an interactive element has visible text as part of its label, the accessible name must contain that text in the same order. A search button labeled “Search” that carries aria-label="Find items in catalog" fails this criterion.

Testing: From Automated to Real AT

No automated tool can fully verify AT compatibility. Automated tools — axe, Lighthouse, IBM Equal Access Checker — catch roughly 30–40% of WCAG failures. These are the mechanical ones: missing alt text, absent form labels, insufficient contrast ratios. The remaining 60–70% require manual and AT-driven testing.

A practical testing stack

LayerToolCatches
Automated CIaxe-core, LighthouseMissing names, contrast, landmark structure
Browser auditaxe DevTools browser extensionExpanded rules, needs-review flagging
Manual keyboardTab, Shift+Tab, arrow keys, EscapeFocus order, traps, operable interactions
Screen reader (Windows)NVDA + Firefox or JAWS + ChromeAnnouncement order, live regions, modal focus
Screen reader (mobile)VoiceOver on iOS + SafariTouch gesture navigation, swipe order
MagnificationBrowser zoom to 400%, ZoomTextReflow, content overlap, text scaling
Voice controlmacOS Voice Control, DragonLabel-in-name, unique names

Run automated tests in CI on every pull request. Run manual AT testing at least once per component before it ships, and again after any interaction change.

Evaluative vs. generative research with AT users

Modern accessibility research distinguishes two types of studies. Generative studies uncover workflows, mental models, and workarounds AT users have built for themselves. Evaluative studies answer a specific question: does this component work?

Both are necessary. A usability session where five AT users attempt representative tasks with think-aloud protocol will surface issues no automated audit finds — unexpected announcement sequences, confusing state changes, or cognitive overload from verbose ARIA labeling. The “five users for qualitative problem-finding” heuristic applies here. You do not need a large sample to identify the most common friction points.

Outdated Habits to Retire

  • tabindex hacks for focus management — setting tabindex="1" or higher on arbitrary elements creates a separate tab sequence that breaks predictably as the DOM changes. Use tabindex="0" to make non-interactive elements focusable, tabindex="-1" to manage focus programmatically, and never use positive tabindex values.
  • outline: none without a replacement — removing the default focus ring without replacing it with a visible custom style fails WCAG 2.4.7 Focus Visible. It is the single most common keyboard accessibility bug. Use :focus-visible to show a ring for keyboard users without showing it on mouse click.
  • Targeting WCAG 2.0 — WCAG 2.2 is the current normative standard. The new 2.2 criteria (Focus Not Obscured, Target Size Minimum, Accessible Authentication, Redundant Entry, Dragging Movements) address real AT friction points and are required for most regulatory compliance frameworks as of 2024–2026.
  • role="application" on page-level content — this disables all browse-mode shortcuts for the wrapped content. Reserve it for genuinely widget-like interfaces (a code editor, a drawing canvas) and never apply it to a page section that contains regular text.