Forms Accessibility Checklist
Forms are one of the most common accessibility barriers on the web. This checklist covers labels, grouping, validation, error handling, and assistive technology support to ensure every user can complete your forms. Your progress is saved automatically.
Frequently asked questions
What's the biggest mistake in form accessibility?
Treating the placeholder attribute as a label. Placeholders disappear when the user starts typing, can't be reliably read by all screen readers, and often fail contrast. Every input needs a real <label> element. The Form Labeling guide covers this in depth.
Should I use inline or summary error messages?
Both. Inline messages next to each field tell users what is wrong; a summary at the top tells screen reader users that errors exist and how many. Pair each inline error with aria-describedby on the field, and put summary errors in a role="alert" region. See the Forms pattern.
When should I use fieldset and legend?
Whenever you have a group of related inputs that share context — radio button groups, checkbox groups, address blocks, name fields (first + last). The <legend> gives the group an accessible name; without it, screen readers announce each input in isolation with no context.
Should I auto-submit on input change?
Almost never. Per WCAG 3.2.2, input changes shouldn't trigger context changes (form submission, redirect, page reload) without explicit user action. Use explicit Submit buttons. Auto-saving (in place, without navigation) is fine; auto-submitting is hostile.
What's the right way to mark required fields?
Use the required attribute (programmatic) AND a visible marker like * or "(required)" text. Don't rely on color alone (red asterisk on white isn't enough). Add a key at the top of the form if you use asterisks: "Fields marked with * are required."
How do I make error messages announce to screen readers?
Wire aria-describedby on the input to the error message's id. Add aria-invalid="true" to the input. Place the error message in or near the field so it announces when the field is focused. For server-side errors arriving after submit, also put a summary at the top of the form with role="alert".