【问题标题】:How to create a checkbox with a clickable label?如何创建带有可点击标签的复选框?
【发布时间】:2011-09-11 17:21:47
【问题描述】:

如何创建一个带有可点击标签的 HTML 复选框(这意味着点击标签会打开/关闭复选框)?

【问题讨论】:

标签: html checkbox click label


【解决方案1】:

方法一:包装标签标签

将复选框包裹在label 标签内:

<label><input type="checkbox" name="checkbox" value="value">Text</label>

方法二:使用for属性

使用for 属性(匹配复选框id):

<input type="checkbox" name="checkbox" id="checkbox_id" value="value">
<label for="checkbox_id">Text</label>

注意:ID 在页面上必须是唯一的!

说明

由于其他答案未提及,标签最多可包含 1 个输入并省略 for 属性,并假定它用于其中的输入。

摘自w3.org(重点强调):

[for 属性] 明确地将正在定义的标签与另一个控件相关联。如果存在,此属性的值必须与同一文档中某个其他控件的 id 属性的值相同。 如果不存在,则定义的标签与元素的内容相关联。

要将标签与另一个控件隐式关联,控件元素必须在 LABEL 元素的内容内。在这种情况下,LABEL 可能只包含 一个 控制元素。标签本身可以位于关联控件之前或之后。

使用这种方法比for有一些优势:

  • 无需为每个复选框分配id(太棒了!)。

  • 不需要在&lt;label&gt;中使用额外的属性。

  • 输入的可点击区域也是标签的可点击区域,因此没有两个单独的可以点击的地方可以控制复选框——只有一个,无论&lt;input&gt;和实际标签文本相距多远,而且没有不管你应用什么样的 CSS。

带有一些 CSS 的演示:

label {
 border:1px solid #ccc;
 padding:10px;
 margin:0 0 10px;
 display:block; 
}

label:hover {
 background:#eee;
 cursor:pointer;
}
<label><input type="checkbox" />Option 1</label>
<label><input type="checkbox" />Option 2</label>
<label><input type="checkbox" />Option 3</label>

【讨论】:

  • 喜欢它,但请再次编辑。这仅适用于复选框。我们不要鼓励人们用标签包装他们的其他输入,因为这会破坏网格系统并且移动响应将更难实现
  • @Wesley。 getbootstrap.com/css/#forms - 不要用
  • @John 是专门用于引导程序的标记指南。如果您不使用框架,或者使用不同的框架,那应该完全没问题。感谢您的回复。
  • @约翰。在您链接的页面上,引导程序示例都用标签包装复选框,我根本没有看到您指出的任何警告,也许它不再与最新的引导程序相关。
  • 正如我今天所了解的,不要混合使用方法 1 和方法 2。如果将复选框包装在标签中并包含 for,那么单击标签不会触发复选框。跨度>
【解决方案2】:

只需确保标签与输入相关联。

<fieldset>
  <legend>What metasyntactic variables do you like?</legend>

  <input type="checkbox" name="foo" value="bar" id="foo_bar">
  <label for="foo_bar">Bar</label>

  <input type="checkbox" name="foo" value="baz" id="foo_baz">
  <label for="foo_baz">Baz</label>
</fieldset>

【讨论】:

  • 我对你给这两个复选框赋予相同的名称和不同的值这一事实感到困惑。这是故意的吗?
  • @LarsH — 是的,这就是您创建复选框组的方式。
  • 谢谢。我在看w3.org/wiki/HTML/Elements/input/checkbox,在这方面没有帮助。
  • 使用 PHP,不会让 $_POST['foo'] 总是同时拥有两个最大值之一吗?即使两个都检查了。什么是复选框组?
  • @JeromeJ:为了让 php 正确处理它,您必须在名称中添加方括号,例如:&lt;input type="checkbox" name="foo[]" value="bar" ...&gt;。这将为您提供一个数组,其中包含所有 选中 框(具有此名称)的值。例如,$_POST['foo'][0] 可能是 bar$_POST['foo'][1] 可能是 baz(如果两者都被选中)。
【解决方案3】:

