【问题标题】:Using the HTML 'label' tag with radio buttons使用带有单选按钮的 HTML“标签”标签
【发布时间】:2012-10-27 18:00:18
【问题描述】:

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

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

我想为左列中的每个标签使用label 标记,以定义其与右列中相应控件的连接。但是如果我使用单选按钮,规范似乎表明表单控件的实际“Salutation”标签突然不再属于label 标签,而是选项“先生,夫人等”。进入label标签。

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

更新: 这是一个带有代码的示例:

<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 accessibility forms


【解决方案1】:

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

是的

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

与任何其他表单控件的方式相同。

您可以给它一个与控件的id 匹配的for 属性,或者将控件放在标签元素中。

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

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

如果您想为一组控件添加标题,请使用 &lt;fieldset&gt;&lt;legend&gt;(并为集合中的每个控件指定 &lt;label&gt;)。

<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>

【讨论】:

  • Fieldset 改变了某些浏览器的显示,不是吗?在我的情况下,“图例”和单选按钮也在不同的表格单元格中。
  • 另外,一组具有相同名称属性的单选按钮实际上是一个控件。每个&lt;input type="radio" 都是该控件的可能值,而不是控件本身的名称。我有一些代码可以对我遇到的所有其他类型的表单控件执行正确的操作。也许 fieldset 是我的答案?归根结底,我想这一切的重点是视力有限的人可以使用。搜索引擎几乎从第一天就放弃了“语义网”。
  • @GlenPeterson:“一组具有相同名称属性的单选按钮实际上是一个控件”——不,不是。当然,它们是相互关联的,但每个按钮都是一个控件。 &lt;select&gt; 标签是一个控件。您可以使用它来代替单选按钮。
  • 我更新了昆汀的回答。虽然&lt;label&gt;&lt;input&gt;text&lt;label&gt; 在技术上 是有效的,但它不是最佳实践,并且自 03ish 以来一直没有。一些 AT 也有这种方法的问题。 @GlenPeterson 没有为一组无线电提供名称,让它们工作并看起来像一个无线电组 1。
  • stackoverflow.com/a/4213253/470749 是对我删除 for 的有用提醒。
【解决方案2】:

标签的“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" />

【讨论】:

  • 如果您不想使用 id,也可以将单选元素包装在标签中。
  • 我认为您并没有完全回答 OP 的实际问题。如果我理解正确,他问的是如何标记适用于整套单选按钮的标签。
  • @PaulD.Waite 我又读了一遍,你似乎是对的,哈哈。我的错。
【解决方案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>

【讨论】:

  • 你的意思是,“也许你应该为你的这个“标签”使用另一个标签——因为它不是真正的标签。”?
  • 它并没有真正链接到任何可用的选项,即使它定义了一组选项的名称。
  • 我应该使用什么其他标签?你的意思是我应该补一张?
【解决方案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 包装在 &lt;label&gt; 元素中,只是不能使用 for 属性。 我已纠正,请参阅下面的 cmets。虽然技术上可行,但这并不是&lt;label&gt; 的本意。

【讨论】:

  • “不,您不能将 Salutation 连接到单选按钮” — 不正确。 &lt;fieldset&gt;&lt;legend&gt; 就是为此目的而设计的。
  • 我喜欢使用标签而不关联它的想法 - 它表明努力做正确的事情。但我怀疑浏览器会忽略它而不知道它与什么相关联。它甚至可能在某个浏览器中暴露一个没有悬挂标签标签就不会发生的错误。
  • @GlenPeterson:“我喜欢使用标签而不关联它的想法 - 它表明努力做正确的事情。”我猜,虽然它也表明该人没有抬头what &lt;label&gt; is actually for
  • 哎呀,抱歉 Nic — 当我说“有问题的人”时,我实际上并没有注意到您建议使用标签而不使用 for,我只是觉得 @GlenPeterson 是在假设性地说话。没有冒犯的意思。
  • @PaulD.Waite,没有人被拿走!您实际上是对的,我没有查过它,我自己也为此使用了&lt;label&gt;。每天都在学习新事物;)还是感谢您的链接。
【解决方案5】:

啊,是的。以下是它的工作原理。

&lt;label&gt; 标签单个字段,因此每个&lt;input type="radio"&gt; 都有自己的&lt;label&gt;

要标记字段的(例如,共享相同name 的多个单选按钮),您可以使用带有&lt;legend&gt; 元素的&lt;fieldset&gt; 标记。

<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>

【讨论】:

  • +1 用于回答具体问题和“更难在浏览器中保持一致的样式”,即使 Quentin 可能已经偷走了你的一些风头。这种方法的问题在于,我认为它不能跨表格单元格工作,特别是如果表格包含其他表单元素,这些元素不属于这组特定单选按钮的选项。
  • @GlenPeterson:确实。如果您希望您的标签在一个单元格中,而您的表单字段在另一个单元格中,则上面的 HTML 不起作用。可以说,这是不使用表格来布置表单的一个原因。
  • 您能否链接到您推荐的布局表单的方式,以便在各种屏幕尺寸上实现跨浏览器兼容性?现在我们在左栏中有字段名称,在中间有字段,在右侧有帮助文本(如果合适)。
  • @GlenPeterson:没有什么值得推荐的表单布局方式。这取决于形式,以及您要达到的目标。我个人喜欢的一件事是字段上方的字段标签,当您在 iPhone 上选择字段时,您仍然可以在浏览器放大字段后看到标签。
  • @AdamFraser:是的,你应该这样做,尽管我相信过去一些屏幕阅读器并不能很好地支持这一点。人们希望情况有所改善,但我最近没有尝试过。
【解决方案6】:

您可以使用aria-role="radiogroup" 来关联控件,而无需使用&lt;fieldset&gt;。这是one of the techniques suggested by WCAG 2.0

<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 工具会发出关于缺少 &lt;fieldset&gt; 的警告,所以我不确定 AT 对此的支持是什么样的。

【讨论】:

    【解决方案7】:

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

    <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>

    【讨论】:

    • 有人毫无理由地否决了这个。愚蠢的。
    • 这是我过去采用的方法;这是否被认为是最佳实践,idk,但它与单选按钮的分组方式一致,所以对我来说似乎很自然。不幸的是,标签的 defs 具有与 id 相关联的标签属性,而不是名称。因此,这种方法会产生警告。
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2013-03-18
    相关资源
    最近更新 更多