Requires that when a component receives focus, it does not trigger a change of context such as opening a window or moving focus.
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.
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.
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.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.3.2.1 | Web pages | Web content must satisfy WCAG success criterion 3.2.1. |
| 10.3.2.1 | Non-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.1 | Non-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
Tabbing past a list that jumps to a new page makes the rest of the page unreachable. Navigate on activation instead (G107).
<select onfocus="location.href=this.value">…</select><label for="go">Go to</label>
<select id="go">…</select>
<button type="button" onclick="location.href=go.value">Go</button>Opening a new window is a change of context. Open it from a button.
<input onfocus="window.open('/help')"><input id="code">
<a href="/help" target="_blank" rel="noopener">Help finding your code (opens in a new tab)</a>Moving focus automatically to another component, such as the next field, takes control from the user.
first.addEventListener("focus", () => second.focus());<!-- Let the user decide where focus goes -->
<input id="first"> <input id="second">Opening a modal dialog moves focus and rearranges the page. Open it on click or Enter.
search.addEventListener("focus", openFullScreenSearch);openSearchBtn.addEventListener("click", openFullScreenSearch);Calling blur() when an element gets focus makes the page hard or impossible to use by keyboard (F55).
link.addEventListener("focus", () => link.blur());/* Do not remove focus. Style it instead */
a:focus-visible { outline: 3px solid #0b5fff; outline-offset: 2px; }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.
<input onfocus="location.href='/next'"><label for="pw">Password</label>
<input id="pw" type="password" aria-describedby="pw-hint">
<p id="pw-hint">At least 12 characters.</p>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.
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 }
}
}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() }
}focus and onfocus handlers that open windows, change the location, submit forms or call focus() or blur().blur() call on focus (F55).