Imagine filling out an important application form, spending time carefully entering your information, only to discover after clicking submit that you missed several required fields—and there was no clear way to know which fields were mandatory beforehand. This frustrating experience is exactly what happens when forms don't properly communicate which fields are required to all users.
ARIA required is an HTML attribute (aria-required="true"
) that programmatically indicates to assistive technologies that a form field must be filled out before the form can be submitted. While visual users might see asterisks or other visual cues, screen reader users rely on these ARIA attributes to understand which fields are mandatory.
Properly indicating required fields serves several critical functions that benefit all users:
Without proper required field marking, forms become guessing games that frustrate users and often result in incomplete submissions or abandoned tasks.
Many forms have "hidden requirements"—fields that must be completed but aren't clearly marked as required. This creates a particularly frustrating experience for screen reader users who may complete what they think is the entire form, only to encounter validation errors that force them to hunt for missing required fields.
There are two main ways to mark fields as required, each serving different purposes:
The HTML required
attribute provides both semantic meaning and browser validation.
<!-- HTML required attribute -->
<label for="email">Email address</label>
<input type="email" id="email" name="email" required>
<label for="password">Password</label>
<input type="password" id="password" name="password" required>
<label for="country">Country</label>
<select id="country" name="country" required>
<option value="">Select your country</option>
<option value="us">United States</option>
<option value="ca">Canada</option>
</select>
<!-- Required textarea -->
<label for="message">Message</label>
<textarea id="message" name="message" required></textarea>
<!-- Required checkbox -->
<label>
<input type="checkbox" name="terms" required>
I agree to the terms and conditions
</label>
The aria-required
attribute provides semantic information to assistive technologies without affecting browser validation.
<!-- ARIA required for custom validation -->
<label for="phone">Phone number</label>
<input type="tel" id="phone" name="phone" aria-required="true">
<label for="birth-date">Date of birth</label>
<input type="date" id="birth-date" name="birthDate" aria-required="true">
<!-- Custom form controls -->
<div role="group" aria-labelledby="address-heading">
<h3 id="address-heading">Address</h3>
<label for="street">Street address</label>
<input type="text" id="street" name="street" aria-required="true">
<label for="city">City</label>
<input type="text" id="city" name="city" aria-required="true">
</div>
<!-- When using custom validation -->
<label for="username">Username</label>
<input type="text"
id="username"
name="username"
aria-required="true"
aria-describedby="username-requirements">
<div id="username-requirements">
Must be 3-20 characters, letters and numbers only
</div>
<!-- Best practice: Use both for maximum compatibility -->
<label for="full-name">Full name</label>
<input type="text"
id="full-name"
name="fullName"
required
aria-required="true">
<!-- HTML required alone (modern browsers with standard validation) -->
<label for="email-simple">Email address</label>
<input type="email" id="email-simple" name="email" required>
<!-- ARIA required alone (custom validation or non-standard controls) -->
<label for="custom-field">Custom field</label>
<div role="textbox"
contenteditable="true"
aria-required="true"
aria-label="Custom input field">
</div>
<!-- Group-level requirements -->
<fieldset aria-required="true">
<legend>Contact method (choose at least one)</legend>
<label>
<input type="checkbox" name="contact" value="email">
Email notifications
</label>
<label>
<input type="checkbox" name="contact" value="sms">
SMS notifications
</label>
</fieldset>
Effective required field implementation combines visual, programmatic, and contextual indicators:
Combine visual cues with programmatic attributes to serve all users.
<!-- Asterisk with proper labeling -->
<label for="first-name">
First name <span class="required" aria-label="required">*</span>
</label>
<input type="text" id="first-name" name="firstName" required aria-required="true">
<!-- Text-based indicator -->
<label for="last-name">Last name (required)</label>
<input type="text" id="last-name" name="lastName" required aria-required="true">
<!-- Combined approach with styling -->
<label for="phone-number" class="required-field">
Phone number <span class="required-indicator" aria-label="required">*</span>
</label>
<input type="tel" id="phone-number" name="phone" required aria-required="true">
Provide clear explanation of how required fields are marked at the beginning of forms.
<!-- Clear form instructions -->
<form>
<div class="form-instructions">
<p>Fields marked with <span class="required-indicator" aria-label="required">*</span> are required.</p>
</div>
<div class="form-group">
<label for="company-name">
Company name <span class="required-indicator" aria-label="required">*</span>
</label>
<input type="text" id="company-name" name="companyName" required aria-required="true">
</div>
<div class="form-group">
<label for="industry">Industry (optional)</label>
<select id="industry" name="industry">
<option value="">Select industry</option>
<option value="tech">Technology</option>
<option value="finance">Finance</option>
</select>
</div>
<div class="form-group">
<label for="contact-email">
Contact email <span class="required-indicator" aria-label="required">*</span>
</label>
<input type="email" id="contact-email" name="contactEmail" required aria-required="true">
</div>
</form>
When groups of fields have requirements, mark the group appropriately.
<!-- Required group with individual optional fields -->
<fieldset class="required-group">
<legend>
Contact information
<span class="required-indicator" aria-label="required">*</span>
</legend>
<p class="group-instructions">At least one contact method is required.</p>
<label for="work-email">Work email (optional)</label>
<input type="email" id="work-email" name="workEmail">
<label for="work-phone">Work phone (optional)</label>
<input type="tel" id="work-phone" name="workPhone">
<label for="mobile-phone">Mobile phone (optional)</label>
<input type="tel" id="mobile-phone" name="mobilePhone">
</fieldset>
<!-- Required choice from radio group -->
<fieldset>
<legend>
Preferred contact method
<span class="required-indicator" aria-label="required">*</span>
</legend>
<label>
<input type="radio" name="contactMethod" value="email" required>
Email
</label>
<label>
<input type="radio" name="contactMethod" value="phone" required>
Phone
</label>
<label>
<input type="radio" name="contactMethod" value="mail" required>
Postal mail
</label>
</fieldset>
Avoid these frequent problems that undermine required field accessibility:
What's happening: Required fields are marked with asterisks or styling but lack programmatic indicators for screen readers.
Simple solution: Always combine visual indicators with ARIA or HTML required attributes:
<!-- Bad: Only visual indicator -->
<label for="email-bad">Email address *</label>
<input type="email" id="email-bad" name="email">
<!-- Good: Visual and programmatic indicators -->
<label for="email-good">
Email address <span aria-label="required">*</span>
</label>
<input type="email" id="email-good" name="email" required aria-required="true">
What's happening: Some required fields are marked while others aren't, or different marking methods are used inconsistently.
Simple solution: Establish and follow consistent patterns throughout all forms:
<!-- Bad: Inconsistent marking -->
<label for="name-bad">Name *</label>
<input type="text" id="name-bad" required>
<label for="email-bad2">Email address (required)</label>
<input type="email" id="email-bad2" aria-required="true">
<label for="phone-bad">Phone</label>
<input type="tel" id="phone-bad" required>
<!-- Good: Consistent marking -->
<label for="name-good">Name <span aria-label="required">*</span></label>
<input type="text" id="name-good" required aria-required="true">
<label for="email-good2">Email address <span aria-label="required">*</span></label>
<input type="email" id="email-good2" required aria-required="true">
<label for="phone-good">Phone <span aria-label="required">*</span></label>
<input type="tel" id="phone-good" required aria-required="true">
What's happening: Required fields are indicated only through color changes, which isn't accessible to users with color vision deficiencies.
Simple solution: Use multiple indicators including text, symbols, and programmatic attributes:
<!-- Bad: Color only -->
<label for="address-bad" style="color: red;">Address</label>
<input type="text" id="address-bad" required>
<!-- Good: Multiple indicators -->
<label for="address-good" class="required-field">
Address <span class="required-indicator" aria-label="required">*</span>
</label>
<input type="text" id="address-good" required aria-required="true">
What's happening: Using invalid values for aria-required or inconsistent boolean values.
Simple solution: Use only "true" or "false" values for aria-required:
<!-- Bad: Invalid values -->
<input type="text" id="bad1" aria-required="yes">
<input type="email" id="bad2" aria-required="required">
<input type="tel" id="bad3" aria-required="1">
<!-- Good: Valid boolean values -->
<input type="text" id="good1" aria-required="true">
<input type="email" id="good2" aria-required="true">
<input type="tel" id="good3" aria-required="false">
Regular testing ensures your required field indicators work effectively for all users:
Properly marking required fields delivers significant business benefits:
These benefits compound to create forms that serve business objectives more effectively while providing inclusive experiences for all users.
Different types of forms require specific approaches to required field indication:
In each case, the key is balancing completeness with user autonomy, making it clear what's essential while respecting users' privacy preferences and time constraints.
Clear required field indicators represent a fundamental principle of respectful user interaction: transparency about expectations. When you clearly communicate what information is required, you empower users to make informed decisions about how to engage with your forms and whether to complete them.
What makes required field indication particularly important is its role in creating equitable form experiences. All users—regardless of their abilities, technologies, or interaction preferences—deserve to understand form requirements before investing time in completion. Hidden or unclear requirements create barriers that disproportionately affect users of assistive technologies.
The practice of properly marking required fields also encourages better form design overall. When you're forced to clearly indicate what information is truly necessary, you naturally question whether each required field serves a genuine purpose, often leading to simpler, more focused forms.
As data collection becomes increasingly important to business success, the investment in clear, accessible required field indicators pays growing dividends. Every properly marked required field is an opportunity to build user trust while ensuring successful form completion for the broadest possible audience.
Greadme's easy-to-use tools can help you identify missing or unclear required field indicators on your website and provide simple instructions to make every form requirement accessible to all users—even if you're not technically minded.
Check Your Website's Form Accessibility Today