2.3.2 Three Flashes
What it requires
Web pages must not contain anything that flashes more than three times in any one-second period — full stop. Unlike its Level A sibling 2.3.1 (which exempts small or low-contrast flashes that stay under the general and red flash thresholds), 2.3.2 is absolute: no flash faster than three times per second is allowed at all, regardless of the flashing area's size or contrast. A "flash" is a pair of opposing changes in relative luminance. This eliminates the risk of triggering photosensitive seizures with no exceptions.
People with photosensitive epilepsy and related seizure disorders, for whom rapidly flashing content can trigger a seizure. It also affects people with vestibular disorders, migraine, or attention and concentration differences, who can be disoriented or made unwell by aggressive flashing. Because a seizure is a direct physical harm, this is one of the few criteria where a failure can injure a user immediately.
How to detect it
| Check | How | Catches it? |
|---|---|---|
| Manual review | Watch all animations, video, GIFs, canvas/WebGL and ads for any flashing; count flashes per second. | Primary method. |
| Flash analysis tool | Run recorded video/content through PEAT (Photosensitive Epilepsy Analysis Tool) or the Harding test. | Definitive for measured content. |
| Keyboard / screen reader | Not applicable — this is a visual-timing issue, not a focus or name issue. | No. |
| Zoom / reflow | Not relevant to flashing. | No. |
| Automated (axe, etc.) | Cannot measure luminance flashing over time. | No — manual or PEAT only. |
How to fix it
- Identify every flashing element — animations, autoplaying video, GIFs, scripted effects, and third-party ads.
- Slow or remove the flashing so it occurs no more than three times per second, or replace it with a static or gently animated alternative.
- For video, re-edit the offending frames or supply a non-flashing version.
- Honour the user's
prefers-reduced-motionsetting and stop non-essential motion entirely.
<style>
@media (prefers-reduced-motion: reduce) {
.banner-flash { animation: none; }
}
</style>
Copy-paste tests
Automated coverage
There is no fully automated axe-core rule for 2.3.2 Three Flashes: flash frequency and brightness must be measured against the general/red flash thresholds, which a static scan cannot do. This criterion needs manual review using the console check and steps below.
Run this in the browser console
// Read-only: surface animated/video/canvas nodes that may flash.
const suspects = [...document.querySelectorAll('*')].filter(el => {
const s = getComputedStyle(el);
const animated = s.animationName !== 'none' || s.transitionDuration !== '0s';
return animated || ['VIDEO','CANVAS','SVG'].includes(el.tagName);
});
suspects.forEach(el => { el.style.outline = '2px solid magenta'; });
console.table(suspects.map(el => ({
tag: el.tagName,
id: el.id,
cls: el.className,
animation: getComputedStyle(el).animationName
})));
console.log('Review each for >3 flashes/sec:', suspects);
What to check manually: Watch each flagged element in real time and confirm nothing flashes more than three times per second; for any flash, verify it stays below the general and red flash thresholds (small, dim area). No script can confirm perceived brightness or actual flash rate.
Related
- All WCAG 2.2 success criteria
- Learn catalog
- Dynamic content & motion — reducing and gating motion safely.