Accessibility is the discipline of ensuring digital products can be perceived, operated, and understood by people with a full range of abilities. It is not a checkbox exercise ā it is a direct consequence of writing correct, semantic HTML.
1Why Accessibility Is An Engineering Concern
It is tempting to treat accessibility as a design nicety, something a QA pass adds at the end. In practice it is closer to type-safety or security: a property that has to be designed in from the first line of markup, because retrofitting it is exponentially more expensive.
The World Health Organization estimates that over a billion people, roughly 16% of the global population, experience some form of significant disability. That includes permanent conditions like blindness or motor impairment, but also temporary and situational ones ā a broken arm, a bright sunlit screen, a noisy train platform where audio is unusable. Accessible markup benefits all of these cases simultaneously, because it is built on the same principle: don't assume a single way of consuming content.
Legally, many jurisdictions now mandate accessibility (ADA in the US, EN 301 549 in the EU) for public-facing and government-adjacent software, making this a compliance requirement as much as an ethical one.
2The Four POUR Principles
The Web Content Accessibility Guidelines (WCAG) organize every success criterion under four umbrella principles, abbreviated POUR.
Perceivable ā information must be presentable in ways every user can perceive: text alternatives for images, captions for video, sufficient color contrast. Operable ā all functionality must be reachable via keyboard alone, with no time limits that can't be extended, and no content that flashes in a way that triggers seizures. Understandable ā text must be readable, interfaces must behave predictably, and forms must help users avoid and correct mistakes. Robust ā content must be interpretable by a wide range of user agents, including current and future assistive technologies, which is why valid, semantic HTML matters so much.
Every lesson in this module maps back to one or more of these four pillars.
3The Accessibility Tree
Every modern browser builds two parallel trees from your HTML: the DOM, used for rendering and scripting, and the accessibility tree, used to communicate with assistive technology through OS-level APIs (like UIA on Windows or AX on macOS).
Each node in the accessibility tree carries a role (button, heading, navigation), an accessible name (usually derived from text content, aria-label, or an associated <label>), and a state (checked, expanded, disabled). Native HTML elements populate all three automatically. Generic elements like <div> and <span> populate none of them unless you add ARIA attributes manually.
This is why the guiding rule of accessible development is: prefer a native element with built-in semantics over a generic element with ARIA bolted on. Native elements are tested across every browser and assistive technology combination that exists; hand-rolled ARIA is not.
4Step-by-Step Breakdown
Accessibility Is Not Optional. Roughly one in six people worldwide lives with some form of disability. Accessibility (shortened A11Y, for the 11 letters between 'A' and 'Y') is the practice of building interfaces that this entire population can perceive, operate, and understand ā using the browser's native semantics as the foundation.
Accessibility Is An Engineering Requirement. Accessibility is not a visual theme you bolt on at the end. It is a structural property of your HTML, exactly like performance or security. A div-soup interface styled to look like a button is invisible to a screen reader, no matter how good it looks visually.
Structural Accessibility. A <div> styled with CSS to look exactly like a button is clicked with a mouse just fine. Why does it still fail an accessibility audit?
- āIt fails because the color contrast is wrong
- āIt fails because it carries no keyboard or screen-reader semantics
- āIt doesn't fail; visual matching is sufficient
The Four POUR Principles. Every accessibility guideline traces back to four principles known as POUR: Perceivable, Operable, Understandable, and Robust. Content must be perceivable through more than one sense, operable without a mouse, understandable in its language and behavior, and robust enough to work with assistive technology.
POUR Principles. Which one of these is NOT one of the four WCAG POUR principles?
- āPerformant
- āOperable
- āRobust
Assistive Technology Reads The DOM, Not The Screen. Screen readers, switch devices, and braille displays never see your pixels. They query the accessibility tree, a parallel structure the browser builds from your DOM. If an interactive control has no name, no role, or no state in that tree, it effectively does not exist for those users.
The Accessibility Tree. A screen reader user navigates your page. What structure is it actually querying to know what's on screen?
- āThe rendered pixel buffer, like a screenshot
- āThe accessibility tree derived from the DOM
- āThe compiled CSSOM stylesheet rules
Foundation Secured. You now understand accessibility as a structural engineering discipline governed by the POUR principles, and why assistive technology depends entirely on the accessibility tree generated from your HTML. Every lesson in this module builds directly on this foundation.
Add The Core Landmarks. Semantic landmarks like <nav> and <main> let assistive tech users jump straight to key regions.
Level Up š
Advanced cheat sheets, SEO tricks, and interview prep for this topic.
Browser Support
Fully supported.
Fully supported.
Fully supported.
Fully supported.
Accessibility (A11y)
1Native Elements Populate The Accessibility Tree Automatically
`<button>`, `<input>`, `<a href>`, and other native interactive elements ship with a correct role, an accessible name derivation strategy, and keyboard behavior ā none of which has to be reimplemented with ARIA.
2The POUR Principles Are Testable, Not Just Aspirational
Each WCAG success criterion under Perceivable, Operable, Understandable, and Robust maps to a concrete, testable condition (e.g. 'contrast ratio ā„ 4.5:1'), which is what makes automated and manual accessibility audits possible.
SEO Implications
- 1
Accessible Markup Overlaps Heavily With Crawlable Markup
Search engine crawlers, like screen readers, cannot see pixels ā they parse the DOM. Descriptive `alt` text, real headings, and semantic landmarks improve both accessibility and how well crawlers understand page structure.
- 2
Accessibility Compliance Is Increasingly A Search & Legal Ranking Factor
While not a direct ranking signal, sites facing accessibility lawsuits or low engagement from assistive-technology users often see indirect SEO harm through higher bounce rates and lower dwell time.
Best Practices
Default To Native HTML Elements Before Reaching For ARIA
A native `<button>` gets keyboard support, focus styling hooks, and correct semantics for free; recreating that with `<div role="button">` requires manually wiring tabindex, key handlers, and ARIA state ā and is easy to get subtly wrong.
Test With A Real Screen Reader Early, Not Just A Linter
Automated accessibility linters catch roughly a third of real-world issues. Pairing them with a five-minute pass using VoiceOver, NVDA, or TalkBack surfaces problems no static analysis tool can detect.
Frequent Bugs
A custom dropdown works with a mouse but is completely unusable with a keyboard.
The dropdown was built from `<div>` elements with click handlers instead of native `<button>`/`<select>` elements or a fully ARIA-compliant combobox pattern with keyboard event handling.
A screen reader announces an icon-only button simply as 'button', with no indication of what it does.
The button has no accessible name. Add visually-hidden text, an `aria-label`, or `aria-labelledby` pointing at a descriptive label.
Real-World Examples
Accessible Icon Button
A production toolbar button that closes a modal, using only an icon visually but remaining fully announced to assistive technology.
<button type="button" aria-label="Close dialog">
<svg aria-hidden="true" focusable="false">...</svg>
</button>