Tap target size is the minimum dimension and spacing required for an interactive element — a button, link, checkbox, or form input — to be reliably activated by a fingertip without accidental misclicks. WCAG 2.2 SC 2.5.8 (Level AA) requires touch targets to be at least 24×24 CSS pixels; the AAA criterion (SC 2.5.5) and platform guidelines (Apple, Google) recommend 44×44.
Think of a tap target like a parking space. A car will fit in a tight slot if you maneuver carefully — but every driver wants a slot wide enough that they can pull in without scraping the neighbor. Touch targets work the same way: 44×44 is the comfortable spot, 24×24 is the legal minimum, and anything smaller is the row at the back of the lot where doors get dinged.
Tap targets are one of the few accessibility issues every visitor feels — not just users with disabilities. The cost of getting it wrong is paid in lost conversions and abandoned sessions across the entire mobile audience.
WCAG runs two thresholds because real interfaces have to balance accessibility with information density. A dense data table with 12 row actions cannot put 44×44 buttons on every cell — there isn't room.
/* Default rule for every interactive element */
button,
[role="button"],
a.btn,
input[type="checkbox"],
input[type="radio"],
input[type="submit"] {
min-width: 44px;
min-height: 44px;
}
/* Compact icon button — visual icon stays 16×16, click area is 44×44 */
.icon-button {
width: 44px;
height: 44px;
display: inline-flex;
align-items: center;
justify-content: center;
padding: 14px; /* 14 + 16 + 14 = 44 */
}
/* Inline text link with extended hit area via ::before */
.inline-link {
position: relative;
padding: 4px 0;
}
.inline-link::before {
content: "";
position: absolute;
inset: -8px -4px;
}Tap-target audits run against the rendered DOM at mobile viewport widths. A target that's comfortable at desktop widths can shrink below 24×24 once the layout collapses for a phone.
The single highest-leverage fix is a global CSS rule: min-width: 44px; min-height: 44px; on buttons, role-buttons, checkboxes, radios, and standalone links. One declaration eliminates the long tail of small targets.
A 16×16 SVG icon is fine — what matters is the click area around it. Wrap each icon in a 44×44 button with internal padding. The icon stays visually crisp; the tap target stays accessible.
::before to Extend Inline Link Hit AreasInline text links can't be sized up without breaking line height. Use a transparent ::before pseudo-element with negative inset to extend the click region without changing the visible layout.
For non-inline links (a list of resources, a footer column), bumping line-height to 1.6–1.8 and giving each link 12 px of vertical padding usually clears the 24×24 minimum without any other change.
Browser-default checkboxes and radios are roughly 13×13 — well below the legal minimum. Either restyle them with a custom label wrapper that's 44×44, or apply transform: scale(1.5) with adjusted spacing.
A common bug: the button looks 44×44 but only the inner SVG receives clicks. Always attach handlers to the outer <button> element and use pointer-events: none on inner decorative children.
When a toolbar genuinely cannot fit 44×44 buttons (a rich-text editor with 15 controls), targets may be smaller than 24×24 if their centers are at least 24 CSS pixels apart. Add horizontal margin between controls so each one's "halo" never overlaps another's.
Layouts that pass at 414 px (iPhone Pro Max) often fail at 320 px (older Android). Audit at the smallest device width you support, not the most common one — that's where targets collapse.
What's happening: A row of 16×16 icons with no padding sits in the header. The visible icon is also the click target — far below the 24×24 minimum.
Fix: Wrap each icon in a 44×44 button with padding: 14px. The icon stays the same size visually; the click area expands to meet AAA.
What's happening: A footer with 12 short links separated by a single space — the tap halos overlap and users hit the wrong one.
Fix: Switch to a list with display: block per link, set padding: 12px 0, and apply a vertical separator line if the design needs it.
What's happening: Native checkboxes render at roughly 13×13. The label is large but the actual checkbox hit area is below the minimum.
Fix: Wrap the input and label in a <label> sized 44×44, with display: flex; align-items: center; so tapping anywhere on the row toggles the box.
What's happening: The button visually appears 44×44 but the onClick is bound to the SVG child, so only the inner ~16×16 area is interactive.
Fix: Move the handler to the parent <button> and add pointer-events: none to the SVG so the entire button receives the event.
WCAG, Apple, and Google each publish their own minimum. The numbers differ but the spirit is the same: comfortable targets are 44+ CSS pixels; 24×24 is the floor below which the experience breaks for too many people.
| Standard | Minimum Size | Conformance | When to Use |
|---|---|---|---|
| WCAG 2.2 SC 2.5.8 | 24×24 CSS pixels | Level AA (legal floor) | Absolute minimum for any production interface |
| WCAG 2.1 SC 2.5.5 | 44×44 CSS pixels | Level AAA (best practice) | Recommended default for primary actions |
| Apple Human Interface Guidelines | 44×44 points (iOS) | Platform guideline | iOS-first apps and web views |
| Material Design | 48×48 dp (Android) | Platform guideline | Android-first apps and PWAs |
| Spacing exception (WCAG 2.2) | Smaller allowed if 24 px clear to next center | Level AA conformant | Dense toolbars, data tables, inline links |
WCAG 2.2 SC 2.5.8 sets the legal minimum at 24×24 CSS pixels at Level AA. The Level AAA criterion (SC 2.5.5) and the platform guidelines from Apple and Google recommend 44×44 (or 48×48 dp on Android). Use 44×44 as your default; 24×24 is the floor.
The 44×44 AAA criterion existed since WCAG 2.1 (2018) but was too restrictive for compact UI like dense data tables and rich-text editor toolbars. WCAG 2.2 (October 2023) added 24×24 at Level AA to set a realistic legal floor while keeping 44×44 as the AAA best practice.
No. WCAG 2.2 explicitly exempts inline links that sit inside a paragraph of flowing text — they obviously can't be 24 px tall without breaking line spacing. The exemption applies to inline links only; standalone link lists (footers, navigation) must still meet the minimum.
Run an automated audit (Greadme deep scan, the open-source axe-corerules engine, or Chrome DevTools' Device Mode) at a 320–360 px viewport. The audit lists every element under 24×24 with its computed size. Most sites fail on icon-only buttons, default checkboxes, and tightly-packed footer links.
Yes — but only when the design genuinely cannot accommodate 44×44 controls. The exception requires that no other target sits within 24 CSS pixels of the small target's center. Add horizontal or vertical margin so each tap halo is isolated. Don't use this exception on primary actions; reserve it for dense secondary toolbars.
Indirectly. Generative answer engines preferentially cite pages that already rank well in traditional and mobile search. Google's mobile-friendly evaluation uses tap-target density as a Page Experience signal — so a failing tap-target audit drags down both your search visibility and your odds of being chosen as an AI citation.
min-height: 44px count toward WCAG even if the visible content is smaller?Yes — WCAG measures the interactive area of the target, which is the clickable bounding box, not the visible icon or label. A 16×16 icon centered in a 44×44 padded button passes both AA and AAA. What fails is when the click handler only fires inside the inner 16×16; always attach the handler to the outer 44×44 element.
Tap targets are the rare accessibility metric that pays for itself across every audience: users with motor disabilities, older users, and the entire mobile majority that drives 60%+ of web traffic. The fix is mostly mechanical — set a global min-width: 44px; min-height: 44px;, pad icon buttons to 44×44, and use ::before to extend inline link hit areas.
Run a Greadme deep scan to flag every element under 24×24 at mobile viewport, see the computed sizes and offending neighbors, and ship the fixes — most sites resolve their tap-target violations in a single CSS pull request.