关于html:我应该将输入元素放在标签元素中吗?

Should I put input elements inside a label element?

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

经典方式:

1
2
<label for="myinput">My Text</label>
<input type="text" id="myinput" />

要么

1
2
3
<label for="myinput">My Text
   <input type="text" id="myinput" />
</label>


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

1
2
<label for="lastname">Last Name</label>
<input type="text" id="lastname" />

要么

1
2
<input type="text" id="lastname" />
<label for="lastname">Last Name</label>

要么

1
2
3
4
<label>
   <input type="text" name="lastname" />
   Last Name
</label>

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

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


我更喜欢

1
2
3
4
5
6
7
8
9
<label>
  Firstname
  <input name="firstname" />
</label>

<label>
  Lastname
  <input name="lastname" />
</label>

过度

1
2
3
4
5
<label for="firstname">Firstname</label>
<input name="firstname" id="firstname" />

<label for="lastname">Lastname</label>
<input name="lastname" id="lastname" />

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

但这是我想的味道问题。

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

1
2
3
4
5
6
7
8
9
<label>
  <span>Firstname</span>
  <input name="firstname" />
</label>

<label>
  <span>Lastname</span>
  <input name="lastname" />
</label>

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


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

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


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>

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

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

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

Checkboxes and radios use are built to support HTML-based form validation and provide concise, accessible labels. As such, our s and s are sibling elements as opposed to an within a . This is slightly more verbose as you must specify id and for attributes to relate the and .

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


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

1
2
3
4
5
6
7
8
9
10
11
<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" />

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


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

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

明确:

The for attribute associates a label with another control explicitly: the value of the for attribute must be the same as the value of the id attribute of the associated control element.

隐式:

To associate a label with another control implicitly, the control element must be within the contents of the LABEL element. In this case, the LABEL may only contain one control element.


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

首先,限制可以包含哪些元素。例如,如果不在内,则只能在和标签文本之间放置

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


一个值得注意的"陷阱"规定你不应该在

1
2
3
4
5
<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>

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

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


正如大多数人所说的那样,两种方式确实有效,但我认为只有第一种应用。由于语义严格,标签不会"包含"输入。在我看来,标记结构中的包含(父/子)关系应反映视觉输出中的包含。即,应在浏览器中围绕该标记绘制围绕标记中的另一个元素的元素。根据这个,标签应该是输入的兄弟,而不是它的父母。因此,第二个选项是任意的,令人困惑。每个读过Python之禅的人都可能会同意(Flat比嵌套好,Sparse比密集更好,应该有一个 - 最好只有一个 - 明显的方式来做...)。

由于W3C和主要浏览器供应商的决定(允许"你喜欢哪种方式去做",而不是"以正确的方式去做")是因为今天网络如此混乱,我们的开发人员必须应对纠结以及各种遗留代码。


我通常会选择前两个选项。我已经看到了使用第三个选项的场景,当无线电选择嵌入标签和css包含类似的东西时

1
2
3
label input {
    vertical-align: bottom;
}

以确保无线电的正确垂直对齐。


我非常喜欢在中包含元素,因为我不必生成id。

我是一名Javascript开发人员,React或Angular用于生成可供我或其他人重用的组件。然后很容易在页面中复制一个id,导致奇怪的行为。


参考WHATWG(编写表单的用户界面),将输入字段放在标签内是没有错的。这样可以节省代码,因为不再需要label中的for属性。