我应该将输入元素放在标签元素中吗?

jps*_*nyx 563 html html5 semantics

是否有关于嵌套labelinputHTML元素的最佳实践?

经典方式:

<label for="myinput">My Text</label>
<input type="text" id="myinput" />
Run Code Online (Sandbox Code Playgroud)

要么

<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>
Run Code Online (Sandbox Code Playgroud)

sup*_*led 498

从w3:标签本身可以位于相关控件之前,之后或周围.

<label for="lastname">Last Name</label>
<input type="text" id="lastname" />
Run Code Online (Sandbox Code Playgroud)

要么

<input type="text" id="lastname" />
<label for="lastname">Last Name</label>
Run Code Online (Sandbox Code Playgroud)

要么

<label>
   <input type="text" name="lastname" />
   Last Name
</label>
Run Code Online (Sandbox Code Playgroud)

请注意,当表格用于布局时,不能使用第三种技术,其中标签位于一个单元格中,而其关联的表单字段位于另一个单元格中.

任何一个都有效.我喜欢使用第一个或第二个例子,因为它为你提供了更多的样式控制.

  • 太糟糕了,你不能在输入标签内嵌套标签.在语义上更合理,因为如果从抽象的角度来看,标签确实是输入的属性. (52认同)
  • 如上所述,所有这些都是有效的,但在我自己的实践中,我通常会依据superUntitled为文本框,textareas和选择提供的第一个示例.但是对于单选按钮和复选框,我通常使用第三个示例,我希望在附带的文本之前输入,并且不希望使用与其他标签和字段使用的相同类型的固定宽度和/或浮动.因此,在任何一个给定的表单上,您可能会发现我一起使用这两种格式. (13认同)
  • 链接的WCAG文档包括以下选项"控件包含在包含标签文本的标签元素中." 我不知道自@Sorcy评论以来是否添加了这些内容,但是标签输入方案现在被认为是有效的. (9认同)
  • 我想知道`<label for ="inputbox"> <input id ="inputbox"type ="text"/> </ label>`是否符合他们的标准. (6认同)
  • 将标签事件处理程序附加到标签时,标签中的输入存在问题,至少在chrome中,处理程序在单击标签时会被触发两次.您可以在处理程序的末尾使用`return false;`来获取,但是如果您可能有其他处理程序需要在之后执行,并且停止传播不是一个选项,这就成了一个问题. (4认同)
  • 哦,显然他们改变了它.万岁为了理智! (2认同)
  • 在`input`周围包装`label`是个问题,如果你想根据radio/checkbox的`checked`状态改变标签的样式,你就不能用纯CSS来做. (2认同)
  • @FelipeAls&sorcy你能否删除你对#3不是有效方法的评论?这让事情变得非常混乱; 评论中有太多的选票不再是真的. (2认同)

Zna*_*kus 62

我更喜欢

<label>
  Firstname
  <input name="firstname" />
</label>

<label>
  Lastname
  <input name="lastname" />
</label>
Run Code Online (Sandbox Code Playgroud)

过度

<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />

<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />
Run Code Online (Sandbox Code Playgroud)

主要是因为它使HTML更具可读性.我实际上认为我的第一个例子更容易使用CSS,因为CSS与嵌套元素的效果非常好.

但这是我想的味道问题.


如果您需要更多样式选项,请添加span标记.

<label>
  <span>Firstname</span>
  <input name="firstname" />
</label>

<label>
  <span>Lastname</span>
  <input name="lastname" />
</label>
Run Code Online (Sandbox Code Playgroud)

