Photosensitive epilepsy affects roughly 1 in 4,000 people; 3-5% of people with epilepsy are photosensitive
2.3.1 Three Flashes or Below Threshold
In Plain Language
2.3.1 Three Flashes or Below Threshold (Level A) is a physical-safety criterion: a page must not contain anything that flashes more than three times in any one-second window unless the flashing stays below both the general flash threshold and the red flash threshold defined by WCAG[1]. Failing this criterion can trigger a tonic-clonic seizure in a photosensitive viewer. This is not a usability finding.
A "flash" is a pair of opposing changes in relative luminance. The general flash threshold fires when those luminance swings exceed 10% of maximum relative luminance, the darker image sits below 0.80 relative luminance, and the contiguous flashing area occupies more than 0.006 steradians within any 10-degree visual field -- roughly 25% of any 10-degree visual field on a typical display. The red flash threshold fires on any opposing transition involving a saturated red (R/(R+G+B) ≥ 0.8) at more than three transitions per second, and is stricter because saturated-red flashes are disproportionately seizurogenic.
Why It Matters
- Photosensitive epilepsy affects roughly 3 to 5% of people with epilepsy, or about 1 in 4,000 people overall[2]. A flash sequence that clears both the rate threshold (more than three per second) and the area threshold can induce a tonic-clonic seizure on first exposure, before the viewer has any way to know the content is unsafe.
- Unlike every other WCAG criterion, 2.3.1 failures can cause direct physical harm. A single autoplaying promo reel or loading animation that trips both thresholds is sufficient to hospitalise a viewer. Treat it as a safety defect, not an accessibility finding.
- Sub-threshold flashing that does not trigger seizures still causes migraine aura, vestibular symptoms, and nausea in viewers with migraine disorders and vestibular conditions. 2.3.1 is the seizure floor, not the comfort ceiling -- 2.2.2 Pause, Stop, Hide covers distraction and motion discomfort separately[3].
- Manual inspection cannot reliably judge borderline content. Luminance deltas, chromaticity differences, and steradian coverage require the waveform analysis that WCAG references through PEAT (the Photosensitive Epilepsy Analysis Tool from the Trace Center). Eyeballing a video is not a pass condition.
Examples
Alert banner using a gentle fade transition:
transition: opacity 0.5s ease-in-out;
/* Smooth fade -- no flashing */
✔ Gradual transitions do not count as flashes and are safe for all users
<!-- Safe: smooth fade animation -->
<style>
.alert-banner {
transition: opacity 0.5s ease-in-out;
}
.alert-banner.visible {
opacity: 1;
}
.alert-banner.hidden {
opacity: 0;
}
</style>
<div class="alert-banner visible" role="alert">
New messages available
</div>
Small indicator light (under 21,824 sq px):
<span class='status-dot blink'></span>
/* 10x10px area -- well below threshold */
✔ Flashing area is small enough to fall below the general flash threshold
<!-- Safe: flashing area is tiny (10x10px) -->
<style>
.status-dot {
display: inline-block;
width: 10px;
height: 10px;
border-radius: 50%;
background: #22c55e;
}
.status-dot.blink {
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.4; }
}
</style>
<span class="status-dot blink"
aria-label="System online"></span>
Full-page strobe effect on page load:
@keyframes strobe {
0%, 100% { background: #000; }
50% { background: #fff; }
} /* animation-duration: 0.2s */
✘ Flashing 5 times per second across the entire viewport -- seizure risk
Auto-playing video with rapid scene changes:
<video autoplay>
<source src='promo-reel.mp4'>
</video>
✘ Video content was not analyzed for flash frequency -- could exceed three flashes per second
How to Fix It
- Default to no flashing. Replace strobes, rapid cuts, and on/off toggles with timed opacity transitions, slides, or cross-fades. A gradual luminance change is not a flash under the WCAG definition and has no rate limit.
- If flashing is unavoidable, cap the rate at three per second. Count opposing luminance transitions, not frames. Three complete light-dark-light cycles in any one-second sliding window is the hard ceiling; design to stay under it, not at it.
- Alternatively, stay below the area threshold. A contiguous flashing region smaller than 0.006 steradians of the viewer's 10-degree visual field -- roughly 25% of that field -- does not trip the general flash threshold regardless of rate. Small status indicators and cursor blinks fall well under this. The threshold is defined in steradians, not pixels, so a finding that passes on a 1080p desktop can fail on a phone held closer to the face.
- Treat saturated red as a separate, stricter axis. The red flash threshold fires on any opposing transition involving a saturated red (R/(R+G+B) ≥ 0.8) at more than three transitions per second. Saturated-red strobes are disproportionately linked to seizure induction and get no area-based safe harbour in practice -- avoid them.
- Run third-party video and animation through PEAT before publishing. The Trace Center Photosensitive Epilepsy Analysis Tool performs the waveform analysis 2.3.1 references. Stock footage, user-generated uploads, and promotional reels should all be analysed; do not rely on visual review. If PEAT flags a sequence, the fix is to cut or re-encode the clip, not to add a warning.
- Do not conflate 2.3.1 with 2.2.2 Pause, Stop, Hide. 2.2.2 lets users stop moving, blinking, or auto-updating content to reduce distraction[3]. 2.3.1 is a hard prohibition on seizure-inducing content regardless of whether a control exists -- a "Stop animation" button does not make a strobing hero section conformant.
References
- [1] W3C (2023). Understanding Success Criterion 2.3.1: Three Flashes or Below Threshold. W3C, Accessed 2026-04-07. https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html ↩
- [2] Epilepsy Action (2024). Photosensitive epilepsy. Epilepsy Action (British Epilepsy Association), Accessed 2026-04-07. https://www.epilepsy.org.uk/info/photosensitive-epilepsy ↩
- [3] W3C (2023). Understanding Success Criterion 2.2.2: Pause, Stop, Hide. W3C, Accessed 2026-04-07. https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html ↩ ↩