WCAG 3.2.1 · Level A · EN 301 549 9.3.2.1

On Focus

Requires that when a component receives focus, it does not trigger a change of context such as opening a window or moving focus.

In brief

Keyboard and screen reader users move focus through a page just to find out what is there. If simply landing on a control opens a window, submits a form or throws focus somewhere else, the page becomes impossible to explore and the user loses their place.

This criterion requires that when any user interface component receives focus, it does not initiate a change of context.

What does it cover?

  • What is a change of context: A change of context is a major change that can disorient users who cannot see the whole page at once: a change of user agent, viewport, focus, or of content that changes the meaning of the page. Opening a new window, moving focus to another component, loading a new page or significantly rearranging the page all count.
  • Focus, not activation: The rule is about receiving focus, by keyboard or by mouse. A change that happens after the user activates a control, for example by pressing a button, is not covered here.
  • Hover: Hovering does not move focus, so it is not covered, unless script makes it do so.
  • Not every content change counts: Expanding an outline, opening a dynamic menu or switching a tab panel is not a change of context unless it also changes focus or another item above.
  • The technique: Use "activate" rather than "focus" as the trigger (G107). The same control may still show a hint or tooltip on focus.
  • Out of scope: Changes caused by changing a setting are 3.2.2. Visible focus is 2.4.7. Focus order is 2.4.3.

Who does it affect?

Keyboard users, who move focus through every control. Screen reader users, who cannot see the whole page and rely on predictable behaviour. People with cognitive disabilities, for whom unexpected changes cause confusion. People with low vision using magnification, who see only a small part of the page. People with motor disabilities who tab or click accidentally.

In the EAA and EN 301 549

The European Accessibility Act (Directive (EU) 2019/882) applies to in-scope products and services placed on the market after 28 June 2025. Recital 47 names four principles for websites and mobile applications: perceivable, operable, understandable and robust. Predictable behaviour on focus is part of "understandable".

The technical counterpart is the standard EN 301 549, which incorporates WCAG 3.2.1 by reference and turns it into separate clauses for each kind of ICT.

Where WCAG 3.2.1 appears in EN 301 549
ClauseType of ICTWhat it requires
9.3.2.1Web pagesWeb content must satisfy WCAG success criterion 3.2.1.
10.3.2.1Non-web documents (PDF, Office files)Documents must not change context when a component receives focus, where the standard applies the criterion to them.
11.3.2.1Non-web software (native mobile apps)Software must not initiate a change of context when a component receives focus.

Whether and how the criterion applies to non-web documents is stated in clause 10 of the standard. Clause numbers follow the "9. + WCAG number" pattern of EN 301 549. In V3.2.1 the software clause is divided into further subclauses for open and closed functionality. Check the exact numbers in the standard when you cite them.

Standard version: EN 301 549 V4.1.1 (September 2026) is based on WCAG 2.2 and is the first version prepared specifically for the EAA. It has not yet been cited in the Official Journal of the European Union, so for now it is best treated as a voluntary technical route to the EAA's requirements. Once cited, it will give a presumption of conformity. The text of criterion 3.2.1 is the same in WCAG 2.1 and 2.2.

A note on EAA scope: Article 2(4) of the Directive excludes certain content from the requirements, for example office file formats published before 28 June 2025 and archives that are not updated after that date. Content you publish or change after that date is not covered by these exclusions.

Directive (EU) 2019/882, EUR-Lex, opens in a new tab

Code examples for the web

1. A menu that navigates when it receives focus

Tabbing past a list that jumps to a new page makes the rest of the page unreachable. Navigate on activation instead (G107).

Incorrect
<select onfocus="location.href=this.value">…</select>
Correct
<label for="go">Go to</label>
<select id="go">…</select>
<button type="button" onclick="location.href=go.value">Go</button>

2. A field that opens a window on focus

Opening a new window is a change of context. Open it from a button.

Incorrect
<input onfocus="window.open('/help')">
Correct
<input id="code">
<a href="/help" target="_blank" rel="noopener">Help finding your code (opens in a new tab)</a>

