Requires that functions using multipoint or path-based gestures, such as pinching or swiping, can also be operated with a single pointer.
Pinching with two fingers, swiping along a path or tracing a shape are hard or impossible for many people. Someone with a tremor, someone who uses a head pointer or a stylus, or someone who has one hand free may not be able to perform them. If a function can only be done with such a gesture, it is closed to them.
This criterion requires that all functionality that uses multipoint or path-based gestures can be operated with a single pointer without a path-based gesture, unless the gesture is essential. In practice: if you offer a pinch or a swipe, also offer a button or a tap.
People with tremors, limited dexterity or motor disabilities who cannot make precise multi-finger or path-based gestures. People who use a head pointer, a mouth stick, a stylus, a trackball or an eye-gaze system. People who use a device one-handed or on a fixed mount.
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. Simple pointer operation is part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.5.1 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.5.1 | Web pages | Web content must satisfy WCAG success criterion 2.5.1. |
| 10.2.5.1 | Non-web documents (PDF, Office files) | Documents must offer single-pointer alternatives for multipoint or path-based gestures where the standard applies the criterion to them. |
| 11.2.5.1 | Non-web software (native mobile apps) | Software must offer a single-pointer alternative to multipoint and path-based gestures. |
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 2.5.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
When the page implements zoom with a pinch gesture, add buttons for people who cannot pinch.
map.addEventListener("touchmove", handlePinchZoom); // pinch only<div id="map">…</div>
<button type="button" id="zoom-in" aria-label="Zoom in">+</button>
<button type="button" id="zoom-out" aria-label="Zoom out">−</button>
<script>
zoomIn.addEventListener("click", () => map.zoomBy(1));
zoomOut.addEventListener("click", () => map.zoomBy(-1));
</script>A swipe is a path-based gesture. Offer previous and next buttons.
<div class="carousel" data-swipe="true">…</div><div class="carousel">
<button type="button" aria-label="Previous slide">‹</button>
<div class="slides">…</div>
<button type="button" aria-label="Next slide">›</button>
</div>Provide a visible control for the same action.
row.addEventListener("swipeleft", () => deleteItem(row));<li>
Invoice 0042
<button type="button" aria-label="Delete invoice 0042">Delete</button>
</li>Let users set the value by tapping the track, or add a number field (G216).
<div class="slider" data-needs-drag="true"></div><label for="vol">Volume</label>
<input id="vol" type="range" min="0" max="100">
<input type="number" min="0" max="100" aria-label="Volume value">A gesture can stay, as long as the same function is available by single-pointer controls.
canvas.addEventListener("pointermove", detectCircleGesture); // the only way to refresh<button type="button" id="refresh">Refresh</button>
<!-- The circle gesture remains as an optional shortcut -->Drawing a signature is inherently path-based, so it is exempt. Offer another way where possible, for example typing a name.
<canvas id="signature"></canvas><canvas id="signature" aria-label="Draw your signature"></canvas>
<label for="typed">Or type your full name</label>
<input id="typed">On mobile these gestures are very common: pinch, multi-finger swipes, swipe actions. For each, offer a button or a menu item, and expose the alternative to screen readers as a custom action.
import SwiftUI
struct InvoiceRow: View {
let title: String
var onDelete: () -> Void
var body: some View {
HStack {
Text(title)
Spacer()
// A simple, visible alternative to the swipe action
Button("Delete", role: .destructive, action: onDelete)
}
.swipeActions(edge: .trailing) {
Button("Delete", role: .destructive, action: onDelete)
}
// VoiceOver users also get the action in the actions rotor
.accessibilityAction(named: "Delete", onDelete)
}
}import androidx.compose.foundation.layout.Row
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.CustomAccessibilityAction
import androidx.compose.ui.semantics.customActions
import androidx.compose.ui.semantics.semantics
@Composable
fun InvoiceRow(title: String, onDelete: () -> Unit) {
// The swipe-to-dismiss gesture can stay, but add a visible control as well
Row(
modifier = Modifier.semantics {
customActions = listOf(CustomAccessibilityAction("Delete") { onDelete(); true })
}
) {
Text(title)
TextButton(onClick = onDelete) { Text("Delete") }
}
}