Back to reviews and guides

WCAG 2.3.2 Three Flashes: Understanding the AAA Requirement for Flashing Content

This article explains WCAG 2.3.2 (Three Flashes), the rule that limits flashing to no more than three times in one second to reduce photosensitive seizure risk. It gives practical testing steps, common causes, fixes including CSS examples and a decision framework for removal, reduction, or controls.

What WCAG 2.3.2 (Three Flashes) requires

WCAG 2.3.2 sets a limit on flashing content to reduce the risk of photosensitive seizures. The rule stops content that flashes more than three times in any single second. If parts of a page blink, flicker, or use rapid frame changes, they must stay below that threshold or be removed.

Which visual changes count as a flash

Not every animation is a flash. The criterion applies when there is a rapid change in luminance or contrast that a user can see as a discrete flash. Common sources are:

  • Animated GIFs and short looping videos
  • CSS animations or transitions that rapidly change background or foreground brightness
  • Canvas, WebGL, or img sequences that swap frames quickly
  • Blinks caused by script-driven DOM updates or ARIA live regions that toggle visible content rapidly

The measurable rule and the “below threshold” concept

The simple test is timing: if a visible element flashes more than three times in any one-second interval it fails. The criterion also recognises a below-threshold exception. Content that is steady or that changes slowly enough not to produce discrete flashes is outside the rule. Where the boundary is unclear, count distinct increases or decreases in visible intensity over one second.

Step-by-step testing for WCAG 2.3.2

  1. Find candidate content. Look for GIFs, short videos, or fast CSS animations.
  2. Observe or record a one-second window where the animation is most active.
  3. Count visible flashes. A flash is a rapid rise then fall in brightness, or a quick swap of bright frames.
  4. If you can pause frame-by-frame in a video player or browser dev tools, confirm the count precisely.
  5. Check different browsers and screen sizes because timing and rendering can differ.
  6. Document failures and the pages where they appear for remediation.

Practical testing tips

  • Use the browser’s developer tools to pause CSS animations or step through frames in a video.
  • Record the screen at high frame rate and review frames to count quick flashes.
  • Simulate lower frame rates; some devices will produce more visible flashes.

Simple code patterns to prevent flashing

You can often remove flashes by slowing animations, adding pauses, or offering user controls. Respect the user preference for reduced motion with media queries. Example pattern:

In CSS: @media (prefers-reduced-motion: reduce) { animation: none; transition: none; }

When using animations, prefer smooth transitions that change position or opacity slowly rather than quick, high-contrast frame swaps. For autoplaying media provide clear controls to pause or stop.

Common mistakes that cause failures

  • Embedding short, looping GIFs with bright frames and no pause
  • Using rapid CSS keyframe steps that jump luminance or colour abruptly
  • Updating the DOM rapidly (for example via live regions) without throttling
  • Assuming mobile devices render the same timing as desktop

Decision framework: remove, reduce, or provide controls

  1. If the flashing is decorative and non-essential, remove it.
  2. If it is informative, reduce frequency or smooth the change so it does not produce distinct flashes.
  3. If it must flash to convey meaning, add an obvious control to stop or pause and respect prefers-reduced-motion.

Real-world scenario: a hero banner slideshow

Problem: a slideshow cycles through three bright slides with a quick crossfade that results in more than three visible flashes per second.

Fixes to try:

  • Increase the crossfade duration to remove sharp frame swaps
  • Add a visible pause control that stops automatic advances
  • Honour prefers-reduced-motion and disable auto-advance when it is set
  • Replace bright rapid frames with a single static image plus a descriptive caption

Notes on conformance level and practical policy

This criterion is framed as a high-severity safety requirement. Many legal accessibility standards reference Level AA rather than AAA. Still, treat flashing content as a health risk and fix it regardless of formal conformance level. Test with a variety of users and devices.

Quick checklist for WCAG 2.3.2 compliance

  • Search pages for GIFs, autoplay videos, canvas animations, and fast CSS keyframes
  • Count flashes in the most active one-second window
  • Remove or slow anything that flashes more than three times per second
  • Provide pause or stop controls for required flashing content
  • Respect prefers-reduced-motion and offer alternatives
  • Document tests and fixes for future reviews

If you want, I can review a specific page or provide step-by-step testing notes for a file or URL you supply.