3. Script that moves focus on focus

Moving focus automatically to another component, such as the next field, takes control from the user.

Incorrect
first.addEventListener("focus", () => second.focus());
Correct
<!-- Let the user decide where focus goes -->
<input id="first"> <input id="second">

4. A full-screen search opened by focus

Opening a modal dialog moves focus and rearranges the page. Open it on click or Enter.

Incorrect
search.addEventListener("focus", openFullScreenSearch);
Correct
openSearchBtn.addEventListener("click", openFullScreenSearch);

5. Script that removes focus

Calling blur() when an element gets focus makes the page hard or impossible to use by keyboard (F55).

Incorrect
link.addEventListener("focus", () => link.blur());
Correct
/* Do not remove focus. Style it instead */
a:focus-visible { outline: 3px solid #0b5fff; outline-offset: 2px; }

6. What is allowed: a hint on focus

Showing helper text when a field receives focus is a content change, not a change of context, because focus does not move and nothing navigates.

Incorrect
<input onfocus="location.href='/next'">
Correct
<label for="pw">Password</label>
<input id="pw" type="password" aria-describedby="pw-hint">
<p id="pw-hint">At least 12 characters.</p>

Code examples for mobile

On mobile, focus moves when a screen reader user swipes or a keyboard user tabs. Do not navigate or open sheets from a focus callback. Use the control's activation.

iOS (SwiftUI)

import SwiftUI

struct HomeView: View {
    @State private var showHelp = false

    var body: some View {
        // Activation opens the help sheet; merely focusing the button does not
        Button("Help") { showHelp = true }
            .sheet(isPresented: $showHelp) { HelpView() }

        // Avoid: reacting to focus changes by navigating or presenting
        // .onChange(of: focusedField) { _, _ in showHelp = true }
    }
}

Android (Jetpack Compose)

import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier

@Composable
fun HelpButton(onOpenHelp: () -> Unit) {
    // Activation opens help; receiving focus does not
    Button(onClick = onOpenHelp) { Text("Help") }

    // Avoid: Modifier.onFocusChanged { if (it.isFocused) onOpenHelp() }
}

How to test

  • Tab through the page: Move through every control with the Tab key. Does anything open, submit, navigate or move focus on its own?
  • Click into fields: Click or tap each field and menu. Does the page change before you activate anything?
  • Search the code: Look for focus and onfocus handlers that open windows, change the location, submit forms or call focus() or blur().
  • Use a screen reader: Move through controls with the arrow keys. Is anything triggered by arriving on a control?
  • Check widgets: Date pickers, autocompletes, custom selects and third-party widgets often react to focus.
  • Check what is allowed: Tooltips, hints and expanded text on focus are fine, as long as focus does not move and nothing navigates.
  • Use a checker as a starting point: Automated tools cannot judge what a focus handler does. A person must test the keyboard path.

Common mistakes

  • Navigation on focus: A select list or link that goes to a new page when it receives focus.
  • New windows opened on focus: A pop-up when a field is reached.
  • Script that moves focus: Jumping to the next field when a field gets focus.
  • Script that removes focus: A blur() call on focus (F55).
  • Full-screen overlays on focus: Search or chat panels that take over when tabbed to.
  • Auto-advancing fields: Moving to the next field as soon as it is reached.
  • Treating activation as focus: Pressing Enter on a button is activation and is allowed to change context.
  • Forgetting third-party widgets: Libraries often add their own focus behaviour.

Sources

Standard version: EN 301 549 V4.1.1 (2026-09), WCAG 2.2. This page is for informational purposes only and is not legal advice. For binding requirements, refer to the official texts of the European Accessibility Act (Directive (EU) 2019/882) and EN 301 549.

Corpowid is recognized by Gartner

Corpowid has been recognized by Gartner, a leading global research and advisory firm, for our innovation and performance in digital accessibility. These badges reflect our commitment to creating inclusive, AI-powered web experiences.

Have questions about Corpowid?

Let’s connect.

We will get back to you as soon as possible.