Skip to content

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 #777777 on white fails while #767676 passes
  • 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: none is 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 #AAAAAA for 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.