Test the effect of two label elements on a single form element (labellable elements)

Published:

Last Updated:

Tested with latest versions of screen readers and browsers available at time of publish.

Two label elements for one input=text

Two label elements for one input=search

Two label elements for one input=tel

Two label elements for one input=url

Two label elements for one input=email

Two label elements for one input=password

Two label elements for one input=month

Two label elements for one input=date

Two label elements for one input=week

Two label elements for one input=time

Two label elements for one input=datetime-local

Two label elements for one input=number

Two label elements for one input=range

Two label elements for one input=color

Two label elements for one input type=checkbox

Two label elements for one input type=radio

Two label elements for one input=file

Two label elements for one input=submit

Two label elements for one input=image

Two label elements for one input=reset

Two label elements for one input=button

Two label elements for one select

Two label elements for one textarea

Two label elements for one output

value

Two label elements for one meter

Two label elements for one progress

Two label elements for one button


Browser and screen reader versions:
Platform A11y API notes

Webkit / AX will consistently drop the second label from an element's accessible name.

IE11 / MSAA will consistently drop the first label if an element is provided 2 for its accessible name.

input type=color:
Firefox PC - MSAA / IA2: push button
Firefox PC - UIA: UIA_Button

Chromium - MSAA accRole: editable text. IA2: Color Chooser. UIA: UIA_Edit
Chromium - accName "Primary Secondary"
JAWS bug filed.

input type=file:
Firefox PC - MSAA/IA2 expose "PrimarySecondary" as the accessible name. NVDA and TalkBack(?) each appear to bypass the input's name and instead expose the subtree of the file input.
Firefox PC - MSAA / IA2: push button
Firefox PC - UIA: UIA_Button

Chromium - MSAA/IA2 accValue/Value "No file chosen"
Chromium - exposed as Push button

input type=button
Chromium - MSAA/IA2 expose value as accDescription/Description when label(s) provides accessible name.

output
Firefox PC - MSAA/IA2 expose "PrimarySecondary" as the accessible name.

meter
Firefox PC - MSAA/IA2 expose "PrimarySecondary" as the accessible name.
Firefox PC - MSAA accRole: meter. IA2 Role: Text Frame.

Chromium - MSAA/IA2/UIA all expose "Primary Secondary" as accessible name.
Chromium - MSAA/IA2/UIA roles: progress bar and UIA_ProgressBar (should be updated)

progress
Firefox PC - MSAA/IA2 expose "PrimarySecondary" as the accessible name. Seems NVDA/JAWS should be updated to announce labels on progress bar.

Chromium -

button
Firefox PC - MSAA/IA2 expose "PrimarySecondary" as accName.
Chromium - MSAA/IA2/UIA expose "Primary Secondary" as accName.

Expectation: Both labels should contribute to accessible name of element. Screen readers should announce both labels.

Testing Results

Browser / Screen Reader Firefox JAWS Firefox NVDA Firefox TalkBack Chrome + JAWS Chrome + NVDA Chrome + TalkBack Chrome + VoiceOver (macOS) Safari + VoiceOver (macOS) Safari + VoiceOver (iOS) IE11 + JAWS IE11 + NVDA Edge + JAWS Edge + NVDA
input=text Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=search Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=tel Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=url Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=email Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=password Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=month Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=date Pass Pass Fail
TalkBack does not announce labels for segmented date input.
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=week Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=time Pass Pass Fail
TalkBack does not announce labels for segmented time input.
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=datetime-local Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=number Pass
Repeats first label
Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=range Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=color Pass Pass Pass
(but no space between words).
Fail (JAWS ignores)

No announcement made.
Both labels are exposed.
Pass
(no role announcement)
Fail
announced as hex value
Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Fail (JAWS ignores)

