WCAG 2.5.1: Pointer Gestures
Pinching to zoom, swiping through a carousel, drawing a shape to trigger a command — these gestures are impossible for many people. This criterion requires that anything operated by a multipoint or path-based gesture can also be operated with a single pointer, such as one tap or one click on a visible control. Keep the gestures; just never make them the only way.
The success criterion, in full
All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture, unless a multipoint or path-based gesture is essential.
The W3C adds a normative note: this requirement applies to web content that interprets pointer actions — it does not apply to gestures required to operate the browser or assistive technology (such as browser-level scrolling or screen reader gestures).
Who this helps
Complex gestures assume two things: fine motor control and multiple contact points. Plenty of people have neither. Someone with a tremor caused by Parkinson’s disease or cerebral palsy may be unable to trace a steady path across a screen. Someone with the use of one finger, a partial hand, or a prosthesis cannot perform a two-finger pinch at all.
People using head pointers, mouth sticks, or eye-gaze
These devices produce exactly one pointer. Multipoint gestures are physically impossible, and steady path-based movements are extremely difficult.
People with tremors or limited fine motor control
A swipe or drawn gesture requires a controlled, continuous path. Hand tremors, spasms, or fatigue make the path erratic, so the gesture never registers.
People with limited use of one hand or fingers
Pinch, rotate, and multi-finger taps require several simultaneous contact points that a single available finger cannot provide.
Anyone in a constrained situation
One hand holding a rail on a moving train, a phone operated through a glove, a stylus user — single-pointer alternatives make the interface work for everyone.
The fix is always the same shape: expose the functionality through ordinary, visible controls that need only a tap or click. Those controls also tend to satisfy 2.1.1 Keyboard for free, because a real button is keyboard-operable too.
Multipoint vs. path-based gestures
The criterion covers two specific families of gesture, and the distinction matters when you audit a page:
- Multipoint gestures use two or more contact points at once: pinch-to-zoom, two-finger rotation, a three-finger tap, a split-tap. If the gesture cannot be performed with one finger, it is multipoint.
- Path-based gestures depend on the direction or path of movement, not just where the pointer starts and ends: swiping left to reveal a delete action, flicking through carousel slides, drawing a “Z” to trigger a shortcut, or sliding along a rating widget where the traced path is what the code evaluates.
What is not covered: plain drag-and-drop where only the start and end points matter (that is 2.5.7 Dragging Movements, Level AA), single taps and double taps, long presses, and gestures the browser or operating system handles for you, such as two-finger scrolling of the whole page.
The only escape hatch is the essential exception: when the path itself is the point of the feature. A signature capture field exists precisely to record your freehand path, so no tap-based alternative could be equivalent. Very few features genuinely qualify — if buttons could achieve the same outcome, the gesture is not essential.
Pass and fail examples
Pass: map with pinch-zoom and zoom buttons
An embedded map supports two-finger pinch-to-zoom, and also shows visible + and − buttons that zoom by one step per tap. The multipoint gesture has a single-pointer alternative.
Pass: carousel with swipe and next/previous buttons
Users can swipe between slides, and visible “Previous” and “Next” buttons advance the carousel with a single tap. The path-based swipe is an enhancement, not the only path.
Pass (essential exception): signature capture
A delivery app asks the user to sign with their finger. The freehand path is the functionality, so the path-based gesture is essential and no alternative gesture is required.
Fail: swipe-only email actions
A webmail list lets users swipe left on a message to archive it and swipe right to delete — and provides no other way to reach those actions. Users who cannot swipe cannot archive or delete at all.
Fail: pinch-only image zoom
A product gallery implements its own pinch-to-zoom in JavaScript but offers no zoom buttons, no double-tap zoom, and no other single-pointer way to magnify the image. The multipoint gesture is the only route, so it fails.
Code examples
Carousel: swipe as enhancement, buttons as baseline
The failing version wires up touch events and nothing else. The passing version keeps the swipe but drives the same function from real buttons.
<!-- ✗ Fails: swiping is the only way to change slides -->
<div id="carousel">
<ul class="slides">…</ul>
</div>
<script>
const el = document.getElementById("carousel");
let startX = 0;
el.addEventListener("touchstart", (e) => (startX = e.touches[0].clientX));
el.addEventListener("touchend", (e) => {
const dx = e.changedTouches[0].clientX - startX;
if (dx < -50) nextSlide();
if (dx > 50) prevSlide();
});
</script>
<!-- ✓ Passes: visible buttons operate the same function with one tap -->
<div id="carousel">
<button type="button" onclick="prevSlide()">Previous slide</button>
<ul class="slides">…</ul>
<button type="button" onclick="nextSlide()">Next slide</button>
<!-- swipe listeners can stay as a convenience -->
</div>Custom pinch-zoom with single-pointer controls (React)
If your component interprets multi-touch to zoom, add zoom buttons that change the same state. One state, two input methods.
function ZoomableImage({ src, alt }) {
const [scale, setScale] = useState(1)
const zoomIn = () => setScale((s) => Math.min(s + 0.25, 4))
const zoomOut = () => setScale((s) => Math.max(s - 0.25, 1))
return (
<div>
{/* ✓ Single-pointer alternative to the pinch gesture */}
<div role="group" aria-label="Zoom controls">
<button type="button" onClick={zoomOut}>Zoom out</button>
<button type="button" onClick={zoomIn}>Zoom in</button>
</div>
{/* Pinch handling updates the same scale state */}
<div onTouchMove={handlePinch /* optional enhancement */}>
<img src={src} alt={alt} style={{ transform: "scale(" + scale + ")" }} />
</div>
</div>
)
}Swipe-to-reveal actions with an always-available menu
List items that reveal actions on swipe should expose the same actions through a tappable control on each row.
<!-- ✓ Every swipe action is also a plain button -->
<li class="message-row">
<span class="subject">Quarterly report</span>
<button type="button" aria-haspopup="menu" aria-expanded="false"
onclick="toggleRowMenu(this)">
Actions for “Quarterly report”
</button>
<div role="menu" hidden>
<button role="menuitem" type="button" onclick="archiveMessage()">Archive</button>
<button role="menuitem" type="button" onclick="deleteMessage()">Delete</button>
</div>
</li>Common failures
- Carousels, image galleries, or story viewers that advance only on swipe, with no previous/next buttons.
- Custom pinch-to-zoom on images, charts, or maps with no zoom in/out buttons or equivalent single-tap control.
- Swipe-to-delete or swipe-to-archive list rows with no visible button or menu offering the same actions.
- Gesture shortcuts — drawing a letter or shape to trigger a command — with no discoverable button or menu equivalent.
- Pull-to-refresh as the only way to reload content in a web app, with no refresh button.
- Custom sliders or scrubbers whose value can only be set by tracing along the track, with no tap-to-set, stepper buttons, or text input.
- Providing an alternative that itself requires a path-based gesture — e.g. replacing a two-finger rotate with a one-finger circular drag still fails; the alternative must be tap/click based.
How to test for 2.5.1
- 1
Inventory every gesture the page implements
On a touch device (or emulator), work through the page and note every interaction that responds to swiping, pinching, rotating, multi-finger taps, or drawn shapes. Check JavaScript for touchstart/touchmove, pointermove, and gesture libraries (Hammer.js, use-gesture) to catch handlers you might miss by hand.
- 2
Attempt each function with a single tap or click
For every gesture found, try to achieve the same outcome using only single taps or clicks on visible controls. Advance the carousel, zoom the map, reveal the row actions. If any function has no tap/click route, it fails.
- 3
Verify the alternative is not itself path-based
The alternative must work without tracing a path. A control you must drag along a track is not a valid alternative — look for tap-to-activate buttons, steppers, or inputs.
- 4
Test with a mouse on desktop
A quick proxy: if the feature cannot be operated with ordinary mouse clicks (no click-drag paths, no wheel-only interactions), single-pointer users on touch devices are probably locked out too.
- 5
Evaluate any claimed 'essential' exceptions
For each gesture with no alternative, ask whether the path itself is the purpose (signature, freehand drawing). If buttons could achieve the same end result, the exception does not apply. Automated scanners cannot detect 2.5.1 failures — this is a manual test.
Work through the full WCAG 2.2 checklist to cover the neighbouring input-modality criteria at the same time — gestures, cancellation, and motion usually travel together.
Frequently asked questions
What does WCAG 2.5.1 Pointer Gestures require?
It requires that all functionality operated with multipoint gestures (two or more fingers, like pinch-to-zoom) or path-based gestures (where the movement path matters, like swiping a carousel) can also be operated with a single pointer without a path-based gesture — unless the gesture is essential. In practice that means simple taps or clicks on visible controls must be able to do everything the fancy gestures do. It is a Level A criterion introduced in WCAG 2.1 and unchanged in WCAG 2.2.
What is the difference between a path-based gesture and a simple drag?
A path-based gesture depends on the direction or path of the pointer movement, not just its start and end points — swiping left to advance a carousel, or drawing a shape to trigger a command. A drag-and-drop operation where only the start and end points matter is not path-based, so it is not covered by 2.5.1. Dragging is instead covered by WCAG 2.5.7 Dragging Movements (Level AA, new in WCAG 2.2), which requires a single-pointer alternative for drags. The two criteria are complementary: 2.5.1 covers direction-dependent gestures, 2.5.7 covers point-to-point dragging.
Does 2.5.1 apply to browser or operating-system gestures like scrolling?
No. The criterion applies only to gestures that your web content itself interprets — the W3C note states it does not apply to actions required to operate the user agent or assistive technology. Two-finger scrolling handled by the browser, OS-level back-swipes, and screen reader gestures are out of scope. But the moment your JavaScript listens for touch or pointer events and implements its own gesture — a custom pinch-zoom on an image, a swipeable card stack — 2.5.1 applies to that functionality.
When is a gesture 'essential' under 2.5.1?
A gesture is essential when removing it would fundamentally change the functionality. The classic example is a signature field: the whole point is to capture the user's freehand path, so a path-based gesture is essential and no alternative is required (though 2.5.2 Pointer Cancellation and other criteria still apply). A drawing canvas in an art application is similar. By contrast, pinch-zooming a map is not essential — zoom buttons can achieve the same result — so an alternative is required.
Do I need to remove gestures like swipe and pinch to pass 2.5.1?
No — keep them. Gestures are fast and convenient for the users who can perform them. The criterion only asks that they are not the only way to operate the functionality. A carousel can keep its swipe as long as visible previous/next buttons exist; a map can keep pinch-zoom as long as it has zoom in/out buttons. Progressive enhancement is the right mental model: single-pointer controls are the baseline, gestures are the enhancement.
How is 2.5.1 different from 2.1.1 Keyboard?
2.1.1 Keyboard requires functionality to be operable from a keyboard interface; 2.5.1 requires gesture-driven functionality to be operable with a single pointer such as one finger or a mouse click. They protect overlapping but distinct groups: someone using a head pointer or single finger may not use a keyboard at all, and a keyboard-only user cannot perform any pointer gesture. A well-built control — say a carousel with focusable next/previous buttons — typically satisfies both at once, because a real button is both clickable and keyboard-operable.
Related Success Criteria
Functions triggered by single pointer can be cancelled or undone.
The accessible name contains the visible label text.
Functionality triggered by device motion can be disabled and has alternatives.
Target size is at least 44 by 44 CSS pixels except in specific cases.
Content does not restrict use of input modalities.