Using aria-describedby for Form Error Messages
The aria-describedby attribute provides an essential
programmatic link between form input fields and descriptive text, such
as inline error messages. In modern web accessibility, visual cues like
red borders and warning icons fail to communicate context to screen
reader users on their own. By connecting an input element to the unique
identifier of an error message, aria-describedby ensures
assistive technologies read the validation feedback automatically when a
user focuses on or interacts with the invalid field.
The Purpose of aria-describedby in Forms
Standard HTML connects labels to inputs via the
<label for="..."> pairing. While this provides the
primary name of the form control, it is not designed to handle
supplementary, dynamic information such as validation constraints or
error messages.
The aria-describedby attribute accepts one or more
element IDs and establishes a relationship indicating that the
referenced elements provide additional descriptive context. When applied
to form validation, it serves as the bridge that conveys why an input is
invalid without modifying or cluttering the primary
<label>.
How It Works in Practice
Connecting an error message to a form input requires two main
components: an id on the error container and an
aria-describedby attribute on the input referencing that
id.
<label for="user-email">Email Address</label>
<input
type="email"
id="user-email"
name="email"
aria-describedby="email-error"
aria-invalid="true"
/>
<span id="email-error" class="error-message">
Please enter a valid email address including an '@' symbol.
</span>When a screen reader focuses on the input element in this example, it announces:
- The accessible name: "Email Address"
- The control type and state: "Edit text, invalid"
- The accessible description: "Please enter a valid email address including an '@' symbol."
Pairing with aria-invalid
For the most robust user experience, aria-describedby
should be paired with aria-invalid="true".
While aria-describedby provides the message content,
aria-invalid provides the state. The
aria-invalid attribute immediately notifies the user that
the field failed validation, and the description provides the
explanation and remediation instructions. Leaving out
aria-invalid can cause users to miss that an error
occurred, treating the description merely as neutral help text.
Managing Multiple Descriptions
Form fields often have both static helper text (such as formatting
requirements) and dynamic error messages. The
aria-describedby attribute accepts a space-separated list
of IDs, allowing developers to associate multiple text blocks with a
single control.
<input
type="password"
id="password"
aria-describedby="password-rules password-error"
aria-invalid="true"
/>
<span id="password-rules">Must be at least 8 characters.</span>
<span id="password-error">Password cannot contain your username.</span>In this scenario, assistive devices read both the rule and the active error message in the order the IDs are listed.
Dynamic Error Handling
When client-side validation occurs dynamically upon form submission
or blur events, the aria-describedby reference should be
updated via JavaScript:
- When valid: The field should either have
aria-invalid="false"(or omit the attribute entirely) and only reference helper text IDs. - When an error occurs: Dynamically inject the error
message container with a unique
id, append thatidto the field'saria-describedbyattribute, and setaria-invalid="true". - When corrected: Remove the error container or clear
the error ID from
aria-describedby, then resetaria-invalidto"false".
Maintaining accurate programmatic references ensures that users who rely on non-visual browsing receive immediate, relevant, and actionable feedback to successfully complete form interactions.