No announcement made.
Both labels are exposed.
Pass
(no role announcement)
input=checkbox Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
announces second label THEN first label.  NOTE: if both labels are in the DOM prior to the input, then only the first label will be announced.
Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Pass Pass
input=radio Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Pass Pass
input=file Pass Fail
Does not announce either label, only announces "Browse, no file selected."
Fail
Does not announce either label, only announces "Browse button"
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
input=submit Pass
Does not announce "Submit"
Pass
Does not announce "Submit"
Pass
(but no space between words).
Does not announce "Submit"
Pass
Does not announce "Submit"
Pass
Does not announce "Submit"
Pass
Does not announce "Submit"
Pass
Does not announce "Submit"
Fail
only exposes first label. "Submit primary"
Fail
only exposes first label. Does not announce "Submit"
Fail
Does not announce either label.
Fail
only exposes second label.
Does not announce "Submit"
Pass
Does not announce "Submit"
Pass
Does not announce "Submit"
input=image Pass
Does not announce "alt"
Pass
Does not announce "alt"
Pass
(but no space between words).
Does not announce "alt"
Pass
Announces "Primary Secondary Alt"
Pass
Does not announce "alt"
Pass
Does not announce "alt"
Pass
Does not announce "alt"
Fail
only exposes first label. "Primary, alt"
Fail
only exposes first label.
Does not announce "alt"
Fail
Does not announce either label.
Fail
Does not announce either label.
Pass
Announces "Primary Secondary Alt"
Pass
Does not announce "alt"
input=reset Pass
Does not announce "Reset"
Pass
Does not announce "Reset"
Pass
(but no space between words).
Does not announce "Reset"
Pass
Does not announce "Reset"
Pass
Does not announce "Reset"
Pass
Does not announce "Reset"
Pass
Does not announce "Reset"
Fail
only exposes first label. "Reset primary"
Fail
only exposes first label.
Does not announce "Reset"
Fail
Does not announce either label.
Fail
only exposes second label.
Does not announce "Reset"
Pass
Does not announce "Reset"
Pass
Does not announce "Reset"
input=button Pass
Does not announce "Value"
Pass
Does not announce "Value"
Pass
(but no space between words).
Does not announce "Value"
Pass
"Value" announced as accessible description.
Pass
"Value" announced as accessible description.
Pass
"Value" announced as accessible description.
Pass
"Value" announced as accessible description.
Fail
only exposes first label. "Value primary"
Fail
only exposes first label.
Does not announce "Value"
Fail
Does not announce either label.
Fail
only exposes second label.
Does not announce "Value"
Pass
Announces "Primary Secondary Value"
Pass
Announces "Primary Secondary Value"
select Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
textarea Pass Pass Pass
(but no space between words).
Pass Pass Pass Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
Fail
only exposes second label.
Pass Pass
output Pass
Exposes both labels as accessible name. JAWS virtual cursor only announces visible text.
Pass
Exposes both labels as accessible name. NVDA virtual cursor only announces visible text.
Fail
No role announced or accessible name from labels announced when focusing output.
Pass
Exposes both labels as accessible name. JAWS virtual cursor only announces visible text.
Pass
Exposes both labels as accessible name. NVDA virtual cursor only announces visible text.
Pass
But contents of output are not announced.
Fail
Both labels exposed as accessible name but no role announced or accessible name from labels announced when focusing output.
Pass
Announces as: "Primaryvalue Secondary" or "PrimarySecondary" if no text within output.
Fail
only exposes first label.
Fail
Role not exposed by IE
Fail
Role not exposed by IE
Pass
Exposes both labels as accessible name. JAWS virtual cursor only announces visible text.
Pass
Exposes both labels as accessible name. NVDA virtual cursor only announces visible text.
meter Pass
But value of meter not announced.
Pass
But value of meter not announced. No role announced.
Fail
Element ignored.
Fail
Exposes both labels as accessible name. JAWS virtual cursor only announces value and role of meter.
Pass
(element announced as progress bar). No value announced.
Pass
But value of meter not announced.
Pass
Fail
only exposes first label.
Fail
ignored
Fail
Element not rendered by IE
Fail
Element not rendered by IE
Fail
Exposes both labels as accessible name. JAWS virtual cursor only announces value and role of meter.
Pass
(element announced as progress bar). No value announced.
progress Fail
Exposes both labels as accessible name. JAWS virtual cursor only announces value and role for progress bar.
Fail
Exposes both labels as accessible name. NVDA virtual cursor only announces value and role for progress bar.
Pass
(but no space between words).
Fail
Exposes both labels as accessible name. JAWS virtual cursor only announces value and role for progress bar.
Pass
But value of progress not announced
Pass
But value of progress not announced
Pass Fail
only exposes first label.
Fail
only exposes first label.
Fail
only exposes second label.
JAWS does not announce.
Fail
only exposes second label.
NVDA does not announce.
Fail
Exposes both labels as accessible name. JAWS virtual cursor only announces value and role for progress bar.
Pass
But value of progress not announced
button Pass
If button contains no text, both labels. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels announced. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels announced but twice. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels.
If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels announced. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels announced. If button contains text, the labels will overwrite the visible text.
Fail
only exposes first label.
If button contains content, will announce as "button text, first label"
Fail
only exposes first label.
Fail
If button contains no text, second label may be announced OR button's Value.
If button contains text, labels not used for accessible name.
Fail
If button contains no text, second label announced or "blank" if navigating by virtual cursor.
If button contains text, labels not used for accessible name.
Pass
If button contains no text, both labels announced but twice. If button contains text, the labels will overwrite the visible text.
Pass
If button contains no text, both labels. If button contains text, the labels will overwrite the visible text.