2.3.1 Three Flashes or Below Threshold

WCAG 2.2 · 2.3.1 A Operable

What it requires

Web pages must not contain anything that flashes more than three times in any one-second period — unless the flashing is below the general flash and red flash thresholds. In plain terms: nothing on the page should blink, strobe, or rapidly change brightness fast enough and brightly enough to risk triggering a seizure.

A “flash” is a pair of opposing changes in relative luminance. The thresholds are measured for the flashing area as it appears on screen: content is a concern when the combined flashing region is larger than a small central portion of the visual field (roughly 25% of 10 degrees of vision) and the contrast of the flash is high. Saturated red flashing is held to a stricter limit. The safe option is simply to stay at or below three flashes per second across the whole page.

  • People with photosensitive epilepsy — fast, high-contrast or red flashing can trigger seizures.
  • People with vestibular disorders and migraine — strobing and rapid luminance changes can cause nausea, dizziness, and disorientation.
  • Anyone sensitive to motion — flashing video intros, autoplaying ads, and animated loaders can cause discomfort or force users to leave the page.

How to detect it

Checks for flashing content
Check How Catches
Manual review Watch every video, animation, GIF, transition, and ad for rapid blinking or strobing. Most real failures.
Analysis tool Run flashing media through PEAT (Photosensitive Epilepsy Analysis Tool) to measure against the thresholds. Borderline cases needing the formal threshold test.
Keyboard / SR / zoom Not applicable — this is a visual, time-based risk, not a keyboard or screen-reader concern. Nothing here.
Automated (axe, etc.) Cannot reliably analyse pixel-level luminance over time. Essentially nothing — treat as manual.

How to fix it

  1. Remove or slow any content that flashes more than three times per second.
  2. Re-edit offending video or animation so luminance and red transitions stay below threshold; verify with PEAT.
  3. Avoid large areas of high-contrast or saturated-red strobing entirely.
  4. Respect the user’s reduced-motion preference so risky animation never autoplays for those who opt out.
<style>
  @media (prefers-reduced-motion: reduce) {
    .strobe { animation: none; }
  }
</style>

Copy-paste tests

Automated coverage

There is no fully automated axe-core rule for 2.3.1 Three Flashes or Below Threshold — flashing frequency and luminance can’t be reliably measured statically, so this criterion needs manual review using the console check and steps below.

Run this in the browser console

flash-suspects.js
// Read-only: surfaces moving/animated media to review for flashing.
const suspects = [...document.querySelectorAll(
  'video, canvas, [class*="flash"], [class*="blink"], [class*="strobe"]'
)];
document.querySelectorAll('*').forEach(el => {
  const a = getComputedStyle(el).animationName;
  if (a && a !== 'none') suspects.push(el);
});
console.table([...new Set(suspects)].map(el => ({
  tag: el.tagName, id: el.id, cls: el.className,
  animation: getComputedStyle(el).animationName
})));
[...new Set(suspects)].forEach(el => el.style.outline = '2px solid red');

What to check manually: watch any flagged video, animation, or GIF and confirm it never flashes more than three times per second, and that no red/saturated flash exceeds the relative-luminance threshold — neither of which a script can verify.