Lab 07: Forms & Accessibility

Time: 30 minutes | Level: Practitioner | Docker: docker run -it --rm node:20-alpine sh

Overview

Build accessible forms using modern input types, the Constraint Validation API, ARIA attributes, focus management, and WCAG 2.2 success criteria. Forms are the most critical accessibility battleground on the web.


Step 1: Modern Input Types

<form novalidate> <!-- disable native validation UI, use custom -->

  <!-- Text types -->
  <input type="text"     autocomplete="name">
  <input type="email"    autocomplete="email">
  <input type="password" autocomplete="current-password">
  <input type="search"   role="searchbox">
  <input type="tel"      autocomplete="tel" inputmode="tel">
  <input type="url"      autocomplete="url">

  <!-- Number/Range -->
  <input type="number" min="0" max="100" step="5">
  <input type="range"  min="0" max="100" value="50" aria-label="Volume">

  <!-- Date/Time -->
  <input type="date"           min="2024-01-01" max="2024-12-31">
  <input type="time"           step="900"> <!-- 15 min steps -->
  <input type="datetime-local">
  <input type="month">
  <input type="week">

  <!-- Pickers -->
  <input type="color" value="#3b82f6">
  <input type="file"  accept="image/*" multiple>

  <!-- Hidden (no label needed) -->
  <input type="hidden" name="csrf_token" value="abc123">

</form>

💡 Use inputmode to control virtual keyboard: inputmode="numeric", inputmode="decimal", inputmode="email", inputmode="tel", inputmode="url".


Step 2: Constraint Validation API


Step 3: ARIA for Forms


Step 4: CSS States — :valid, :invalid, :focus-visible


Step 5: WCAG 2.2 Success Criteria for Forms

Key WCAG 2.2 requirements for forms:


Step 6: Complete Accessible Form Component


Step 7: Error Handling Pattern


Step 8: Capstone — Accessibility Audit

📸 Verified Output:


Summary

Feature
Implementation
WCAG

Input labels

<label for="id">

1.3.1

Error messages

role="alert" + aria-live

4.1.3

Required fields

required + aria-required

4.1.2

Error state

aria-invalid="true"

4.1.2

Error link

aria-describedby

1.3.1

Autocomplete

autocomplete="email"

1.3.5

Focus visible

:focus-visible outline

2.4.7

Group labels

<fieldset><legend>

1.3.1

Keyboard only

:focus:not(:focus-visible)

2.4.7

Last updated