将 HTML“label”标签与单选按钮一起使用

Using the HTML 'label' tag with radio buttons

提问人:GlenPeterson 提问时间:11/8/2012 最后编辑:GlenPeterson 更新时间:10/18/2017 访问量:76362

问:

标签是否适用于单选按钮?如果是这样,你如何使用它?我有一个显示如下的表单:label

First Name: (text field)
Hair Color: (color drop-down)
Description: (text area)
Salutation: (radio buttons for Mr., Mrs., Miss)

我想使用左列中每个标签的标记来定义其与右列中相应控件的连接。但是,如果我使用单选按钮,规范似乎表明,突然间,表单控件的实际“称呼”标签不再属于标签,而是选项“Mr.、Mrs.等”进入标签。labellabellabel

我一直是可访问性和语义网的粉丝,但这种设计对我来说没有意义。标记显式声明标签。标记选择选项。如何在一组单选按钮的实际标签上声明 a?labeloptionlabel

更新:下面是一个代码示例:

<tr><th><label for"sc">Status:</label></th>
    <td>&#160;</td>
    <td><select name="statusCode" id="sc">
            <option value="ON_TIME">On Time</option>
            <option value="LATE">Late</option>
        </select></td></tr>

这很好用。但与其他窗体控件不同的是,单选按钮对每个值都有一个单独的字段:

<tr><th align="right"><label for="???">Activity:</label></th>
    <td>&#160;</td>
    <td align="left"><input type="radio" name="es" value="" id="es0" /> Active &#160;
        <input type="radio" name="es" value="ON_TIME" checked="checked" id="es1" /> Completed on Time &#160;
        <input type="radio" name="es" value="LATE" id="es2" /> Completed Late &#160;
        <input type="radio" name="es" value="CANCELED" id="es3" /> Canceled</td>
</tr>

该怎么办?

HTML 辅助功能 表单

评论

2赞 Ryan B 11/9/2012
相关答案:stackoverflow.com/questions/13080416/...

答:

62赞 Quentin 11/8/2012 #1

标签标签是否适用于单选按钮?

是的

如果是这样,你如何使用它?

与任何其他窗体控件相同。

您可以为其指定一个与控件匹配的属性,也可以将控件放在 label 元素内。forid

我想为左列中的每个标签使用标签标签

标签用于一个控件,而不是一组控件。

如果要为一组控件添加标题,请使用带有 a 的 a(并为该集中的每个控件提供 a)。<fieldset><legend><label>

<fieldset>
  <legend> Salutation </legend>
  <label> <input type="radio" name="salutation" value="Mr."> Mr. </label>
  <label> <input type="radio" name="salutation" value="Mrs."> Mrs. </label>
  <!-- etc -->
</fieldset>

评论

1赞 GlenPeterson 11/8/2012
Fieldset 会更改某些浏览器上的显示,不是吗?此外,在我的情况下,“图例”和单选按钮位于不同的表格单元格中。
1赞 GlenPeterson 11/8/2012
此外,一组具有相同名称属性的单选按钮实际上是一个控件。每个值都是该控件的可能值,而不是控件本身的名称。我有一些代码可以对我遇到的所有其他类型的表单控件做正确的事情。也许fieldset是我的答案?归根结底,我想这一切的重点是视力有限的人的可访问性。搜索引擎几乎从第一天起就放弃了“语义网”。<input type="radio"
3赞 Paul D. Waite 11/8/2012
@GlenPeterson:“一组具有相同名称属性的单选按钮实际上是一个控件”——不,不是。当然,它们是链接的,但每个按钮都是一个控件。标记是一个控件。您可以使用它来代替单选按钮。<select>
0赞 Ryan B 11/9/2012
我更新了昆汀的答案。虽然在技术上是有效的,但这不是最佳实践,自 03 年以来一直没有。一些 AT 也存在此方法的问题。@GlenPeterson不为一组无线电提供名称,请使它们工作并看起来像 1 个无线电组。<label><input>text<label>
2赞 Ryan 4/4/2018
stackoverflow.com/a/4213253/470749 对我来说是一个有用的提醒,关于删除.for
0赞 George 11/8/2012 #2

