兴趣标签、通知渠道、批量记录;选项彼此不冲突,用户可任意组合,用 checkbox。
界面与交互 · 操作与输入
复选框Checkbox
可多选的勾选框,选项之间互不冲突;父项「全选」会在全选 / 半选 / 未选三态间随子项联动。
勾一勾,看父项在全选 / 半选 / 未选间切换
批量选择要归档的文件。勾或取消任意一行,父项「全选」、计数 chip 和主操作「归档所选」会同步变化——半选是复选框最关键的状态。
场景:批量勾选要归档的文件。勾或取消任意一行,看父项「全选」、计数 chip 和主操作「归档所选」如何同步变化——结果长在物件上,不只靠底部说明。
已选数量2/4父项状态半选主操作可提交本次已归档0 项
对照提示:遮住下面这段说明,只看上面的物件——父项方块的 全选 / 半选 / 未选、每行是否带勾、计数 chip 的 N / 总数、主操作的 灰禁 / 高亮,都能直接读出当前结果。
对照:勾选 2/4,父项「全选」显示半选(indeterminate)。原因:部分选中既不是全选也不是未选,半选是独立的状态。下一步:勾完剩余项父项会切到已全选;或直接点父项一键补齐。
实验台教会你的几件事
这些状态都能在上方面板直接看到,这里只做命名和总结。
- 多选互不冲突勾选「设计稿」不会取消「产品需求」;每项独立成立,与单选框的互斥完全相反。
- 父项三态联动子项全勾则父项已全选;部分勾则父项半选(indeterminate);都没勾则父项未选。
- 半选是独立状态indeterminate 既不是选中也不是未选中,要用 ref 手动设置,并用 aria-checked="mixed" 告诉读屏。
- 父项一键全选 / 清空点父项能把剩余项一键勾上,也能一键清空;不必逐项点击。
- 必选启停主操作据已选数量启停:0 项时禁用,≥1 项才可提交——这就是 checkbox 的必选校验。
什么时候用 checkbox,什么时候换 radio / switch
判断依据是「选项之间是否互斥、能否同时成立」。
表格、文件、购物车多条记录;父项「全选」需要反映全选、半选与未选,是 checkbox 的招牌场景。
配送方式、性别、套餐等级——选一个其余自动取消,应该用单选框 radio。
邮件通知、深色模式——即时生效的单个开关用 switch;checkbox 更多用于表单提交时的多选。
怎么用:从 fieldset 到半选的最短路径
让父项、子项、计数和校验绑成一组,结果长在物件本身。
- 用 fieldset 加 legend 给一组 checkbox 命名,例如「选择要归档的文件」;不要只靠视觉间距暗示分组。
- 每个 input 用 label 包裹,或用 for 关联到控件 id,让整行可点,不必精确点小方框。
- 父项「全选」用 ref 在部分选中时设 indeterminate 为 true,并写 aria-checked="mixed";checked 只反映是否全选。
- 计数 chip 显示「已选 N / 总数」并随勾选实时更新,让用户一眼知道当前量级。
- 必选校验:提交时若 0 项,在组旁给出可读错误并禁用主操作,不要弹窗打断。
正反例:同一个批量列表,只改父项是否同步子项
目标都是让用户准确选中要归档的文件。差别只在父项是否反映子项的真实状态。
勾掉一项,父项立刻变成半选,计数从 4/4 变 3/4,用户一眼知道没全选;点父项能一键补齐或清空,主操作按已选数量启停。
这样做勾掉一项后父项仍显示已全选,用户以为还在全选状态,点提交才发现少归档了文件;想取消还得逐项点掉。
别这么省快速自测
批量列表里有 12 项,用户已勾选 7 项。顶部「全选」框应显示什么状态?
继续查证
术语的技术定义和行为以这些一手或权威资料为准。
下一步学
和本知识点经常一起出现的概念。