Screen readers help visually impaired users navigate websites.
Semantic HTML and ARIA attributes improve compatibility.
ARIA Roles and Labels
Use ARIA roles to describe elements:
<nav role="navigation">
Add aria-label to buttons and links for better
descriptions:
<button aria-label="Submit
Form">Submit</button>
Knowledge Check
Loading question…
Before / After: Descriptive Links
<p>To learn more about WCAG, <a href="/wcag">click here</a>.</p>
<button onclick="save()">Click here</button>
<a href="/report.pdf">Download</a>
Issues: "Click here" and "Download" are meaningless when read out of context. Screen readers often list all links on a page — every one of these would sound identical.
<p>Learn more about
<a href="/wcag">WCAG accessibility guidelines</a>.
</p>
<button type="button" onclick="save()">
Save your progress
</button>
<a href="/report.pdf"
aria-label="Download accessibility audit report (PDF)">
Download report
</a>
Fixed: Each link and button describes its purpose. The PDF link uses aria-label to provide extra context (file type). Screen reader users can scan links and immediately understand where each one leads.
Issues: No <label> elements — screen readers cannot identify fields. Error text is vague and not linked to any input. Placeholder text disappears on focus, leaving no visible label.
Fixed: Every field has a visible <label> linked via for/id. Errors use aria-describedby so screen readers announce them. role="alert" with aria-live="assertive" ensures errors are announced immediately.
Animations can enhance user experience but should be designed
carefully to ensure they do not cause discomfort or confusion,
especially for users sensitive to motion.
Example: Motion Reduction
Use media queries to detect user preferences for reduced motion:
Notifications should be accessible to all users, including those using screen readers. Use ARIA live regions to ensure important updates are announced.
Implementing Screen-Reader Friendly Notifications
Use role="alert" or aria-live="polite" for inline notifications to announce updates.
Ensure notifications have clear and concise messages.
Example:
<div role="alert" aria-live="assertive" class="toast-notification">
Your changes have been saved successfully!
</div>
Real people use the web in different ways. These personas help you design with empathy.
🗣️
Amara — Screen Reader User
Goals
Navigate pages, fill out forms, and read content independently using a screen reader.
Pain points
Unlabelled buttons, missing alt text, dynamic content that updates silently, poor heading structure.
What helps
Semantic HTML, descriptive aria-label attributes, proper heading hierarchy, and aria-live regions for dynamic updates. See Screen Readers and Dynamic Content.
⌨️
Leo — Keyboard-Only User
Goals
Complete every task — menus, forms, modals — without a mouse or trackpad.
Pain points
Focus traps with no escape, invisible focus indicators, interactive elements unreachable by Tab.
What helps
Visible :focus-visible outlines, logical tab order, skip links, and proper focus management in modals. See Keyboard Navigation.
🔍
Priya — Low Vision / Zoom User
Goals
Read all content comfortably at 200–400% zoom or with custom font sizes.
Pain points
Fixed-width layouts that break at high zoom, low contrast text, text embedded in images.
What helps
Responsive layouts, sufficient contrast ratios (AA minimum), resizable text, and real text instead of images. See Contrast & Colors and Dark Mode.
đź§
Sam — Cognitive Load Sensitivity
Goals
Understand content quickly without being overwhelmed by motion, clutter, or complex language.
Respecting prefers-reduced-motion, clear form error messages, simple language, and consistent navigation. See Accessible Animations and Form Validation.
Real-world moments that show why accessibility matters — and what we can learn from them.
The Form That Locked Everyone Out
A checkout form relied entirely on placeholder text — no visible labels, no error messages. A screen reader user couldn't tell which field was which, and keyboard users had no idea what went wrong after pressing Submit. The team added proper <label> elements and aria-describedby error links, and support tickets dropped by 40% in a week.
Lesson learned: Labels aren't optional — they're the first thing assistive tech looks for.
FormsScreen readers
Trapped Inside a Modal
A marketing site launched a newsletter popup that couldn't be closed by keyboard. Pressing Escape did nothing, and Tab cycled through the page behind the overlay instead of staying inside the modal. After a user complaint went viral, the team added focus trapping, an Escape handler, and returned focus to the trigger button on close.
Lesson learned: Every modal needs a focus trap, an Escape exit, and a plan for where focus goes when it closes.
KeyboardFocus management
The Dashboard Nobody Could Read
An analytics dashboard used light-gray text on a white background for secondary stats. It looked "clean" in mockups, but users with low vision couldn't read the numbers, and everyone struggled in bright sunlight on laptops. Bumping the text to a 4.5:1 contrast ratio fixed readability without changing the design's feel.
Lesson learned: Contrast isn't just an accessibility rule — it's a readability baseline for every user, in every environment.