Skip to main content
Operable WCAG 2.3.2

2.3.2 Three Flashes

Web pages do not contain anything that flashes more than three times in any one-second period.

Level AAA Critical WCAG 2.0 (new) WCAG 2.1 WCAG 2.2

What this rule means

WCAG 2.3.2 is the AAA-level version of 2.3.1. While 2.3.1 allows flashing that stays below the general flash and red flash thresholds (based on area size and luminance change), 2.3.2 removes the threshold exception entirely. Under this criterion, absolutely no content may flash more than three times per second, regardless of size, color, or luminance.

This is a stricter and simpler rule: if it flashes more than three times per second, it fails — period. There are no calculations of pixel area, no consideration of viewing distance, and no special treatment for red. This makes it both easier to understand and harder to satisfy, as even small or subtle flashing elements must comply.

Why it matters

The threshold exceptions in 2.3.1 are based on statistical models of seizure triggers, but individual sensitivity varies. Some people with photosensitive epilepsy can have seizures triggered by stimuli that fall within the "safe" thresholds defined by 2.3.1. By eliminating all flashing above three times per second, 2.3.2 provides maximum protection.

This AAA criterion is particularly important for environments where the audience is known to include individuals with high photosensitivity — medical facilities, schools, government services. It is also important for content viewed on large screens or in dark environments, where the relative size and impact of flashing content is amplified.

Related axe-core rules

There are no automated axe-core rules for this criterion. Like 2.3.1, detecting flash frequency requires specialized analysis tools. The difference is that no threshold calculations are needed — any content flashing more than three times per second fails.

How to test

Testing follows the same approach as 2.3.1 but with a stricter standard.

  1. Identify all content on the page that involves visual changes: videos, animations, GIFs, CSS animations, JavaScript-driven effects.
  2. For each visual element, determine the flash frequency. Count luminance changes (dark-to-light or light-to-dark transitions) per second.
  3. Any element flashing more than three times per second fails this criterion — regardless of size or color.
  4. Use PEAT or similar tools to analyze video content frame by frame.
  5. Test with prefers-reduced-motion enabled to verify that all animations are reduced or eliminated.

How to fix

Limit all visual transitions to three or fewer per second. This is the safest and most straightforward approach.

Rate-limiting animations

/* Ensure animation cycle is at least 333ms (3 per second max) */
@keyframes safe-blink {
  0%, 49% { opacity: 1; }
  50%, 100% { opacity: 0; }
}
.notification-dot {
  /* 1s cycle = 1 flash/sec — well within safe range */
  animation: safe-blink 1s step-end infinite;
}

/* Even safer: avoid blinking entirely, use fade */
@keyframes safe-fade {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}
.notification-dot-safe {
  animation: safe-fade 2s ease-in-out infinite;
}

JavaScript flash rate limiter

// Ensure visual state changes happen no more than
// 3 times per second
class FlashGuard {
  constructor(maxFlashesPerSecond = 3) {
    this.minInterval = 1000 / maxFlashesPerSecond;
    this.lastFlash = 0;
  }

  canFlash() {
    const now = Date.now();
    if (now - this.lastFlash >= this.minInterval) {
      this.lastFlash = now;
      return true;
    }
    return false;
  }
}

const guard = new FlashGuard(3);

function safeVisualFeedback(element) {
  if (guard.canFlash()) {
    element.classList.add('highlight');
    setTimeout(() => element.classList.remove('highlight'),
      200);
  }
}

Common mistakes

  • Relying on 2.3.1 threshold calculations and assuming small flashing elements are automatically safe.
  • Animated SVGs or Canvas elements with rapid frame updates that create flashing effects.
  • Transition effects between pages or sections that involve brief full-screen flashes.
  • Banner ads or embedded third-party content with uncontrolled flash rates.
  • Loading spinners or progress indicators that flash rapidly.
  • Cursor blink rates in text editors or input fields exceeding three per second.

Resources