前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
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 :enabled :disabled form elements
CSS层叠与选择器

:enabled 和 :disabled 能作用于哪些元素?给链接加 disabled 有效吗?

:enabled 和 :disabled 只认"可禁用"的表单元素,比如 <input> 和 <button>。<a> 标签不属于可禁用类型,即使手动写上 disabled 属性,:disabled 也不会匹配它。

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

可禁用元素的判定

  1. 表单控件<input> 和 <button> 等可交互元素天然支持 disabled
  2. <fieldset>禁用后内部所有控件跟着禁用,第一个 <legend> 内的除外
  3. 非表单元素<a> 和 <div> 不属于可禁用类型,两个伪类都匹配不到

:enabled 不等于"没写 disabled"。一个 <div> 既不匹配 :enabled 也不匹配 :disabled,因为它根本不在可禁用元素的范围内。

核心回答

先记住这个答案

:enabled 和 :disabled 是一对状态伪类,专门选中可禁用的表单元素。HTML 规范里的可禁用元素主要是五种表单控件,分别是 <input> 和 <button>,以及 <select> 和 <textarea>,还有 <fieldset>。只有这些元素才响应 disabled 属性,也只有它们能被这对伪类匹配。<a> 标签不属于可禁用类型,即使手动写上 disabled,:disabled 对它也不起作用。

  • 只对可禁用的表单元素生效
  • <a> 写 disabled 不会被匹配
  • <fieldset> 禁用会连带子控件
  • :enabled 要求元素本身可禁用

表单控件和链接的对比

拿一个输入框和一个链接做对比,就能直接看到效果。输入框加上 disabled 后变灰,:disabled 的样式生效;链接写了 disabled 属性,:disabled 的样式完全不会应用。

给输入框和链接分别加 disabledHTML
<style>
  input:enabled  { border: 2px solid green; }
  input:disabled { border: 2px solid gray; opacity: 0.5; }
  /* 下面这条永远不会生效 */
  a:disabled { color: red; text-decoration: line-through; }
</style>

<input type="text" placeholder="正常输入框">
<input type="text" disabled placeholder="已禁用">
<a href="/page" disabled>这个链接写了 disabled</a>

打开开发者工具看 Styles 面板,input:disabled 的规则正常命中第二个输入框,而 a:disabled 虽然写了,但不会被任何元素匹配。链接看起来还是正常的蓝色可点击状态,disabled 属性在这里纯粹是多余的。 原因在于 HTML 规范里 <a> 没有 disabled 这个合法属性。浏览器虽然不会报错,但属性解析器不会把它当回事。CSS 选择器引擎在判断 :disabled 时,先看元素是不是可禁用类型,<a> 不在名单上,直接跳过。

<fieldset> 的连锁禁用

<fieldset> 比较特殊,它自己是可禁用元素,而且禁用之后,里面所有的表单控件都跟着变成禁用状态,不用一个个加 disabled。这在表单的"只读模式"场景下很有用,比如用户查看已提交的订单时,整个表单禁用就行。

禁用 <fieldset> 后子控件的表现HTML
<fieldset disabled>
  <legend>收货信息(不可编辑)</legend>
  <input type="text" value="张三">
  <select>
    <option>北京</option>
  </select>
  <button type="button">修改</button>
</fieldset>

这里 <input> 和 <select> 还有 <button> 都没写 disabled,但因为外面的 <fieldset> 禁用了,它们全部变成禁用状态,:disabled 都能匹配到。 有一个例外:第一个 <legend> 里面的控件不受影响。如果把输入框放在 <legend> 里,它依然是可用的。这个设计是为了让用户还能操作表单组的标题部分,比如切换展开或折叠。

回答前,多想一步

容易答错的地方

以为给 <a> 写了 disabled 就能用 :disabled 选中
disabled 对 <a> 不是合法属性。浏览器不会因为手动加了它就让链接变成禁用状态。想让链接看起来不可点击,需要用其它方式:加 pointer-events: none 阻止鼠标点击,加 aria-disabled="true" 告诉辅助技术,再用属性选择器 [aria-disabled="true"] 写样式。
以为 :enabled 等于"没加 disabled"
:enabled 只匹配可禁用元素中没有被禁用的那些。一个 <div> 既不匹配 :enabled 也不匹配 :disabled,因为它压根不在可禁用元素的范围里。写 div:enabled 不会选中任何 <div>。
试着用自己的话回答

面试官还会怎么问?

怎么用纯 CSS 让链接看起来被禁用了?

给链接加 aria-disabled="true" 属性,然后用 a[aria-disabled="true"] 选择器设置灰色文字和 pointer-events: none。视觉上不可点击,屏幕阅读器也能识别。不过键盘用户按 Enter 还是能触发导航,真正拦截需要在 JavaScript 里处理。

:disabled 和 [disabled] 属性选择器有什么区别?

:disabled 只匹配可禁用元素,语义更准确。[disabled] 是属性选择器,任何元素只要写了 disabled 属性都会被选中,包括 <a disabled> 这种不合法的用法。正常表单场景下两者效果一样,但 [disabled] 会"误选"非表单元素。

<fieldset> 禁用后,里面嵌套的 <fieldset> 还能单独启用吗?

不能。外层 <fieldset> 设了 disabled,里面所有控件都是禁用的,即使内层 <fieldset> 没写 disabled 也一样。内层 <fieldset> 本身也会被 :disabled 匹配。要让部分控件可用,只能把它们放到外层的第一个 <legend> 里面。

从一道题,走向一组知识

把知识连起来

层叠与选择器

:first-child 和 :first-of-type 选中的元素有什么不同?

:first-child 和 :first-of-type 也是容易混淆的伪类对,放在一起对比能加深对伪类匹配逻辑的理解。

动画与视觉

动画暂停期间修改了 @keyframes,恢复播放后表现会变吗?

动画暂停时修改关键帧的表现也取决于元素的内部状态,同样是"条件满足才生效"的思路。

参考资料

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

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

本题目录
  1. 先记住这个答案
  2. 表单控件和链接的对比
  3. <fieldset> 的连锁禁用
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

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

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