复选框输入只能有两种状态:选中或未选中。它们可以具有任何值,但它们要么提交该值(选中),要么不提交(未选中)以及表单提交。默认状态为未选中。您可以像这样在 HTML 中控制它
<!-- Default to unchecked -->
<input type="checkbox">
<!-- Default to checked, XHTML -->
<input type="checkbox" checked="checked" />
<!-- Default to checked, HTML5 -->
<input type="checkbox" checked>
从视觉上看,复选框实际上可以处于三种状态:选中、未选中或不确定。它们看起来像这样

以下是一些关于不确定复选框的注意事项
您无法通过 HTML 使复选框处于不确定状态。 没有不确定属性。但它是复选框的一个属性,您可以通过 JavaScript 更改它。
var checkbox = document.getElementById("some-checkbox");
checkbox.indeterminate = true;
或 jQuery 样式
$("#some-checkbox").prop("indeterminate", true); // prop is jQuery 1.6+
不确定状态仅为视觉状态。 复选框作为状态仍然处于选中或未选中状态。这意味着视觉上的不确定状态掩盖了复选框的真实值,因此在您的 UI 中最好有意义!
与复选框本身一样,不确定状态在不同的浏览器中看起来也不同。 这是 Mac 上的 Opera 11.50

用例
我写这篇文章的原因是,我刚刚遇到了这种情况:嵌套复选框。每个复选框可能都有子复选框。如果所有这些子复选框都被选中,则它可能被选中。如果没有选中,则未选中。如果某些复选框被选中,则它处于不确定状态(在本例中象征性地表示“部分”选中)。