Label 的 'for' 属性对应于单选按钮 ID。

<label for="thisRad">Radio Button 1</label>
<input type="radio" id="thisRad" />

希望它有所帮助。

你会希望你的看起来像这样......

Salutation<br />
<label for="radMr">Mr.</label><input type="radio" id="radMr" />
<label for="radMrs">Mrs.</label><input type="radio" id="radMrs" />
<label for="radMiss">Miss.</label><input type="radio" id="radMiss" />

评论

0赞 Jørgen 11/8/2012
如果您不想使用 id,也可以将 radio 元素包装在标签中。
3赞 Paul D. Waite 11/8/2012
我不认为你完全回答了 OP 的实际问题。如果我理解正确的话,他问的是如何标记一个适用于整套单选按钮的标签。
0赞 George 11/8/2012
@PaulD.Waite我又读了一遍,你好像是对的,哈哈。我的错。
2赞 Cesar Castro 11/8/2012 #3

不能为一组按钮声明标签,而只能为每个按钮声明标签。 在本例中,标签是“先生”、“夫人”和“小姐”,而不是“称呼”。

更新
:也许你应该为你的这个“标签”使用另一个标签 - 因为它不是一个真正的标签。

<tr>
    <th align="right" scope="row"><span class="label">Activity:</span></th>
    <td>&#160;</td>
    <td align="left"><label><input type="radio" name="es" value="" id="es0" /> Active &#160;</label>
    [... and so on]
</tr>

评论

0赞 GlenPeterson 11/8/2012
“也许你应该为你的这个'标签'使用另一个标签——因为它不是真正的标签”是什么意思?
0赞 Cesar Castro 11/8/2012
它并没有真正链接到任何可用选项,即使它定义了一组选项的名称。
0赞 GlenPeterson 11/9/2012
我还应该使用什么其他标签?你是说我应该编一个吗?
1赞 Nic Wortel 11/8/2012 #4

回答您的问题:不可以,您不能将 Salutation 连接到其中一个单选按钮。如果您单击“称呼”,则会选择其中一个选项,这是没有意义的。相反,您可以为 Mr、Mrs 和 Miss 添加自己的标签,因此,如果有人单击其中一个单词,将选择相应的单选按钮。

<input id="salutation_mr" type="radio" value="mr" name="salutation">
<label for="salutation_mr">Mr.</label>
<input id="salutation_mrs" type="radio" value="mrs" name="salutation">
<label for="salutation_mrs">Mrs.</label>
<input id="salutation_miss" type="radio" value="miss" name="salutation">
<label for="salutation_miss">Miss</label>

我确实认为您仍然可以将 Salutation 包装在 <label> 元素中,只是不能使用 for 属性。我纠正了,请参阅下面的评论。虽然这在技术上是可行的,但这不是本意。<label>

评论

2赞 Paul D. Waite 11/8/2012
“不,您不能将 Salutation 连接到单选按钮”——不正确。 并且是为此目的而设计的。<fieldset><legend>
0赞 GlenPeterson 11/8/2012
我喜欢在不关联标签的情况下使用标签的想法 - 它表明了做正确事情的努力。但我怀疑浏览器会在不知道将其与什么相关联的情况下忽略它。它甚至可能在某些浏览器的某个地方暴露一个错误,如果没有悬空的标签标签,这些错误就不会发生。
1赞 Paul D. Waite 11/8/2012
@GlenPeterson:“我喜欢在不关联标签的情况下使用标签的想法——它表明了做正确事情的努力。我猜,尽管这也表明有问题的人没有查过<标签>的实际用途
0赞 Paul D. Waite 11/8/2012
哎呀,对不起,尼克——当我说“有问题的人”时,我实际上并没有注意到你建议使用标签而不使用,我只是@GlenPeterson假设地说话。没有冒犯的意思。for
0赞 Nic Wortel 11/8/2012
@PaulD.Waite,没有带走!你实际上是对的,我没有查过,我自己也用于这个目的。每天学习新事物;)无论如何,感谢您的链接。<label>
28赞 Paul D. Waite 11/8/2012 #5

