Requires a way to pause, stop or hide moving, blinking, scrolling or auto-updating content that lasts more than five seconds.
Carousels that rotate by themselves, tickers, animated banners and auto-updating feeds are hard to use. People with attention or reading difficulties cannot concentrate, people with low vision lose their place, and screen reader users hear the content change under them.
This criterion requires that for any moving, blinking or scrolling information that starts automatically, lasts more than five seconds and is shown alongside other content, there is a way to pause, stop or hide it. For information that updates automatically, the same applies, unless it is essential.
People with attention, cognitive or reading difficulties, who cannot focus on content next to moving content. People with low vision who may lose their place. People with vestibular disorders who feel unwell with movement. Screen reader users, whose reading is interrupted when content changes.
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. Control over moving content is part of "operable".
The technical counterpart is the standard EN 301 549, which incorporates WCAG 2.2.2 by reference and turns it into separate clauses for each kind of ICT.
| Clause | Type of ICT | What it requires |
|---|---|---|
| 9.2.2.2 | Web pages | Web content must satisfy WCAG success criterion 2.2.2. |
| 10.2.2.2 | Non-web documents (PDF, Office files) | Documents with moving or auto-updating content must meet the same rule where the standard applies the criterion to them. |
| 11.2.2.2 | Non-web software (native mobile apps) | Software with moving, blinking, scrolling or auto-updating content must let users pause, stop or hide it. |
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.2.2 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
A carousel that rotates automatically needs a visible, keyboard-accessible pause button.
<div class="carousel" data-autoplay="3000">…</div><div class="carousel" aria-roledescription="carousel" aria-label="Featured">
<button type="button" id="toggle" aria-pressed="false">Pause slides</button>
<div class="slides" aria-live="off">…</div>
</div>
<script>
toggle.addEventListener("click", () => {
const paused = toggle.getAttribute("aria-pressed") === "true";
toggle.setAttribute("aria-pressed", String(!paused));
toggle.textContent = paused ? "Pause slides" : "Play slides";
paused ? startRotation() : stopRotation();
});
</script>Avoid auto-scrolling text. If it is needed, provide a way to stop it.
<marquee>Sale ends today!</marquee><p>Sale ends today!</p>Turn animations off for users who ask the system to reduce motion.
.hero { animation: float 6s infinite; }.hero { animation: float 6s infinite; }
@media (prefers-reduced-motion: reduce) {
.hero { animation: none; }
}Give users a visible control to pause it, or do not loop it.
<video autoplay muted loop src="bg.mp4"></video><video id="bg" autoplay muted loop src="bg.mp4"></video>
<button type="button" onclick="bg.paused ? bg.play() : bg.pause()">
Pause background video
</button>Let users pause live updates or control how often they refresh.
setInterval(refreshScores, 5000);let timer = setInterval(refreshScores, 5000);
pauseBtn.addEventListener("click", () => {
clearInterval(timer);
timer = null;
});A GIF that loops for more than five seconds needs a pause. Use a video with controls instead.
<img src="promo.gif" alt="Promotion"><video src="promo.mp4" autoplay muted loop playsinline controls
aria-label="Promotion"></video>Native apps have moving content too: banners, carousels and animations. Respect the system Reduce Motion setting, and give a pause control for anything that moves on its own for more than five seconds.
import SwiftUI
struct HeroBanner: View {
@Environment(\.accessibilityReduceMotion) private var reduceMotion
@State private var paused = false
var body: some View {
VStack {
BannerCarousel(autoAdvance: !reduceMotion && !paused)
// A visible control to pause the movement
Button(paused ? "Play banner" : "Pause banner") {
paused.toggle()
}
}
}
}import android.provider.Settings
import androidx.compose.material3.Text
import androidx.compose.material3.TextButton
import androidx.compose.foundation.layout.Column
import androidx.compose.runtime.*
import androidx.compose.ui.platform.LocalContext
@Composable
fun HeroBanner() {
val context = LocalContext.current
// 0f means animations are turned off in the system settings
val animationsOn = Settings.Global.getFloat(
context.contentResolver, Settings.Global.ANIMATOR_DURATION_SCALE, 1f
) != 0f
var paused by remember { mutableStateOf(false) }
Column {
BannerCarousel(autoAdvance = animationsOn && !paused)
TextButton(onClick = { paused = !paused }) {
Text(if (paused) "Play banner" else "Pause banner")
}
}
}autoplay, marquee, setInterval, animated GIFs and CSS animation with infinite.prefers-reduced-motion: The system setting exists for this reason.aria-pressed.