Input buttons require discernible text
Last updated:
Who it helps:
Blind
Standard:
WCAG 2.2 Level AA
Related Guides
Input buttons must have a discernible accessible name
Every input button needs a programmatic name that assistive technologies can announce.
This applies to input type=button, type=submit, and type=reset across forms and toolbars.
Missing or empty names block screen reader users and make voice control unreliable.
Why It Matters
- Screen reader users cannot tell what an unnamed button does, so critical actions like Submit or Reset are hidden.
- Speech recognition users must say the button’s label; without a name, commands like “click Save” will fail.
- Clear, consistent button names reduce cognitive load for users with memory or attention limitations.
Common Causes
- input
type="button"with no value,aria-label, oraria-labelledby. type="submit"ortype="reset"with value="" (empty string) which overrides the browser’s default label.aria-labelpresent but empty or whitespace-only.aria-labelledbypointing to an element that does not exist, is hidden, or has no text.- Icon-only controls that never expose a text label to the accessibility APIs.
- Relying on the title attribute as the only label (inconsistently announced and not visible).
How to Fix
- Prefer visible text
- Recommendation: When possible, use a visible label for buttons. If you must use
<input>, ensure an accessible name is provided.
- Recommendation: When possible, use a visible label for buttons. If you must use
- Provide a name for input
type="button"- Set a meaningful value attribute (e.g., value="Add to cart").
- Or use
aria-labelledbyto reference nearby visible text. aria-labelis acceptable when no visible text exists, but keep it concise and clear.
- Handle submit and reset safely
- If you want the browser’s default name, omit the value attribute entirely (e.g.,
<input type="submit">). - If you provide value, ensure it is not empty and accurately describes the action (e.g., value="Send form").
- Never set value="" for submit or reset.
- If you want the browser’s default name, omit the value attribute entirely (e.g.,
- Match Label in Name (WCAG 2.5.3)
- When a visible label exists (e.g., “Save settings”), include those words in the accessible name, preferably at the start.
- Avoid title-only labeling
- The title attribute alone is not reliable for names and provides no visible text. Do not depend on it.
- Keep ARIA references valid
- Ensure
aria-labelledbyIDs exist, are unique, and reference elements with meaningful text that is not hidden.
- Ensure
- Maintain names during UI changes
- If button text changes dynamically (e.g., “Play” to “Pause”), update the accessible name at the same time.
How to Test
Keyboard
- Tab to each input button; it must receive focus and be operable with Enter/Space.
- While focused, confirm a visible label is present when applicable.
Screen reader
- With NVDA/JAWS/VoiceOver: navigate to each button and listen for a clear name.
- Verify the spoken name contains any visible label text (Label in Name).
Mobile/touch
- With TalkBack or iOS VoiceOver: swipe to the button; ensure its role and name are announced.
- Use rotor/quick nav to list buttons and confirm they appear with the expected names.
DevTools/Automation
- Inspect the element’s computed accessible name in browser Accessibility tools.
- Run automated checks (e.g., axe, WAVE) and review any “button name” or “accessible name” issues.
Quick checklist
- Each input button has a non-empty computed accessible name.
- Submit/Reset do not use an empty value; default names or meaningful values are present.
- ARIA labels are concise, localized, and accurate;
aria-labelledbytargets exist and contain text. - Visible label words appear in the accessible name (Label in Name).
- Icon-only buttons expose a text name via
aria-labeloraria-labelledby. - Title is not the sole source of the name.
Good Example
HTML
<form>
<!-- Submit with explicit name -->
<input type="submit" value="Send message" id="sendMsg">
<!-- Reset using the browser’s default name (no value attribute) -->
<input type="reset" id="resetForm">
<!-- Input button named via aria-labelledby referencing visible text -->
<span id="cartAddText">Add to cart</span>
<input type="button" id="addCart" aria-labelledby="cartAddText">
</form>Bad Example
HTML
<form>
<!-- No accessible name at all -->
<input type="button" id="doThing">
<!-- aria-label present but empty -->
<input type="button" id="iconPlay" aria-label="">
<!-- Broken aria-labelledby reference -->
<input type="button" id="apply" aria-labelledby="missingText">
<!-- Submit with empty value overrides default and results in no name -->
<input type="submit" id="send" value="">
</form>Quick Checklist
- Input buttons expose a clear, non-empty accessible name.
- Names are action-oriented and match visible labels when present.
- Submit/Reset: omit value for defaults or provide meaningful values; never empty.
- ARIA labels are valid and point to existing, text-filled elements.
- Icon-only buttons include
aria-labeloraria-labelledby. - Do not rely on title as the only label.
- Verify announcements with a screen reader and DevTools’ computed name.