Skip to content

Touch Targets and Pointer Accessibility — Complete Guide

DodaTech Updated 2026-06-28 6 min read

In this tutorial, you will learn about Touch Targets and Pointer Accessibility. We cover key concepts, practical examples, and best practices to help you master this topic.

Touch targets must be large enough at 44x44 CSS pixels minimum, well-spaced with adequate gaps, and provide clear visual feedback for users with motor disabilities using touch, pointer, or stylus input.

What You'll Learn

  • WCAG 2.2 target size requirements (minimum 24x24, recommended 44x44)
  • Spacing between interactive elements
  • Visual feedback for touch interactions
  • Pointer interactions and hover management
  • Stylus and switch device considerations

Why It Matters

  • Users with motor tremors find small targets difficult to tap
  • Close spacing causes accidental activation
  • Missing feedback leaves users unsure if their tap registered
  • WCAG 2.2 introduced specific target size criteria

Real-World Use

  • A calculator app uses large, well-spaced buttons
  • A form has adequate spacing between radio buttons
  • A navigation menu uses padding to increase tap area
  • A game provides 44px minimum for all action buttons
flowchart LR
  A[Touch Target] --> B{Size Check}
  B --> C[>= 44x44px]
  B --> D[< 44x44px]
  C --> E[Adequate Spacing]
  D --> F[Add Padding or Increase]
  E --> G[Clear Feedback]
  F --> G
  G --> H[Accessible Interaction]

Understanding Target Size

Target size is about the hit area of interactive elements, not just the visual size. A small icon can have a large tap area through padding.

Inline Elements and Target Size

Inline elements like links within text are exempt from the 24x24 minimum because they cannot be enlarged without breaking text flow. However, standalone interactive elements like buttons and navigation links must meet the requirements.

Code Example: Padding for Adequate Targets

<style>
    /* Small icon with large tap area */
    .icon-button {
        min-width: 44px;
        min-height: 44px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
        padding: 12px;
        background: transparent;
        border: none;
        cursor: pointer;
        position: relative;
    }

    .icon-button svg {
        width: 20px;
        height: 20px;
    }

    /* Link with adequate padding */
    .nav-link {
        display: inline-flex;
        align-items: center;
        padding: 12px 16px;
        min-height: 44px;
    }

    /* Radio and checkbox with larger hit areas */
    .custom-radio label,
    .custom-checkbox label {
        display: inline-flex;
        align-items: center;
        min-height: 44px;
        padding: 8px 12px;
        gap: 8px;
        cursor: pointer;
    }

    /* Dropdown option */
    select option {
        padding: 8px;
    }

    /* Form inputs */
    input[type="text"],
    input[type="email"],
    input[type="password"] {
        min-height: 44px;
        padding: 8px 12px;
    }

    /* Buttons */
    .btn {
        min-height: 44px;
        min-width: 44px;
        padding: 12px 24px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }
</style>

<nav>
    <a href="/" class="nav-link">Home</a>
    <a href="/products" class="nav-link">Products</a>
    <a href="/about" class="nav-link">About</a>
</nav>

<button class="icon-button" aria-label="Notifications">
    <svg viewBox="0 0 24 24" width="20" height="20">
        <path d="M12 22c1.1 0 2-.9 2-2h-4c0 1.1.89 2 2 2zm6-6v-5c0-3.07-1.64-5.64-4.5-6.32V4c0-.83-.67-1.5-1.5-1.5s-1.5.67-1.5 1.5v.68C7.63 5.36 6 7.92 6 11v5l-2 2v1h16v-1l-2-2z"/>
    </svg>
</button>

Expected output: Each interactive element has a minimum 44px height and adequate width. The small notification icon has a 44x44 tap area through padding.

Code Example: Spacing Between Targets

<style>
    /* Adequate spacing between interactive elements */
    .button-group {
        display: flex;
        flex-wrap: wrap;
        gap: 16px;  /* Minimum 4px gap between targets */
    }

    .nav-list {
        display: flex;
        gap: 4px;  /* Absolute minimum gap */
    }

    .form-group {
        display: flex;
        flex-direction: column;
        gap: 8px;
    }

    .radio-group {
        display: flex;
        flex-direction: column;
        gap: 4px;  /* Vertical gap between radio buttons */
    }

    /* Inline text link spacing */
    .text-content {
        line-height: 1.8;  /* Taller line height creates more spacing between inline links */
    }

    /* Card with multiple actions */
    .product-card {
        display: grid;
        gap: 12px;
    }

    .card-actions {
        display: flex;
        gap: 12px;
    }