以下是在 jQuery 中的示例
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 不确定复选框。
以下是 TheNotary 提供的 另一个 jQuery 版本。
以下是由 Jakob Eriksen 提供的纯 JavaScript 版本
查看 CodePen 上 jakob-e (@jakob-e) 编写的
不确定复选框(原生 JS)
在 CodePen 上。
以及来自 Alvaro Montoro、Bramus、Gridbuilder、Lewin Probst 和 Jason Wilson 的一些替代方法。
使用 Stephen Margheim 的 StimulusJS
查看 CodePen 上 Stephen Margheim (@smargh) 编写的
复选框族
在 CodePen 上。
在状态之间轮换
Jon Stuebe 正在尝试通过点击在未选中、不确定和选中状态之间轮换的想法。以下是一些 jQuery 代码来实现此功能
var $check = $("input[type=checkbox]"), el;
$check
.data('checked',0)
.click(function(e) {
el = $(this);
switch(el.data('checked')) {
// unchecked, going indeterminate
case 0:
el.data('checked',1);
el.prop('indeterminate',true);
break;
// indeterminate, going checked
case 1:
el.data('checked',2);
el.prop('indeterminate',false);
el.prop('checked',true);
break;
// checked, going unchecked
default:
el.data('checked',0);
el.prop('indeterminate',false);
el.prop('checked',false);
}
});
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 在不确定的复选框之间轮换。
读者 Casual Trash 为我发送了一个无库且更简洁的版本,用于遍历所有三种视觉状态,该版本利用了复选框输入可以具有的readonly
属性。
<!-- Inline click handler, just for demo -->
<input type="checkbox" id="cb1" onclick="ts(this)">
function ts(cb) {
if (cb.readOnly) cb.checked=cb.readOnly=false;
else if (!cb.checked) cb.readOnly=cb.indeterminate=true;
}
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的 在不确定的复选框之间轮换。
谢谢,
几天前我试图找到如何实现它。
已决定像 Gmail 一样:opacity: .5;
现在考虑重写代码。
感谢分享,我以前不知道 :)
您在开头说复选框只有两个值。但是,复选框也有“value”属性。您的意思是“状态”之类的东西吗?
http://w3schools.com/html5/att_input_value.asp
我同意……克里斯犯了一个小错误,我相信他是在匆忙中犯的。
但是,很棒的课程。
此功能的浏览器支持情况如何?
我做了一些测试,发现它可以追溯到 IE 6
PS:不错的教程 Chris,我最近在其他地方看到过,但没有像这个教程这么详细。
出于好奇:在此示例中,不确定的复选框将返回什么值?
不确定属性与选中/未选中或值属性无关。在不确定状态下,值为 42 的选中复选框将返回 42,值为 37 的不确定未选中复选框将不返回任何内容。
我认为 Chrome 不允许我们这样做 :/
在我的 Chrome 中运行良好
是的,在 Chrome 中确实不起作用。
在我的 Chrome 中运行良好?您是否拥有最新版本的 Chrome?
当然 :) Chrome 版本 – 13.0.782.112 m(适用于 Windows)
在您的演示中,Opera 中复选框看起来如此难看的原因为此 CSS 规则
如果您尝试在 Opera 中设置复选框(以及单选按钮)的样式,它们将呈现出难看的“Windows 98”外观。
为什么您使用 .prop() 而不是 .attr()?
我不是这方面的专家——
.prop()
对我来说是新的——但以下是 文档 中的内容以前不知道。
非常感谢分享。
哇,太疯狂了!我根本不知道浏览器支持这个功能。
谢谢!
嗨,克里斯,
我不知道这是否正常
首先选中“巨人”,然后取消选中“安德烈”和“保罗·班扬”,然后看看发生了什么
请参阅最后一句话。
好吧,我在这里看到了很多逻辑……如果没有任何子元素被选中,那么父元素就没有理由被选中。
这是一个非常合乎逻辑的限制……
使用复选框和其他表单元素已有 10 多年了,但我猜每天都会学到新东西!
我见过的此功能的最佳用例是在 git-tower 应用程序中。当您仅将文件的一部分暂存时,它们会使用不确定的复选框。
这是一个显示它的屏幕截图
http://bit.ly/ornzBG
谢谢!每天学习新东西!
您学习新东西……有时。
太棒了,以前不知道这个技巧,
我的 Javascript/jQuery 知识非常有限,但我还是想尝试递归地修改它。它仍然存在一些问题。其他人可能可以做得更好。
我一直在思考另一种方法
- 使用 jQuery 的事件委托
$(‘ul’).delegate(‘li’, ‘click’, function(event) {
// this == li 元素
});
- 一个多维数组,跟踪所有 <li> 的当前状态,默认/开始时所有列和行都为 0,点击时更改
以便提供一种机制来向所有需要它的 li 添加或删除不确定的类名。
我看看明天能否整理一些代码。
我的天哪!我甚至不知道这是可能的!太棒了 :D
Chris,
“短内容”的标签似乎错了
<label for="tall">短内容</label>
不应该为
<label for="short">...
吗?无论如何,点击“短内容”文本会激活“高内容”复选框。
这只是一个错别字 :)
如果将其更改为“short”(显然是在第二个实例中),它将按预期工作;也就是说,它会选择所有“短内容”。
已修复。
这是我的尝试
http://jsfiddle.net/davishmcclurg/fzELD/
在我的运行 Android 的 Nexus One 上似乎不起作用。
很棒的文章和网站的全新设计,Chris!非常棒的设计。
新网站看起来不错,但我不喜欢按钮和彩虹悬停效果。
漂亮的新设计!
我想知道是否可以通过任何方式在表单提交后检索该不确定的状态。
这在解释某种调查以确定复选框是否被点击(设置为真或假)或完全被忽略,因此甚至没有点击一次时可能派上用场。
Chris,您对此有任何信息吗?
我相信 wufoo 在这方面也会获得价值。;)
由于您必须使用 JS 设置它,因此您必须以某种方式更改复选框的实际值。例如,value = value + “-indeterminate”。
是的,
我猜一个变通方法可以解决问题,因为您已经在使用 JS 进行调整了。
也许 HTML6 会做到这一点。;)
感谢您的快速回复!
具有 2 个以上状态的布尔输入字段?
这几乎和除以零一样糟糕!
它在 Firefox 和 IE 中运行良好,但我在 Chrome 中遇到问题。是否有任何快速修复方法可用?
看起来很棒,我注意到的唯一一点是,如果您点击不确定的复选框,它会失去其“绿色”填充/状态,我认为这不是期望的行为?
您好,
我想找到相同的功能,但使用“init”函数。然后,如果某些复选框被“预”选中(预填充表单,例如)=> 它在任何更改之前确定父复选框的状态,并具有从低到高的优先级。
有什么想法吗?
非常感谢!!!
修复了与不正确的安装属性 indeterminate 相关的错误并优化了代码。现在它体积更小,并删除了无用的循环。
如何为简单的 Html 实现。
<input type="checkbox" value="something" indeterminate/>
这不起作用
<input type="checkbox" value="something" indeterminate="true"/>
或者这个
<input type="checkbox" value="something" indeterminate="indeterminate"/>
有什么方法可以使其工作。
代码在我的代码的一个场景中失败了,不知道为什么……
http://jsfiddle.net/sameerengg/84ajt/6/
请帮忙。
找到了问题,ul 被额外删除了,现在运行良好……
我在 IE 中还发现了一个问题,其中我们有中间选中状态
当您更改它时,不会触发 change 事件。我将其更改为 click 事件,它对我有用。