您还可以使用 CSS 伪元素(分别)从所有复选框的值属性中选择和显示标签。
编辑:这仅适用于基于 webkit 和 blink 的浏览器(Chrome (ium)、Safari、Opera....) 以及大多数移动浏览器。此处不支持 Firefox 或 IE。
这可能仅在将 webkit/blink 嵌入到您的应用时才有用。

所有伪元素标签都是可点击的。

[type=checkbox]:after {
  content: attr(value);
  margin: -3px 15px;
  vertical-align: top;
  white-space: nowrap;
  display: inline-block;
}
&lt;input type="checkbox" value="My checkbox label value" /&gt;

演示:http://codepen.io/mrmoje/pen/oteLl, + The gist of it

【讨论】:

  • 是的。壁虎和三叉戟和壁虎似乎不喜欢这样。这仅适用于 Webkit 和 Blink。我会更新答案
  • 投反对票。虽然有可能,但这是一种糟糕的方式 - 不适用于许多浏览器,不利于可访问性。
  • 撇开兼容性问题不谈,这个解决方案的语义不如最佳答案,因为 之间的标记没有直接关联
  • “它在 Webkit/Blink 上工作”闻起来像一个使用 (stackoverflow.com/questions/2587669/…) 的错误,因此它可能随时停止工作。
【解决方案4】:
<label for="vehicle">Type of Vehicle:</label>
<input type="checkbox" id="vehicle" name="vehicle" value="Bike" />

【讨论】:

    【解决方案5】:
    <label for="myInputID">myLabel</label><input type="checkbox" id="myInputID" name="myInputID />
    

    【讨论】:

    • 因为它可能会让一些读者感到困惑,所以您应该将name 属性的值更改为不同于forid 属性中存在的值,因为这两个是相关,而name 不是(尽管我相信它仍然是强制性的)。
    【解决方案6】:

    它也有效:

    <form>
        <label for="male"><input type="checkbox" name="male" id="male" />Male</label><br />
        <label for="female"><input type="checkbox" name="female" id="female" />Female</label>
    </form>
    

    【讨论】:

    • 您可以在示例中省略forid 属性,因为label 标签内只有一个输入元素。
    【解决方案7】:

    这应该对你有帮助:W3Schools - Labels

    <form>
      <label for="male">Male</label>
      <input type="radio" name="sex" id="male" />
      <br />
      <label for="female">Female</label>
      <input type="radio" name="sex" id="female" />
    </form>
    

    【讨论】:

      【解决方案8】:

      label {
       border:1px solid #ccc;
       padding:10px;
       margin:0 0 10px;
       display:block; 
      }
      
      label:hover {
       background:#eee;
       cursor:pointer;
      }
      <label><input type="checkbox" />Option 1</label>
      <label><input type="checkbox" />Option 2</label>
      <label><input type="checkbox" />Option 3</label>

      【讨论】:

        【解决方案9】:
        <label for="my_checkbox">Check me</label>
        <input type="checkbox" name="my_checkbox" value="Car" />
        

        【讨论】:

          【解决方案10】:

          使用label 元素和for 属性将其与复选框关联:

          &lt;label for="myCheckbox"&gt;Some checkbox&lt;/label&gt; &lt;input type="checkbox" id="myCheckbox" /&gt;

          【讨论】:

            【解决方案11】:

            在带有复选框的 Angular 材质标签中

            <mat-checkbox>Check me!</mat-checkbox>
            

            【讨论】:

              【解决方案12】:

              使用这个

              <input type="checkbox" name="checkbox" id="checkbox_id" value="value">
              <label for="checkbox_id" id="checkbox_lbl">Text</label>
              
              
              $("#checkbox_lbl").click(function(){ 
                  if($("#checkbox_id").is(':checked'))
                      $("#checkbox_id").removAttr('checked');
                  else
                     $("#checkbox_id").attr('checked');
                  });
              });
              

              【讨论】:

              • 不需要使用 JavaScript 来执行此操作。它内置在 HTML 中。
              • @LasseBunk,如果它只是 JavaScript 就好了,但它需要整个 jQuery 库才能工作。让我们看看是否有人可以提出 Angular 2 解决方案。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-08-13
              • 1970-01-01
              • 1970-01-01
              • 2011-01-16
              • 2011-06-08
              • 1970-01-01
              相关资源
              最近更新 更多