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
| 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
- Remove or slow any content that flashes more than three times per second.
- Re-edit offending video or animation so luminance and red transitions stay below threshold; verify with PEAT.
- Avoid large areas of high-contrast or saturated-red strobing entirely.
- 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
// 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.