转载地址:https://css-tricks.com/indeterminate-checkboxes/
Checkbox inputs can only have two states: checked or unchecked. They can have any value, but they either submit that value (checked) or don't (unchecked) with a form submission. The default is unchecked. You can control that in HTML like this:
<input type="checkbox">
<input type="checkbox" checked="checked" />
<input type="checkbox" checked>
Visually, there are actually three states a checkbox can be in: checked, unchecked, or indeterminate. They look like this:
Here are some things to know about indeterminate checkboxes:
You can't make a checkbox indeterminate through HTML. There is no indeterminate attribute. It is a property of checkboxes though, which you can change via JavaScript.
var checkbox = document.getElementById("some-checkbox");
checkbox.indeterminate = true;
or jQuery style:
$("#some-checkbox").prop("indeterminate", true); // prop is jQuery 1.6+
The indeterminate state is visual only. The checkbox is still either checked or unchecked as a state. That means the visual indeterminate state masks the real value of the checkbox, so that better make sense in your UI!
Like the checkboxes themselves, indeterminate state looks different in different browsers. Here's Opera 11.50 on Mac:
The reason I'm writing this at all is because I just had a use case come up for this state: nested checkboxes. Each checkbox may have child checkboxes. If all those children are checked, it may be checked. If none are checked, it is unchecked. If someof them are checked, then it's in an indeterminate state (in this case symbolically meaning "partially" checked).
View Demo Download Files
This demo isn't perfect. It only checked one level "up" for determining indeterminate state. Ideally it would check up recursively until the top. If you wanna fix it to do that, I'll update the code and credit you.
Jon Stuebe was messing around with the idea of rotating the state between unchecked, indeterminate, and checked with a click. Here's some jQuery to do that:
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);
}
});
View Demo
Reader Casual Trash sent me in a library-free and far more succinct version of rotating through all three visual states which utilizes the readonly attribute that checkbox inputs can have.
<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;
}
View Demo