Skip to main content
Beta: Front-End Checklist is currently in beta. Some issues are still being fixed. Thanks for your patience.

Use a single label for each form field

Form fields should have exactly one associated <label> element for maximum clarity.

Utilities
Quick take
Typical fix time 5 min
  • Associate each form input with exactly one <label> element
  • Use aria-labelledby if multiple pieces of text must label a single field
  • Avoid duplicate labels that can confuse screen readers and voice control
Why it matters: Multiple labels for a single field can cause screen readers to announce redundant information or fail to correctly associate the input with its purpose.

Rule Details

A form field should have one clear, primary label. Providing multiple <label> elements for a single input can lead to inconsistent behavior across different browsers and screen readers.

Code Example

<!-- ✅ Good: Single label with for/id association -->
<label for="email-addr">Email Address</label>
<input id="email-addr" type="email">
 
<!-- ✅ Good: Using aria-labelledby for complex labels -->
<span id="label-main">Phone Number</span>
<span id="label-sub">(Include area code)</span>
<input aria-labelledby="label-main label-sub" type="tel">
 
<!-- ❌ Bad: Multiple label elements for one input -->
<label for="username">Username</label>
<label for="username">Required</label> <!-- Error: Input has multiple labels -->
<input id="username" type="text">

Why It Matters

  • Clarity: Users need a single, unambiguous name for every form control.
  • Voice Control: Users who navigate by voice (e.g., Dragon NaturallySpeaking) rely on labels to "click" inputs. Multiple labels can make the target ambiguous.
  • Assistive Technology: Some screen readers may only read the first label, while others might read all of them, leading to a confusing user experience.

Best Practices

1:1 Mapping: Stick to one <label> per <input>. ✅ Use aria-describedby: For supplemental information (like "Password must be 8 characters"), use aria-describedby instead of a second label. ✅ Nesting vs For: While nesting an input inside a label is valid, using the for attribute with a matching id is the most robust method across all technologies.

Tools & Validation

Exceptions

  • Evaluate the rendered experience before treating a static-code smell as a blocker; interaction timing, browser behavior, and assistive technology output often determine severity.
  • Not every secondary accessibility issue deserves equal weight; prioritize the issue that most directly blocks perception, operation, or understanding.
  • Avoid adding redundant markup or ARIA solely to satisfy a rule when a simpler semantic implementation would eliminate the issue entirely.

Verification

Automated Checks

  • Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.
  • Run an automated accessibility checker such as axe or Lighthouse where applicable.

Manual Checks

  • Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.
  • Re-test one representative user flow with a screen reader if this rule affects a key interaction.

Use with AI

Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.

Check

Verify implementation

Search for form inputs that are associated with more than one <label> element.

Fix

Auto-fix issues

Consolidate multiple labels into a single <label> or use aria-labelledby to reference multiple sources of text.

Explain

Learn more

Explain how a 1:1 relationship between labels and inputs ensures clarity for assistive technology users.

Review

Code review

Review the rendered markup and interactive states that affect Use a single label for each form field. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.

Sources

References used to support the guidance in this rule.

Further Reading

Tools and supplementary material for exploring the topic in more depth.

axe DevTools
deque.comTool

Rules that often go hand-in-hand with this one.

Provide accessible names for select elements

All `<select>` elements must have an associated label or an accessible name to be correctly identified by screen readers.

Accessibility
Ensure all input fields have accessible names

Checks that input fields have accessible names so screen reader users know what data each field expects.

Accessibility
Associate labels with form controls

Form inputs must have programmatically associated labels.

Accessibility
Align visible labels with accessible names

The accessible name of a control should contain its visible label text.

Accessibility

Was this rule helpful?

Your feedback helps improve rule quality. This stays internal for now.

Loading feedback...
0 / 385