是否有关于标签和输入HTML元素嵌套的最佳实践?

经典的方式:

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

or

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

当前回答

一个值得注意的“gotcha”指示你永远不应该在<label>元素中包含一个以上的输入元素,它具有显式的“for”属性,例如:

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

虽然对于表单特性来说,自定义文本值是单选按钮或复选框的次要属性,但label元素的点击聚焦功能会立即将焦点转移到id在其'for'属性中显式定义的元素上,这使得用户几乎不可能单击包含的文本字段来输入值。

就我个人而言,我尽量避免使用带有输入子元素的标签。从语义上讲,标签元素包含标签本身以外的内容似乎不合适。如果在标签中嵌套输入是为了达到某种美学效果,那么应该使用CSS。

其他回答

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

他们说这两种方法都可以。他们将这两个方法描述为显式(使用“for”和元素的id)和隐式(将元素嵌入到标签中):

明确:

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

隐式:

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

一个值得注意的“gotcha”指示你永远不应该在<label>元素中包含一个以上的输入元素,它具有显式的“for”属性,例如:

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

虽然对于表单特性来说,自定义文本值是单选按钮或复选框的次要属性,但label元素的点击聚焦功能会立即将焦点转移到id在其'for'属性中显式定义的元素上,这使得用户几乎不可能单击包含的文本字段来输入值。

就我个人而言,我尽量避免使用带有输入子元素的标签。从语义上讲,标签元素包含标签本身以外的内容似乎不合适。如果在标签中嵌套输入是为了达到某种美学效果,那么应该使用CSS。

来自W3的HTML4规范:

标签本身可以放置在标签的前面、后面或周围 相关的控制。


<label for =“姓氏”>姓氏</label> <输入类型=“文本” id=“姓氏” />

or

<输入类型=“文本” id=“姓氏” /> <label for =“姓氏”>姓氏</label>

or

<标识> <input type="text" name="lastname" /> 姓 < / >标签

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

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

我非常喜欢将元素包装在<label>中,因为我不需要生成id。

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

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

如果你点击标签和输入之间的空格,它只在标签包含输入时激活输入。

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

div { 边框:1px纯黑色; } 标签{ 边框:1px纯黑色; 填充:5 px; } 输入{ margin-right: 30 px; } 内< p >: < / p > <标识> <input type="checkbox" /> 标签。在我和复选框之间单击。 < / >标签 外的< p >: < / p > <input type="checkbox" id="check" /> <标签= >“查看”标签。</label> .在我和复选框之间单击

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

更容易点击 不太清楚事情的开始和结束

引导复选框v3.3示例使用了里面的输入:http://getbootstrap.com/css/#forms遵循它们可能是明智的。但是他们在4.0版本改变了主意https://getbootstrap.com/docs/4.0/components/forms/#checkboxes-and-radios所以我不知道什么是明智的了:

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

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