Touch Target Size & Spacing Checker
Check targets against WCAG 2.2, plus why the 24 pixel rule is really about centre distance and why smaller icons save no space at all.
The solid squares are the targets and the dashed circles are the 24-pixel circles the spacing exception draws around them. Where two circles overlap, the pair fails. Nothing is uploaded.
The 24-pixel rule is a rule about centre distance
WCAG 2.2 asks for 24 by 24 CSS pixels, then lets anything smaller through if a 24-pixel-diameter circle centred on it clears its neighbours' circles. Two circles of radius 12 miss exactly when their centres are 24 apart — so the exception is a statement about centre-to-centre distance, and a small target is fine as long as it is far enough away from the next one.
| Target | Passes on size? | Gap it needs | Centre distance | Passes AAA (44px)? |
|---|---|---|---|---|
| 8px | no | 16px | 24px | no |
| 12px | no | 12px | 24px | no |
| 16px | no | 8px | 24px | no |
| 20px | no | 4px | 24px | no |
| 24px | yes | 0px | 24px | no |
| 32px | yes | 0px | 32px | no |
| 44px | yes | 0px | 44px | yes |
Every pixel taken off the target has to come back as a pixel of gap — not roughly, exactly. A target at or above 24 needs no gap at all. And the AAA criterion at 44 pixels carries no spacing exception, which is why the two numbers are not two opinions about the same thing.
So conformance is a property of the layout, not the button
The same control passes in one arrangement and fails in another, with nothing about the control changed. Which is why "is this button big enough" cannot be answered by looking at the button, and why a component library cannot promise conformance on its own.
| Arrangement | Centre distance | Result |
|---|---|---|
| 16px targets, 4px gap | 20px | fails |
| 16px targets, 8px gap | 24px | passes |
| 16px targets, 12px gap | 28px | passes |
| 20px targets, 4px gap | 24px | passes |
| 24px targets, 0px gap | 24px | passes |
The distance is measured centre to centre rather than edge to edge, and the circle is a circle — vertical separation counts exactly as much as horizontal, and a diagonal neighbour is measured diagonally. A target with nothing near it passes at any size at all.
A row of small targets is not actually smaller
Because the shortfall comes straight back as required gap, shrinking the icons reclaims almost nothing. A row of 5 conforming targets is 120px wide at 24px each and 104px at 8px each.
| Target | Gap needed | Row of 5 | Per target |
|---|---|---|---|
| 8px | 16px | 104px | 20.8px |
| 12px | 12px | 108px | 21.6px |
| 16px | 8px | 112px | 22.4px |
| 20px | 4px | 116px | 23.2px |
| 24px | 0px | 120px | 24px |
The width has a closed form: 24 × n, minus the one gap that is not needed after the last target. So shrinking an icon buys back its own missing gap once, and nothing after that. Reducing a 24px icon to 8px across 5 targets saves 16px in total — while making every one of them harder to hit.
What size buys in speed
Fitts's law puts movement time at a + b·log₂(D/W + 1). Bigger is faster, but logarithmically, so doubling a target does not halve the time to hit it — and the second doubling buys less than the first.
| Target | Index of difficulty | Movement time at 300px |
|---|---|---|
| 8px | 5.27 | 840ms |
| 12px | 4.70 | 755ms |
| 16px | 4.30 | 696ms |
| 20px | 4.00 | 650ms |
| 24px | 3.75 | 613ms |
| 32px | 3.38 | 556ms |
| 44px | 2.97 | 495ms |
Only the ratio D/W matters, so halving the distance and doubling the size are worth exactly the same — moving a control closer is as good as making it bigger. The constants here are ordinary values for a finger or mouse and are meant to show the shape of the curve, not to predict anyone's actual milliseconds.
How to use
- Set a target size, a gap and how many there are.
- The verdict says whether the row conforms.
- Dashed circles show the 24 pixel spacing rule.
- Overlapping circles mean the pair fails.
Frequently asked questions
How big does a tap target need to be?
WCAG 2.2 asks for 24 by 24 CSS pixels at level AA, but it carries a spacing exception, so smaller is allowed when the targets are far enough apart. Level AAA asks for 44 by 44 and has no such exception, which is why the two numbers are not two opinions about the same thing.
What exactly is the spacing exception?
A 24 pixel diameter circle centred on each target must not overlap another target’s circle. Two circles of radius 12 miss exactly when their centres are 24 apart, so the exception is really a statement about centre-to-centre distance rather than about the gap you can see.
So can a 16 pixel button pass?
Yes, with at least 8 pixels of gap, because 16 plus 8 puts the centres 24 apart. Every pixel taken off the target has to come back as a pixel of gap — exactly one for one, not approximately.
Can I tell whether a control conforms by looking at it?
No, and this is the practical consequence. The same 16 pixel icon passes with 8 pixels of gap and fails with 4, with nothing about the control changed. Conformance is a property of the layout, which is also why a component library cannot promise it on its own.
Do smaller icons save space?
Almost none, while you still conform. The missing pixels come straight back as required gap, so a row of five targets is 120 pixels wide at 24 pixels each and 104 at 8 pixels each. Shrinking by two thirds saves 16 pixels in total and makes every target harder to hit.
Is the distance measured between edges or centres?
Centres, and the difference matters. Two 20 pixel targets with only 4 pixels of visible gap have centres exactly 24 apart and pass. The circle is also a circle, so vertical separation counts the same as horizontal and a diagonal neighbour is measured diagonally.
How much faster is a bigger target?
Logarithmically faster, by Fitts’s law: movement time is a constant plus another constant times the log of distance over width plus one. Doubling a target does not halve the time to hit it, and the second doubling buys less than the first. Only the ratio matters, so moving a control closer is worth as much as making it bigger.
Does this send anything anywhere?
No. Everything is computed in your browser, and nothing is uploaded.
🔒 This tool runs entirely in your browser. Nothing you enter is uploaded, logged, or stored.