The Blink You Can't Stop Is the Barrier You Created
Keisha · AI Research Engine
Analytical lens: Community Input
Community engagement, healthcare, grassroots
AI-assisted · Source-linked · Editorially reviewed · Methodology
Trust note
This article was drafted with AI assistance, reviewed against accessibility.chat editorial standards, and should be treated as research and education rather than legal advice. We prioritize primary sources and correct material errors.

Blinking content feels harmless. A pulsing sale badge, a flashing "limited time offer" label, a price that throbs to grab attention — these feel like design decisions, not access decisions. WCAG Failure F112 (opens in new window) pushes back on that assumption directly: when blinking content runs for more than five seconds without a user-controlled mechanism to stop it, you've created a documented failure of Success Criterion 2.2.2 Pause, Stop, Hide (opens in new window). And the people most harmed aren't edge cases.
The Failure
F112 is one of the more quietly consequential entries in W3C's official failure catalog. The W3C's description is unambiguous: blinking content that automatically starts, runs for five seconds or more, appears alongside other content, and provides no method to stop it fails SC 2.2.2. The failure applies specifically to content created with CSS animations or client-side scripting — the two most common tools in modern front-end development.
The canonical example from the official document is a product listing page using constantly blinking prices to draw attention to sale items. Users cannot control the blink. That's the whole failure. No mechanism to pause. No mechanism to hide. No escape.
The problematic pattern looks something like this:
/* Failure: Blinking price label with no user control */keyframes blink { 0, 100 { opacity: 1; } 50 { opacity: 0; }}.sale-price { animation: blink step-start infinite;}This animation runs indefinitely. There is no pause button. No user preference respected. No prefers-reduced-motion query. Just an infinite loop that the user cannot escape without leaving the page entirely.
Why This Matters
The real-world impact of sustained blinking content is not abstract. For people with attention-related cognitive disabilities — ADHD, traumatic brain injury, certain anxiety disorders — persistent motion in the visual field doesn't just distract. It can make it functionally impossible to read the surrounding content. The blinking element becomes a cognitive anchor that pulls attention away from everything else on the page.
For people with photosensitive epilepsy, the calculus is even more serious, though F112's specific scope is about the cognitive and attention barrier rather than seizure risk (which falls under SC 2.3.1). The distinction matters for remediation: F112 is about sustained, uncontrollable motion, not flash frequency.
For screen reader users, blinking content implemented with CSS animations is often invisible as a barrier — they don't see the blink, but they may encounter the element announced repeatedly or inconsistently depending on how the animation interacts with the accessibility tree. The experience is unpredictable.
The community impact here follows a pattern we see consistently in digital accessibility: design choices made to increase engagement for the majority create exclusion for a significant minority. Sale price blinking is meant to convert shoppers. For users with attention disorders, it may prevent them from completing a purchase at all.
The Fix
The corrected pattern has two components: respect the user's system preference, and provide an explicit mechanism if animation runs regardless.
Option 1 — Respect prefers-reduced-motion (minimum fix):
/* Respects user's system-level motion preference */keyframes blink { 0, 100 { opacity: 1; } 50 { opacity: 0; }}.sale-price { animation: blink step-start infinite;}media (prefers-reduced-motion: reduce) { .sale-price { animation: none; /* Use a static visual indicator instead */ border: solid red; font-weight: bold; }}Option 2 — User-controlled pause mechanism (more robust):
<!-- Provide explicit user control --><button id="pause-animations" aria-pressed="false"> Pause animations</button><span class="sale-price" aria-label="Sale price: $29.99">$29.99</span>// Toggle animation state based on user preferenceconst btn = document.getElementById('pause-animations');btn.addEventListener('click', () => { const isPaused = btn.getAttribute('aria-pressed') === 'true'; btn.setAttribute('aria-pressed', String(!isPaused)); document.documentElement.classList.toggle('animations-paused', !isPaused);});.animations-paused .sale-price { animation-play-state: paused;}SC 2.2.2 requires that for any moving, blinking, or scrolling content that starts automatically, lasts more than five seconds, and is presented in parallel with other content, users must have a mechanism to pause, stop, or hide it. Both options above satisfy that requirement — one by deferring to system preferences, one by providing explicit control.
Applying This
F112 failures are genuinely difficult for automated testing tools to catch reliably. A tool can detect that a CSS animation exists. It cannot easily determine whether that animation runs for more than five seconds, whether it appears in parallel with other content, or whether a pause mechanism is present and functional. This is precisely the kind of contextual judgment that our research on automated vs. manual testing identifies as a gap — automated tools achieve at most 37% detection against comprehensive manual audits, and motion-related failures are a significant part of what they miss.
For development teams, the practical catch points are:
- Design review: Flag any animation with
infiniteor duration > 5s as requiring a pause mechanism orprefers-reduced-motionhandling before it ships - CSS linting: Tools like Stylelint can be configured to warn on
animation: ... infinitewithout an accompanyingprefers-reduced-motionoverride - Manual QA checklist: Include a specific step — "does any animation run longer than 5 seconds without a stop/pause control?"
- Component library standards: If your design system includes animated components (badges, banners, loaders), build the
prefers-reduced-motionoverride into the component itself, not as an afterthought
The prefers-reduced-motion approach is the lower-lift fix and should be the baseline for any team. The explicit pause button is better for content where the animation carries meaning (a countdown, a live price update) and simply stopping it would remove information.
Teams navigating multiple compliance frameworks — WCAG 2.2, Section 508, EN 301 549 — should note that SC 2.2.2 appears across all three. The compliance framework analysis shows that motion control requirements are one of the areas with strong cross-standard alignment, which means fixing this once has broad compliance value.
CORS Perspective
From a community input lens, F112 is a reminder that e-commerce and marketing design patterns carry real access costs for people with cognitive and attention-related disabilities — a population that disability rights advocates consistently note is underrepresented in accessibility audits that focus primarily on screen reader compatibility. Operationally, the fix is low-cost and high-impact: prefers-reduced-motion is a one-time CSS addition that benefits a wide range of users and is well within any front-end team's capacity. The risk dimension is clear — SC 2.2.2 is a WCAG Level A requirement (opens in new window), the baseline, which means this failure represents the floor of what's expected, not an advanced requirement. Strategically, framing motion control as both a legal baseline and a conversion optimization (users who can focus are users who can buy) tends to land with product leadership in ways that pure compliance arguments don't.
About the Keisha lens
A community-impact lens. Frames findings around who is excluded and what a barrier means in practice, with emphasis on healthcare and grassroots access.
Keisha is an AI analyst lens, not a human staff member. It helps frame this article through a consistent accessibility perspective.
Specialization: Community engagement, healthcare, grassroots
View all articles using this lens →Primary source reviewed: https://www.w3.org/WAI/WCAG22/Techniques/failures/F112 (opens in new window)
Transparency Disclosure
This article was drafted with AI assistance and reviewed against our editorial methodology. We disclose that process so readers can judge the work clearly.