Accessibility: WCAG 2.2 and EN 301 549¶
Exercise accessibility-wcag-annex.pdf · PDF
Have you ever tried to read your phone in bright sunlight, or watched a video on the bus with the sound off? For a few seconds the app stopped working for you. For many people that is not a few seconds. It is every day.
The World Health Organization estimates that 1.3 billion people — about 1 in 6 — live with a significant disability. An app that ignores them locks out a crowd bigger than the population of Europe. And in the EU, locking them out can also be against the law.
What you will learn
- What accessibility means, and why it helps everyone, not only people with a disability
- The four POUR principles and the A / AA / AAA levels of WCAG 2.2
- What EN 301 549 (UNE-EN 301549 in Spain) is, and why the law points to it
- How to check colour contrast, and why
#777777on white fails while#767676passes - How to make an interface usable with only a keyboard
- How a screen reader "sees" your app, and what you must give it
- The trap: "it looks fine to me" is not a test
Your app is a building¶
Accessibility means that people with the widest possible range of abilities can perceive, understand and use your interface.
Think of your app as a building. Anyone who wants to use it has to get in, find their way around and use what is inside. Some visitors arrive in a wheelchair, some cannot see the signs, some cannot hear the announcements. A well-designed building has a ramp next to the stairs, signs big and clear enough to read, and a lift that says each floor out loud.
We will keep this building all the way through the page:
| In the building | In your app |
|---|---|
| Building code | WCAG — the rules |
| Building inspection | Conformance level (A, AA, AAA) |
| Signs you can read from far away | Good colour contrast |
| A ramp next to the stairs | Keyboard navigation: a second route that does not need a mouse |
| A guide who reads every sign out loud | A screen reader |
Ramps are for everyone
A ramp built for wheelchairs is also used by parents with prams, delivery workers with trolleys and you with a suitcase. Accessibility works the same way. Captions help deaf users — and you in a noisy bar. High contrast helps people with low vision — and you in the sun. Designing for the edges makes the product better for the middle.
Disabilities are not only permanent. A broken arm is temporary. Holding a baby in one arm is situational. Everyone is in one of these groups at some point.
WCAG 2.2: the building code¶
WCAG (Web Content Accessibility Guidelines) is the international set of rules for making digital content accessible, written by the W3C, the organisation that also writes the standards for HTML and CSS.
Each rule is called a success criterion: a sentence you can test with a clear yes or no. For example, 1.4.3 Contrast (Minimum) says normal text must have a contrast ratio of at least 4.5:1. Either it has, or it does not.
The versions you will hear about:
| Version | Published | What changed |
|---|---|---|
| WCAG 2.1 | June 2018 | Added criteria for mobile, low vision and cognitive disabilities |
| WCAG 2.2 | 5 October 2023 | Added 9 new criteria and removed one: 4.1.1 Parsing, now obsolete |
Some of the new criteria in 2.2, so you can picture them:
| Criterion | Level | In plain words |
|---|---|---|
| 2.4.11 Focus Not Obscured (Minimum) | AA | A sticky header or cookie banner must not completely hide the element you are on |
| 2.5.7 Dragging Movements | AA | Anything you can drag, you can also do with simple clicks or taps |
| 2.5.8 Target Size (Minimum) | AA | Buttons are at least 24 × 24 CSS pixels (or have enough space around them) |
| 3.3.7 Redundant Entry | A | Do not make users type the same information twice in one process |
| 3.3.8 Accessible Authentication (Minimum) | AA | Logging in must not depend on a memory or puzzle test: users can paste the password or use a password manager |
The four principles: POUR¶
Every success criterion hangs from one of four principles. Their initials spell POUR:
flowchart LR
P["<b>Perceivable</b><br>can I notice it?<br>(can I read the sign?)"] --> O["<b>Operable</b><br>can I use it?<br>(can I reach the door?)"]
O --> U["<b>Understandable</b><br>does it make sense?<br>(do the signs agree?)"]
U --> R["<b>Robust</b><br>does it work with my tools?<br>(does my wheelchair fit the lift?)"]
| Principle | Question | Example criterion |
|---|---|---|
| Perceivable | Can every user notice the information? | Images have a text alternative (1.1.1) |
| Operable | Can every user work every control? | Everything works with a keyboard (2.1.1) |
| Understandable | Can every user understand it and predict what happens? | Form errors are described in text (3.3.1) |
| Robust | Does it work with assistive technology, today and tomorrow? | Controls expose their name, role and value (4.1.2) |
Three levels: A, AA, AAA¶
A conformance level says how many of the criteria your interface meets: A (minimum), AA (the usual target) or AAA (the highest).
The levels stack, like inspections: to pass AA you must pass every A criterion and every AA criterion.
| Level | What it means | In the building |
|---|---|---|
| A | The basic barriers are gone | There is a way in |
| AA | The standard the law asks for | Ramp, clear signs, working lift |
| AAA | Extra care, where possible | Everything, even tactile maps on every floor |
Careful: AAA is not the goal for a whole app
It sounds like more is always better, but the W3C itself says AAA should not be required for entire sites, because some content simply cannot meet every AAA criterion. The realistic target — and the legal one — is AA.
EN 301 549: when the code becomes law¶
WCAG is a recommendation. Nobody is forced to follow a recommendation — until a law points at it.
EN 301 549 is the European standard for the accessibility of ICT products and services (websites, apps, documents, software, even ticket machines). In Spain it is published by UNE as UNE-EN 301549.
For web content, EN 301 549 does not invent new rules: its chapter 9 includes all the WCAG criteria of levels A and AA. So in practice, "meet EN 301 549" means "meet WCAG AA", plus some extra requirements for software, documents and support services.
flowchart TB
W["<b>WCAG</b><br>the building code<br>(W3C)"] -->|"levels A + AA<br>copied into chapter 9"| EN["<b>EN 301 549</b><br>European standard<br>(UNE-EN 301549 in Spain)"]
EN -->|"the law says:<br>follow this standard"| L1["<b>RD 1112/2018</b><br>public sector websites and apps"]
EN -->|"the law says:<br>follow this standard"| L2["<b>Ley 11/2023</b><br>private products and services<br>(European Accessibility Act)"]
| Law | Who must comply | Date |
|---|---|---|
| Real Decreto 1112/2018 | Public sector websites and mobile apps (town halls, schools, hospitals...) | Approved 7 September 2018 |
| Ley 11/2023 (transposes the European Accessibility Act, Directive (EU) 2019/882) | Many private products and services: online shops, banking, e-books, transport tickets... | Applies since 28 June 2025 |
Which version? The one cited in the EU's Official Journal today is V3.2.1 (2021), which includes WCAG 2.1. In September 2026 ETSI published V4.1.1, which moves to WCAG 2.2 AA; it becomes the legal reference once the EU cites it. Designing to WCAG 2.2 AA now covers both.
Why should a developer care?
Because you will build the apps these laws apply to. If you work for a bank, an airline or a public body, "is it accessible?" is not a nice-to-have: it is a requirement in the contract.
Pillar 1: colour contrast¶
Contrast ratio measures how different the brightness of text is from its background, from 1:1 (identical colours, invisible) to 21:1 (black on white).
The sign on the building must be readable from across the street. The WCAG thresholds:
| What | Level AA | Level AAA |
|---|---|---|
| Normal text | 4.5:1 | 7:1 |
| Large text (at least 18 pt ≈ 24 px, or 14 pt ≈ 18.5 px bold) | 3:1 | 4.5:1 |
| Icons, input borders, focus rings (1.4.11) | 3:1 | — |
Some real numbers on a white background:
| Text colour | Ratio on white | Normal text AA? |
|---|---|---|
#000000 black |
21:1 | Pass |
#595959 dark grey |
7:1 | Pass (even AAA) |
#767676 grey |
4.54:1 | Pass, just |
#777777 grey |
4.48:1 | Fail |
#AAAAAA light grey |
2.32:1 | Fail |
#767676 and #777777 look identical to your eye, yet one passes and one fails. That is why you measure contrast with a tool (Figma plugins, browser DevTools, WebAIM's Contrast Checker) instead of trusting your eyes.
Careful: colour alone is not a message
A form that marks errors only by turning the border red fails people who cannot tell red from green. Add a second signal: an icon, a text message, an underline. Colour can support meaning, never carry it alone.
Text inside a logo has no contrast requirement, and neither does pure decoration. Everything the user needs to read does.
Pillar 2: keyboard navigation¶
Keyboard navigation means every action in the interface can be done without a mouse or a touchscreen.
This is the ramp next to the stairs: a second route to every room. It is used by people who cannot use a mouse (motor disabilities, tremors), by blind users (a mouse is useless if you cannot see the pointer) and by power users who are simply faster on the keyboard.
The basic keys:
| Key | Does |
|---|---|
| Tab | Move to the next interactive element |
| Shift+Tab | Move back to the previous one |
| Enter | Activate a link or button |
| Space | Activate a button, tick a checkbox |
| Arrow keys | Move inside a group: radio buttons, menus, tabs, sliders |
| Esc | Close a menu or dialog |
The rules that matter:
- Everything reachable. If you can click it, you can reach it with Tab (2.1.1 Keyboard, level A).
- No traps. If Tab gets you into something, you can also get out (2.1.2 No Keyboard Trap, level A).
- Visible focus. The element you are on must be highlighted: the focus indicator, usually an outline (2.4.7 Focus Visible, level AA). Removing it with
outline: noneis like switching off the lights in the corridor. - Logical order. Tab follows the reading order: top to bottom, left to right, not jumping around the page.
Try it now
Put your mouse aside and use Tab to go through this page. Can you always see where you are? Now try the same on a website you use every day. You will be surprised how many fail within ten seconds.
Pillar 3: screen readers¶
A screen reader is software that reads the interface out loud (or sends it to a braille display), so people who cannot see the screen can use it.
This is the guide who walks the building with you and reads every sign out loud. But a guide can only read what is written. If a door has no sign, the guide says "door". Nothing else.
You already have one installed:
| Screen reader | Platform |
|---|---|
| VoiceOver | macOS, iOS, iPadOS (built in) |
| TalkBack | Android (built in) |
| Narrator | Windows (built in) |
| NVDA | Windows (free) |
| Orca | Linux / GNOME (built in) |
For every control, the screen reader announces three things: its name, its role and its state. For example: "Subscribe, checkbox, not checked".
| Your interface | What the screen reader says | Problem? |
|---|---|---|
A photo with alt="Two students testing an app on a phone" |
"Two students testing an app on a phone, image" | Good |
| A photo with no alt text | "IMG_2034.jpg, image" | The user learns nothing |
| An icon-only button with a magnifying glass | "Button" | Button for what? |
| The same button with an accessible name "Search" | "Search, button" | Good |
A <div> styled to look like a button |
Nothing useful — it is not announced as a button and Tab skips it | Broken for keyboard and screen reader |
Alternative text (alt text) is the written description of an image that the screen reader reads instead of showing it. Purely decorative images get an empty alt (
alt="") so they are skipped.
Use the real control
The cheapest accessibility trick is to use the native element: a real <button>, a real <input type="checkbox">, a real <a href>. They come with keyboard support, focus and the right role for free. Rebuilding them from <div>s means rebuilding all of that by hand — and usually forgetting half of it.
Key takeaways¶
- Accessibility means everyone can perceive, understand and use your interface — and like a ramp, it ends up helping everyone.
- WCAG 2.2 (W3C, October 2023) organises its rules under POUR: Perceivable, Operable, Understandable, Robust. Levels stack: A → AA → AAA, and AA is the realistic target.
- EN 301 549 (UNE-EN 301549) brings WCAG A + AA into European law: RD 1112/2018 for the public sector, Ley 11/2023 for many private services since 28 June 2025.
- Contrast: 4.5:1 for normal text, 3:1 for large text and UI parts. Measure it; never trust your eyes, and never use colour as the only signal.
- Keyboard: every action reachable with Tab, no traps, a visible focus indicator, a logical order.
- Screen readers announce name, role and state: give images alt text, give icon buttons a name, and use native controls.
Quick check¶
1. What does the level AA of WCAG require?
- Meeting every level A criterion and every level AA criterion
- Meeting only the level AA criteria
- Meeting at least half of all the criteria
- Meeting every A, AA and AAA criterion
The levels stack like inspections: AA includes everything in A plus the AA criteria. AA is the level European law asks for; AAA is not recommended as a requirement for a whole app.
2. Your app shows grey text #777777 on a white background at normal size. Is it compliant with WCAG AA?
- No: its contrast is about 4.48:1 and normal text needs at least 4.5:1
- Yes: any grey on white is readable
- Yes: 3:1 is enough for any text
- No: normal text needs at least 7:1 for AA
Normal text needs a contrast ratio of 4.5:1 for AA. #777777 reaches only 4.48:1; #767676, which looks identical, reaches 4.54:1 and passes. That is why contrast is measured with a tool, never judged by eye. 7:1 is the AAA threshold.
3. Which law makes accessibility mandatory for many private services in Spain, such as online shops and banking?
- Ley 11/2023, which transposes the European Accessibility Act, applicable since 28 June 2025
- Real Decreto 1112/2018, which covers every website in Spain
- WCAG 2.2, which is a Spanish law
- No law: accessibility is always voluntary for private companies
RD 1112/2018 covers the public sector. Ley 11/2023 transposes Directive (EU) 2019/882, the European Accessibility Act, and applies to many private products and services from 28 June 2025. WCAG is not a law; laws point to EN 301 549, which includes WCAG A and AA.
4. Which principle of POUR does “everything must work with a keyboard” belong to?
- Operable
- Perceivable
- Understandable
- Robust
Operable asks "can every user work every control?". Perceivable is about noticing the information (contrast, alt text), Understandable about making sense of it, Robust about working with assistive technology such as screen readers.
5. A screen reader reaches an icon-only button with a magnifying glass and says only “Button”. What is missing?
- An accessible name, such as "Search"
- A bigger icon
- A higher colour contrast
- A keyboard shortcut
A screen reader announces the name, role and state of each control. The role ("button") is there, but the icon gives it no name. Adding the name "Search" turns it into "Search, button".
6. A developer removes the focus outline with outline: none because “it looks ugly”. Who is affected most?
- People navigating with the keyboard, who can no longer see where they are
- Nobody, because the outline is only decoration
- Only people using a mouse
- Only people using a screen reader, who cannot hear the outline
The focus indicator tells keyboard users which element is active; without it, pressing Tab is like walking a dark corridor. WCAG 2.4.7 Focus Visible (AA) requires it. If you do not like the default, restyle it — never remove it.
7. You are designing the sign-up form of a travel app. Pick the two changes that make it more accessible.
- Show errors with a text message and an icon, not only a red border
- Make the "Continue" button at least 24 × 24 CSS pixels
- Replace the
<button>with a styled<div>so it looks exactly like the design - Use light grey
#AAAAAAfor the hints so the form looks cleaner
Colour alone must never carry a message, so errors need text too. 2.5.8 Target Size (Minimum) asks for targets of at least 24 × 24 CSS pixels. A <div> loses keyboard support and its button role, and #AAAAAA on white has a contrast of only about 2.3:1.
8. Why does accessibility also benefit people without a disability?
- Because features like captions or high contrast help anyone in situations such as a noisy bar or bright sunlight
- It does not: accessible design only helps people with a permanent disability
- Because accessible apps are always faster to load
- Because the law forces everyone to use a screen reader
Like the ramp also used by prams and suitcases, accessible features help in temporary and situational limitations too: a broken arm, a baby in one arm, the sun on your screen. Everyone ends up using them.
Your rules are clear: readable signs, a ramp, a guide who can read every label. Next, you open Figma and start building the screens that follow them: Figma: frames, auto layout and components.