下面为你提供一份 HTML5 中 Checkbox(复选框)最全面、最系统的解析,涵盖所有常用属性、事件、样式、分组、多选框逻辑、全选/取消全选、禁用状态、美化技巧、可运行示例,以及开发中最常见的坑。读完可直接用于实战开发(移动端 + PC端)。


🟩 一、Checkbox 是什么?

在 HTML5 中,复选框使用:

<input type="checkbox">

用于选择 多个 可选项,允许勾选 0~N 个。


🧩 二、基本语法

<input type="checkbox" id="agree">
<label for="agree">我已阅读并同意协议</label>

  • 通过 for 绑定 label 点击文本也可选中
  • 所有 <input type="checkbox"> 默认是独立的

⚙️ 三、Checkbox 常用属性详解

属性说明示例
checked默认选中<input type="checkbox" checked>
disabled禁用(不可操作)<input disabled>
required表单提交必须至少选一个<input required>
name提交字段名<input name="hobby">
value提交值<input value="run">
form指定属于哪个 <form><input form="form1">

✔ 复选框 必须有 name 和 value 才能在表单提交中找到勾选内容。


🟨 四、Checkbox 的事件(JS)

事件说明
change勾选状态变化触发(最常用)
click点击触发(作用小于 change)
input部分浏览器兼容

示例:

document.getElementById("agree").addEventListener("change", function () {
    console.log(this.checked);
});


🔢 五、Checkbox 分组与多选

多个 checkbox 的 name 一样,就属于一个组:

&lt;input type="checkbox" name="hobby" value="read"> 阅读
&lt;input type="checkbox" name="hobby" value="run"> 跑步
&lt;input type="checkbox" name="hobby" value="music"> 音乐

提交后台得到:

"hobby": ["read", "run"]


🟦 六、实现“全选 / 全不选 / 反选”

这是 checkbox 最常见功能。

✔ 代码示例

&lt;input type="checkbox" id="checkAll"> 全选

&lt;hr>

&lt;input type="checkbox" class="item"> A
&lt;input type="checkbox" class="item"> B
&lt;input type="checkbox" class="item"> C

&lt;script>
const all = document.getElementById("checkAll");
const items = document.querySelectorAll(".item");

all.addEventListener("change", () => {
    items.forEach(i => i.checked = all.checked);
});

items.forEach(i => {
    i.addEventListener("change", () => {
        all.checked = [...items].every(i => i.checked);
    });
});
&lt;/script>


🎨 七、Checkbox 的 CSS 美化技巧

原生 checkbox 很难直接美化,因此通常使用“隐藏 input + 自定义样式”。

✔ 自定义美化实现方法

&lt;label class="cb">
    &lt;input type="checkbox">
    &lt;span class="box">&lt;/span> 自定义样式
&lt;/label>

&lt;style>
.cb input {
    display: none;
}
.cb .box {
    width: 18px;
    height: 18px;
    border: 2px solid #666;
    display: inline-block;
    border-radius: 4px;
    margin-right: 5px;
    vertical-align: middle;
}
.cb input:checked + .box {
    background: #4CAF50;
    border-color: #4CAF50;
}
&lt;/style>

效果:绿勾风格的复选框。


📱 八、移动端 Checkbox 注意点

问题解决方式
多指触摸 “点不到”click 替换成 touchstart
选中区域太小使用 label 扩大点击范围
样式变形使用 自定义样式(隐藏原生)

🧪 九、Checkbox 表单验证

HTML5 原生验证:

&lt;input type="checkbox" required>

若不勾选,submit 会自动阻止。


🔍 十、Checkbox 与 JavaScript 获取值

1. 获取是否选中:

checkbox.checked

2. 获取所有选中的值:

const values = [...document.querySelectorAll("input[name=hobby]:checked")]
               .map(i => i.value);
console.log(values);


⚠️ 十一、Checkbox 常见坑及解决

问题原因解决
点击 label 没反应for 与 id 不一致保证相同
默认勾选无效HTML 中写错为 checked="false"改成 checked
自定义样式失效忘记隐藏 inputdisplay:none
表单提交缺少字段忘写 value 或 name必须写

⭐ 十二、完整可运行示例(含全选、美化、事件)

&lt;!DOCTYPE html>
&lt;html>
&lt;head>
&lt;meta charset="UTF-8">
&lt;style>
/* 自定义美化 */
.cb { display: flex; align-items: center; margin: 6px 0; }
.cb input { display:none; }
.cb .box {
    width: 18px;
    height: 18px;
    border: 2px solid #777;
    border-radius: 4px;
    display: inline-block;
    margin-right: 6px;
    transition: .2s;
}
.cb input:checked + .box {
    background: #2196F3;
    border-color: #2196F3;
}
&lt;/style>
&lt;/head>

&lt;body>

&lt;h3>Checkbox 完整示例&lt;/h3>

&lt;label class="cb">
    &lt;input type="checkbox" id="all">
    &lt;span class="box">&lt;/span> 全选
&lt;/label>

&lt;hr>

&lt;label class="cb">
    &lt;input type="checkbox" class="item" value="A">
    &lt;span class="box">&lt;/span> 选项 A
&lt;/label>

&lt;label class="cb">
    &lt;input type="checkbox" class="item" value="B">
    &lt;span class="box">&lt;/span> 选项 B
&lt;/label>

&lt;label class="cb">
    &lt;input type="checkbox" class="item" value="C">
    &lt;span class="box">&lt;/span> 选项 C
&lt;/label>

&lt;div id="show" style="margin-top:15px;">&lt;/div>

&lt;script>
const all = document.getElementById("all");
const items = document.querySelectorAll(".item");
const show = document.getElementById("show");

all.addEventListener("change", () => {
    items.forEach(i => i.checked = all.checked);
    displayValues();
});

items.forEach(i => {
    i.addEventListener("change", () => {
        all.checked = [...items].every(i => i.checked);
        displayValues();
    });
});

function displayValues() {
    const values = [...document.querySelectorAll(".item:checked")]
                   .map(i => i.value);
    show.innerHTML = "选中:" + values.join(", ");
}
&lt;/script>

&lt;/body>
&lt;/html>