input:disabled不生效最常见原因是DOM未生成disabled属性,如框架未透传prop、type="hidden"被规范排除、JS仅设el.disabled=true未setAttribute、自定义控件不支持该伪类。
直接用 input:disabled 就能选中所有被禁用的原生输入框,但前提是它们真有 disabled 属性,且不是 type="hidden" 或自定义封装组件。
input:disabled 有时完全不生效最常见原因不是写法错,而是 DOM 根本没生成 disabled 属性。比如:
disabled 当作 prop 处理,但没透传到底层 <input> 标签上<input type="hidden" disabled> —— 浏览器规范明确排除它,:disabled 不匹配el.disabled = true,却没调用 el.setAttribute('disabled', ''),导致属性缺失<my-input> 或 div 模拟的输入框,:disabled 压根不认input:disabled 和 input[disabled] 的实际区别两者视觉效果常一样,但语义和触发机制不同:
input:disabled 是语义伪类,只响应浏览器识别的“禁用状态”——比如 JS 设置 el.disabled = true 后样式立刻更新input[disabled] 是纯属性匹配,只要 HTML 字符串里写了 disabled 就生效,哪怕元素本身不支持禁用(如 <div disabled>)input:disabled;只有在框架透传不可控、或需兼容 IE8+ 时才退回到 [disabled]
光写 opacity: 0.6 看似省事,但副作用明显:
立即学习“前端免费学习笔记(深入)”;
<input> 里的内联图标、background-image 中的 SVG)也会变透明,文字可读性下降cursor: not-allowed,否则用户无法感知“不可点”color 和 background-color 区分状态——某些浅色主题下灰度不够,建议同步调低 border-color 和 outline
fieldset:disabled 不会让内部 input 自动匹配 input:disabled,得显式写 fieldset:disabled input
真正可靠的写法是组合控制:确保属性存在、限定原生标签、分别降级颜色而非依赖 opacity,尤其注意框架组件是否把 disabled 渲染到了真实 DOM 上。