在我看来,代码看起来仍然更好.

  • 我喜欢这个解决方案也适用于这样的情况:`<label>在<input name ="exp"/> days </ label>之后过期(标签在输入元素之前和之后) (8认同)
  • 在标签内包含输入与使用HTML进行布局相同. (3认同)
  • @MPavlak - 快速浏览一下,我从w3.org找到了这个指导.https://www.w3.org/WAI/tutorials/forms/labels/.然后我检查了https://www.w3.org/TR/WCAG20-TECHS/H44.html.在底部(它是模糊的)它表示,为了声明一致性,您需要传递测试标准,并明确指出您应该使用for属性.实际上,当我上次在Apple Voiceover(10%市场份额的屏幕阅读器桌面,60%市场份额的屏幕阅读器移动设备)中进行测试时,隐式标签不起作用,因此这是另一个主要因素.希望有所帮助! (2认同)

Ter*_*rry 38

如果在label标签中包含输入标签,则无需使用'for'属性.

也就是说,我不喜欢在我的标签中包含输入标签,因为我认为它们是独立的,不包含实体.

  • for需要你使用id,这使得层次结构布局很难:-( (7认同)

Cir*_*四事件 37

行为差异:点击标签和输入之间的空格

如果单击标签和输入之间的空格,则仅当标签包含输入时才激活输入.

这是有道理的,因为在这种情况下,空格只是标签的另一个字符.

<p>Inside:</p>

<label>
  <input type="checkbox" />
  |&lt;----- Label. Click between me and the checkbox.
</label>

<p>Outside:</p>

<input type="checkbox" id="check" />
<label for="check">|&lt;----- Label. Click between me and the checkbox.</label>
Run Code Online (Sandbox Code Playgroud)

能够在标签和框之间单击意味着它是:

  • 更容易点击
  • 事情的起点和终点都不太清楚

Bootstrap复选框v3.3示例使用内部输入:http://getbootstrap.com/css/#forms可能明智地遵循它们.但是他们在v4.0 https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios中改变了主意,所以我不知道什么是明智的:

构建复选框和无线电用于支持基于HTML的表单验证,并提供简洁,可访问的标签.因此,我们的<input>s和<label>s是兄弟元素而不是<input>a <label>.这稍微冗长一点,因为您必须指定id和属性来关联<input><label>.

UX问题详细讨论了这一点:https://ux.stackexchange.com/questions/23552/should-the-space-between-the-checkbox-and-label-be-clickable

  • 这种行为差异对我来说很重要.当元素是兄弟元素时,任一元素**上的任何边距都会减小可触发输入元素的可点击表面区域**.将输入嵌套在标签内部可保留最大可点击区域,即使对于精确鼠标或触摸移动的用户也能提供最大的可访问性.在Bootstrap 4中,嵌套**仍然可以工作**并且仍然显示相同而无需调整或覆盖任何Bootstrap CSS. (2认同)

Par*_*ots 16

就个人而言,我喜欢将标签保留在外面,就像你的第二个例子一样.这就是FOR属性存在的原因.原因是我经常将样式应用于标签,如宽度,以使表单看起来不错(下面的简写):

<style>
label {
  width: 120px;
  margin-right: 10px;
}
</style>

<label for="myinput">My Text</label>
<input type="text" id="myinput" /><br />
<label for="myinput2">My Text2</label>
<input type="text" id="myinput2" />
Run Code Online (Sandbox Code Playgroud)

做到这一点,我可以避免表格和我的表格中的所有垃圾.

  • 你不应该把演示文稿留给CSS,而不是使用`<br />`来分隔输入吗? (3认同)

小智 15

有关W3的建议,请参见http://www.w3.org/TR/html401/interact/forms.html#h-17.9.

他们说它可以以任何一种方式完成.他们将两个方法描述为显式(使用带有元素id的"for")和隐式(将元素嵌入标签中):

明确:

for属性明确地将标签与另一个控件相关联:for属性的值必须与关联控件元素的id属性的值相同.

隐式:

要隐式地将标签与另一个控件相关联,控制元素必须位于LABEL元素的内容中.在这种情况下,LABEL可能只包含一个控制元素.


nic*_*des 11

两者都是正确的,但将输入放在标签内使得在使用CSS进行样式设置时灵活性降低.

首先,a <label>受限于它可以包含哪些元素.例如,如果不在标签内,则只能在标签文本<div>之间放置.<input><input><label>

其次,虽然有一些变通方法可以使样式化更容易,比如用span填充内部标签文本,但某些样式将继承父元素,这样可以使样式更复杂.


Aar*_*ron 7

一个值得注意的'gotcha'规定你不应该在带有明确的"for"属性的<label>元素中包含多个输入元素,例如:

<label for="child-input-1">
  <input type="radio" id="child-input-1"/>
  <span> Associate the following text with the selected radio button: </span>
  <input type="text" id="child-input-2"/>
</label>
Run Code Online (Sandbox Code Playgroud)

虽然这对于自定义文本值是单选按钮或复选框的辅助表单功能可能很有吸引力,但标签元素的单击焦点功能会立即将焦点放在其"for"属性中明确定义了id的元素上. ,使用户几乎不可能点击包含的文本字段来输入值.

就个人而言,我试图避免使用输入子元素的标签元素.对于标签元素而言,在语义上不适合包含比标签本身更多的内容.如果您在标签中嵌套输入以实现某种美感,则应该使用CSS代替.

  • 这不是"陷阱".它明确是规范的一部分; 标签中最多可包含1个控件.你也在混合隐式和显式样式 - 如果你把控件放在标签里,你不需要`for` ...如果你想使用`for`,那么在控件里面放置控件没有多大意义. (4认同)

Vic*_*scu 5

我通常会选择前两个选项。我看到了使用第三个选项时的情况,当嵌入标签和CSS的单选选项包含类似

label input {
    vertical-align: bottom;
}
Run Code Online (Sandbox Code Playgroud)

为了确保收音机的正确垂直对齐。


sla*_*der 5

正如大多数人所说,这两种方法确实有效,但我认为只有第一种方法应该可行。从语义上讲严格,标签不“包含”输入。我认为,标记结构中的包含(父/子)关系应反映视觉输出中的包含。也就是说,标记中围绕另一个元素的元素应在浏览器中围绕该元素绘制。因此,标签应该是输入的同级,而不是父级。因此,第二个选项是任意的并且令人困惑。阅读过Python Zen的每个人可能都会同意(扁平比嵌套更好,稀疏比密集更好,应该有一种-最好只有一种-显而易见的方式...)。

由于W3C和主要浏览器供应商的决定(允许“以您喜欢的方式”,而不是“以正确的方式”进行),今天的网络是如此混乱,我们开发人员必须处理纠结以及各种各样的旧代码。