WCAG 2.5.8 Target Size, including the exceptions everyone skips
The criterion is four lines long. The exceptions are why your site probably already passes, and why most scanners say it does not.
What it requires
2.5.8 Target Size (Minimum) — Level AA. The size of the target for pointer inputs is at least 24 by 24 CSS pixels, except when: Spacing, Equivalent, Inline, User agent control, Essential.
A target is the region that accepts a pointer action — a button, a link, a checkbox, anything you can click or tap. The measurement is in CSS pixels, so it is unaffected by device pixel ratio, and it applies to both dimensions: 40 by 20 fails.
The reason is not aesthetic. People with tremor, people using a touchscreen on a moving train, people with limited fine motor control and anyone with large fingers all miss small targets, and missing a target is not merely annoying — it activates whatever is next to it.
The five exceptions
These are normative. A target that meets any one of them conforms, regardless of its size. Most explanations of 2.5.8 mention that the exceptions exist and move on, which is roughly where the trouble starts.
1. Spacing — the one that matters
Undersized targets (those less than 24 by 24 CSS pixels) are positioned so that if a 24 CSS pixel diameter circle is centered on the bounding box of each, the circles do not intersect another target or the circle for another undersized target.
Read that carefully, because it is doing more work than it looks. The test is not "is the target big enough". It is "is there room to miss". A 20×20 icon button floating alone in a toolbar margin passes. Three 20×20 buttons packed two pixels apart fail — not because any one of them is small, but because missing one hits another.
In practice this means the fix is usually spacing, not size. Adding margin is cheaper than redesigning a control, and it addresses the actual harm: hitting the wrong thing.
2. Equivalent
The function can be achieved through a different control on the same page that meets this criterion.
A tiny "×" in the corner of a dialog conforms if there is also a full-size Cancel button doing the same job. The alternative has to be on the same page and genuinely equivalent — a link to a different page that eventually offers the same function does not count.
3. Inline
The target is in a sentence or its size is otherwise constrained by the line-height of non-target text.
A link inside a paragraph is exempt. Its height is set by the line height of the prose around it, and the author cannot enlarge it without breaking the text.
The limit of this exception is "non-target text". A link sitting alone in a list item is not in a sentence, and nothing constrains its height except a choice the author made. Stacked 19-pixel card titles are the common case here, and they are not exempt on the inline clause — though they very often are exempt on spacing, which is why they usually still pass.
4. User agent control
The size of the target is determined by the user agent and is not modified by the author.
A default, unstyled <input type="checkbox"> is
whatever the browser makes it. Style it — even a little — and you own
the size again.
5. Essential
A particular presentation of the target is essential or is legally required for the information being conveyed.
The narrowest of the five. A pin on a map has to sit where the place is; a word in a document being annotated has to stay where the word is. "Our design system says so" is not essential.
Worked examples
A 20×20 icon button in a header, with 16 pixels of margin on every side. Undersized, but the 24px circles reach nothing. Spacing.
A toolbar of three 16×16 formatting buttons with a 2-pixel gap. The circles overlap heavily, and missing bold gets you italic.
"Read our methodology before starting." The link is 19 pixels tall because the paragraph is. Inline.
A vertical list of 19-pixel-tall links with no vertical padding, each 8 pixels from the next. Not a sentence, and the circles intersect.
A 14×14 close button on a toast, where the toast also has a full-size "Dismiss" button. Equivalent.
Why scanners get this wrong
Implementing the size check is trivial: read
getBoundingClientRect(), compare against 24. Implementing
the Spacing exception means measuring every other target on the page
and doing geometry. Plenty of tools skip it.
The result is not a slightly noisy report. It is a flood. When we first ran our own checker against gov.uk — a site with a long public record of taking accessibility seriously — it reported 72 violations, nearly all of them target size. Every one was ours, not theirs. With the Spacing exception implemented, the same page reports zero.
If a tool tells you that gov.uk fails 72 times, the tool is wrong. That is worth remembering generally: when an automated report contradicts a site with genuine accessibility expertise behind it, check the tool before you check the site.
Two smaller traps are worth knowing, because both produce confident nonsense:
- Zero-area elements. A link inside a collapsed panel can measure 320×0. It is not a target that is too small; it is not a target at all. Reporting "320×0px, below the minimum" describes a box, not a hit area.
- Wrapper elements. A block-level link whose own box has no height still receives clicks on the image inside it. The hittable region is the union of the element and its rendered descendants, not the element alone.
How to check your own pages
- Find the small targets first. In DevTools, hovering an element shows its box dimensions; anything under 24 in either direction is a candidate.
- For each candidate, ask the questions in order: is it in a sentence? Is there an equivalent full-size control? Is it unstyled browser furniture? If not, measure the gap to its nearest neighbour.
- Test with a pointer, not a mouse pointer. Use a touchscreen, or enable touch emulation, and try to hit each control quickly without looking directly at it.
A11yScope implements 2.5.8 with the Spacing and Inline exceptions, and reports cases it cannot decide — an off-screen control measured while hidden, for instance — as needing review rather than failing them.
2.5.8 and 2.5.5 are different criteria
| Criterion | Level | Size | Exceptions |
|---|---|---|---|
| 2.5.8 Target Size (Minimum) | AA | 24 × 24 | Spacing, Equivalent, Inline, User agent control, Essential |
| 2.5.5 Target Size (Enhanced) | AAA | 44 × 44 | Fewer — no spacing exception |
If someone tells you targets must be 44 pixels to conform, they are quoting the AAA criterion. For AA — which is what the European Accessibility Act and most procurement requirements point at — the number is 24, and the exceptions are real.