啊,是的。这是它的工作原理。

<label>标记各个字段,因此每个字段都有自己的 .<input type="radio"><label>

要标记一组字段(例如,共享相同的多个单选按钮),请使用带有元素的标签。name<fieldset><legend>

<fieldset>
    <legend>Salutation</legend>

    <label for="salutation_mr">Mr <input id="salutation_mr" name="salutation" type="radio" value="mr"><label>

    <label for="salutation_mrs">Mrs <input id="salutation_mrs" name="salutation" type="radio" value="mrs"><label>

    <label for="salutation_miss">Miss <input id="salutation_miss" name="salutation" type="radio" value="miss"><label>

    <label for="salutation_ms">Ms <input id="salutation_miss" name="salutation" type="radio" value="ms"><label>
</fieldset>

评论

0赞 GlenPeterson 11/8/2012
+1 回答了具体问题,并且“更难在浏览器上保持一致的样式”,即使昆汀可能已经偷走了你的一些雷声。这种方法的问题在于,我认为它不适用于表格单元格,特别是如果表格包含其他表单元素,而这些元素不属于这组特定单选按钮的选项。
2赞 Paul D. Waite 11/8/2012
@GlenPeterson:确实如此。如果您希望标签在一个单元格中,而表单字段在另一个单元格中,则上面的 HTML 不起作用。可以说,这就是不使用表格来布置表单的原因。
0赞 GlenPeterson 11/9/2012
您能否链接到您推荐的一种方式,即在各种屏幕尺寸上布局表单以实现跨浏览器兼容性?现在,字段名称在左列,字段在中间,帮助文本(在适当时)在右侧。
0赞 Paul D. Waite 11/9/2012
@GlenPeterson:对于推荐的表单布局方式,没有想到任何事情。这取决于形式,以及您要实现的目标。我个人喜欢的一件事是字段上方的字段标签,因为当您在 iPhone 上选择字段时,在浏览器放大字段后,您仍然可以看到标签。
1赞 Paul D. Waite 11/8/2017
@AdamFraser:没错,你应该这样做,尽管我相信过去一些屏幕阅读器不能很好地支持这一点。人们希望情况有所改善,但我最近没有尝试过。
9赞 Scribblemacher 8/14/2017 #6

可以使用 来关联控件,而无需使用 .这是 WCAG 2.0 建议的技术之一aria-role="radiogroup"<fieldset>

<div role="radiogroup" aria-labelledby="profession_label" aria-describedby="profession_help">
  <p id="profession_label">What is your profession?</p>
  <p id="profession_help">If dual-classed, selected your highest leveled class</p>
  <label><input name="profession" type="radio" value="fighter"> Fighter</label>
  <label><input name="profession" type="radio" value="mage"> Mage</label>
  <label><input name="profession" type="radio" value="cleric"> Cleric</label>
  <label><input name="profession" type="radio" value="theif"> Thief</label>
</div>

但是,我注意到使用这种技术 WebAim Wave 工具会发出有关丢失的警告,所以我不确定 AT 对此的支持是什么样的。<fieldset>

2赞 BananaAcid 8/21/2017 #7

我对主题的 2 美分,或者更确切地说是一个侧节点(它不使用隐式关联来能够放置在任何地方,而是链接):按属性进行分组,并属性进行链接nameid

<ol>
    <li>
        <input type="radio" name="faqList" id="faqListItem1" checked />
        <div>
            <label for="faqListItem1">i 1</label>
        </div>
    </li>
    <li>
        <input type="radio" name="faqList" id="faqListItem2" />
        <div>
            <label for="faqListItem2">i 2</label>
        </div>
    </li>
    <li>
        <input type="radio" name="faqList" id="faqListItem3" />
        <div>
            <label for="faqListItem3">i 3</label>
        </div>
    </li>
</ol>

评论

0赞 Jacob Lee 4/22/2020
这是我过去采取的方法;它是否被认为是最佳实践,IDK,但它与单选按钮的分组方式一致,因此对我来说似乎很自然。不幸的是,label 的 defs 具有与 id 关联的标签的 for 属性,而不是 name。因此,此方法会生成警告。