Requires that anything done by dragging can also be done with a single click or tap, without dragging.
Dragging asks you to press, hold, move and release, all at once and with precision. It is hard for people with tremors, for people who use a trackball, a head pointer or eye-gaze, and for anyone who cannot hold a button down while moving.
This criterion, new in WCAG 2.2, requires that all functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging, unless dragging is essential or the functionality is determined by the user agent and not modified by the author.
People with tremors or limited dexterity who cannot press, move and hold at once. People who use a trackball, a head pointer, a mouth stick or eye-gaze, where dragging is slow, tiring or error-prone. People who control the pointer with voice commands or switches.
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. Pointer operation without dragging is part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.5.7 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.5.7 | Web pages | Web content must satisfy WCAG success criterion 2.5.7. |
Because this criterion is new, check clauses 10 and 11 of V4.1.1 for the rows that apply to documents and software. 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: Criterion 2.5.7 is new in WCAG 2.2, so it is not part of EN 301 549 V3.2.1, which is based on WCAG 2.1. It appears in EN 301 549 V4.1.1 (September 2026), the first version prepared specifically for the EAA. V4.1.1 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. It is a Level AA criterion.
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
Native range inputs also let users click along the track. A number field beside it is the clearest alternative.
Add buttons that move an item up or down.
- Task A
-
Task A
Let users pick a destination column from a menu.
Fix bug
Fix bug
Provide up, down, left and right controls.
… …
A drop zone needs a normal button to choose files.
Drop files hereDrop files here, or
A drag handle needs a click or tap alternative, such as buttons for preset sizes.
Native apps use reordering handles, sliders and crop frames. Add a tap-based alternative, and make it available to screen reader users as well.
import SwiftUI
struct TaskList: View {
@State private var tasks = ["Write report", "Review code", "Plan trip"]
var body: some View {
List {
ForEach(tasks.indices, id: \.self) { i in
HStack {
Text(tasks[i])
Spacer()
// Tap alternatives to drag-to-reorder
Button { move(i, by: -1) } label: { Image(systemName: "arrow.up") }
.accessibilityLabel("Move \(tasks[i]) up")
Button { move(i, by: 1) } label: { Image(systemName: "arrow.down") }
.accessibilityLabel("Move \(tasks[i]) down")
}
}
.onMove { tasks.move(fromOffsets: $0, toOffset: $1) } // drag remains
}
}
private func move(_ i: Int, by d: Int) {
let j = i + d
guard tasks.indices.contains(j) else { return }
tasks.swapAt(i, j)
}
}import androidx.compose.foundation.layout.Row
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDownward
import androidx.compose.material.icons.filled.ArrowUpward
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
@Composable
fun TaskRow(title: String, onUp: () -> Unit, onDown: () -> Unit) {
Row {
Text(title)
// Tap alternatives to drag-to-reorder
IconButton(onClick = onUp) {
Icon(Icons.Filled.ArrowUpward, contentDescription = "Move $title up")
}
IconButton(onClick = onDown) {
Icon(Icons.Filled.ArrowDownward, contentDescription = "Move $title down")
}
}
}