</style>

Expected output: Touch targets have adequate spacing between them, reducing accidental taps. The 16px gap in button groups prevents one button from being tapped when aiming for an adjacent one.

Code Example: Touch Feedback

<style>
    /* Visual feedback for touch/click */
    .btn {
        transition: transform 0.1s, box-shadow 0.1s;
        -webkit-tap-highlight-color: rgba(0, 86, 179, 0.3);
    }

    /* Touch feedback on mobile */
    .btn:active {
        transform: scale(0.97);
        box-shadow: 0 1px 3px rgba(0,0,0,0.2);
    }

    /* Hover for desktop */
    .btn:hover {
        background: #e8e8e8;
    }

    /* Focus for keyboard */
    .btn:focus-visible {
        outline: 3px solid #0056B3;
        outline-offset: 2px;
    }

    /* Active/toggle state */
    .btn[aria-pressed="true"] {
        background: #0056B3;
        color: white;
    }

    /* Form input feedback */
    input:focus {
        border-color: #0056B3;
        box-shadow: 0 0 0 3px rgba(0, 86, 179, 0.2);
    }

    input:invalid {
        border-color: #C62828;
    }

    input:valid {
        border-color: #2E7D32;
    }
</style>

<button class="btn" onclick="submitForm()">Submit Order</button>

Expected output: Tapping a button provides immediate visual feedback (slight scale down and shadow). The user knows the tap registered. The feedback is fast enough (under 100ms) to feel responsive.

Common Mistakes

  1. Small touch targets — Buttons, links, and form controls under 44px are difficult to tap for users with motor disabilities.
  2. Touching targets too close together — When targets are flush or have less than 4px gap, users easily tap the wrong element.
  3. No touch feedback — Users are unsure if their tap registered. Visual feedback (color change, scale) within 50ms of touch is essential.
  4. Hover-only states on mobile — Hover does not exist on touch devices. Do not rely on hover to reveal information or functionality.
  5. Using click events on mobile without touch consideration — There is a 300ms delay on some mobile browsers for click events. Use touch events or pointer events for faster response.
  6. Inline links without adequate line height — Links close together in dense text are hard to tap individually.
  7. Custom scrollable containers without pointer support — Custom scroll areas must support both touch and pointer scrolling.

Practice Questions

  1. What is the minimum target size recommended by WCAG 2.2? 24x24 CSS pixels minimum, with 44x44 recommended.
  2. Are inline links within paragraphs exempt from target size requirements? Yes, because they cannot be enlarged without breaking text flow.
  3. What is the minimum gap between adjacent touch targets? 4 CSS pixels (WCAG 2.2 Target Spacing).
  4. Why should hover-only states be avoided on mobile? There is no hover state on touch devices. Information or functionality revealed by hover must be available on tap or click.
  5. Challenge: Build a mobile calculator app interface with all touch targets at least 44x44px, adequate spacing between buttons (including the equals, add, subtract buttons), visual touch feedback, and support for both portrait and landscape orientations. Test with actual touch input.

FAQ

Does the 44px target apply to all interactive elements?

It applies to buttons, links, form controls, and custom interactive elements. It does not apply to inline links in paragraphs or elements that cannot be enlarged without breaking content.

Can I use padding to increase target size without changing visual size?

Yes. A 24px visual icon with 10px padding on each side creates a 44px target. The padding increases the hit area without changing the visual appearance.

How do I handle close-together links in navigation?

Use display: flex with gap, or add padding to each link. Ensure there is at least 4px between the edges of adjacent touch targets.

What is the -webkit-tap-highlight-color property?

It controls the highlight color that appears on mobile Safari and Chrome when a user taps an element. Customize it to match your design while still providing feedback.

Do disabled buttons need to meet target size?

Yes. Even disabled buttons should be large enough to tap when they become enabled. However, the spacing requirement does not apply to disabled elements.

Mini Project

Build a mobile-friendly music player interface. The controls must include: play/pause (44x44 minimum), next/previous (44x44), volume slider (large enough drag handle), progress bar (with adequate touch area), shuffle and repeat toggle buttons. Ensure all targets have adequate spacing (minimum 4px gap), visual touch feedback (color change or scale on tap), no hover-dependent controls, and proper aria-labels for all icon-only buttons. Test on an actual mobile device with touch input.

What's Next

Continue with Lesson 24: Voice Control Accessibility to learn how users with motor disabilities navigate using voice commands.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro