前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS :indeterminate pseudo-class checkbox
CSS层叠与选择器

indeterminate 伪类什么时候生效?除了复选框还能用在哪?

:indeterminate 匹配处于「不确定」状态的表单控件。最常见的是复选框的半选状态——用 JavaScript 设置 checkbox.indeterminate = true 后就能匹配。没有 HTML 属性能触发它,只能通过 JS。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器
先看核心答案读代码示例
理解线索

三种元素的不确定状态

  1. 复选框JS 设置 indeterminate = true 后显示半选样式
  2. 单选按钮同名单选按钮组里没有任何一个被选中时匹配
  3. <progress>没有设置 value 属性时匹配,表示进度未知

复选框的 indeterminate 是纯视觉状态,不影响 checked 属性的值。用户点击一次后它就变成普通的选中或未选中。

核心回答

先记住这个答案

:indeterminate 匹配处于「不确定」状态的表单控件。对复选框来说,它的意思是「既不是选中也不是未选中」,视觉上显示为一个横杠而不是勾。这个状态只能通过 JavaScript 设置 checkbox.indeterminate = true,没有对应的 HTML 属性。除了复选框,同名单选按钮组里没有任何一个被选中时,以及没有 value 属性的 <progress> 元素,也会匹配 :indeterminate。

  • 复选框半选需要 JS 设置
  • 没有对应的 HTML 属性
  • 单选按钮组未选时也匹配
  • <progress> 没有 value 时也匹配

最常见的场景:全选按钮的半选状态

表格里经常有一个「全选」复选框。当列表中只选了一部分时,全选框既不该显示为「全选」也不该显示为「全不选」,这时就用半选状态来表示「部分选中」。

用 JS 控制半选样式CSS
/* 半选状态加灰色背景 */
input[type="checkbox"]:indeterminate {
  opacity: 0.6;
}

/* 选中状态正常显示 */
input[type="checkbox"]:checked {
  opacity: 1;
}

CSS 只管样式,真正触发半选状态需要 JavaScript。在列表的选中数量变化时判断:全选了就 selectAll.checked = true,一个没选就 selectAll.checked = false,选了一部分就 selectAll.indeterminate = true。

单选按钮组的不确定状态

同名的一组单选按钮(name 属性相同),如果页面加载时没有任何一个预设了 checked,那这组里的每个单选按钮都会匹配 :indeterminate。一旦用户选择了任何一个,整组的 :indeterminate 就全部失效,因为这时有了明确的选中项。

这在表单验证场景里很有用。比如用户必须选择一个选项才能继续,可以用 :indeterminate 给这组单选按钮加一个提示样式,告诉用户「这里还没选」。

progress 元素的加载中状态
<progress> 标签没有设置 value 属性时也匹配 :indeterminate,浏览器通常会把它显示为一个来回滚动的条形动画,表示「正在加载但不知道进度」。给这种状态的进度条自定义样式,就可以用 progress:indeterminate。
回答前,多想一步

容易答错的地方

以为有 HTML 属性能设置 indeterminate
没有。HTML 里写 <input type="checkbox" indeterminate> 是无效的,浏览器不认这个属性。只能通过 JavaScript 的 element.indeterminate = true 来设置。这和 checked 属性不同,checked 既有 HTML 属性也有 JS 属性。
以为 indeterminate 影响 checked 的值
indeterminate 是纯视觉状态,不影响 checked 属性的值。一个复选框可以同时 checked = true 和 indeterminate = true,这时视觉上显示半选横杠,但提交表单时按 checked = true 算。用户点击一次后,indeterminate 自动变成 false,不管之前 checked 是什么。
试着用自己的话回答

面试官还会怎么问?

用户点击半选状态的复选框后会变成什么?

变成普通的选中状态。浏览器会把 indeterminate 设为 false,checked 变为 true。再次点击就变成未选中。半选状态只能通过 JavaScript 重新设置,用户的点击操作不会恢复它。

怎么统一不同浏览器上半选复选框的样式?

不同浏览器的默认半选样式差别很大。想统一外观,最常见的做法是用 appearance: none 去掉原生样式,然后用 ::before 伪元素和 CSS 画一个横杠。或者用自定义图标替代原生复选框。

indeterminate 和 aria-checked="mixed" 有什么关系?

aria-checked="mixed" 是可访问性属性,告诉屏幕阅读器这个复选框处于混合状态。:indeterminate 是 CSS 伪类,控制视觉样式。两者应该同步使用:设置 indeterminate = true 的同时设置 aria-checked="mixed",让视觉和语义一致。

从一道题,走向一组知识

把知识连起来

层叠与选择器

focus-within 伪类有什么用?和 focus 的区别是什么?

分组容器可用 :focus-within 显示当前键盘焦点,配合混合态复选框提供清楚反馈。

层叠与选择器

required 和 optional 伪类怎么用?匹配哪些表单元素?

:indeterminate 与 :required 都根据表单控件状态匹配,但前者表示混合选择而非必填。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 最常见的场景:全选按钮的半选状态
  3. 单选按钮组的不确定状态
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