必须同时使用 button:disabled 和 button[disabled],否则 ssr 或动态设 disabled 场景下样式失效;禁用态需显式设置 color、background、border、cursor、transition 等多属性,不可仅依赖 opacity 或 filter;非原生元素不支持 :disabled,须用 class + aria-disabled + tabindex 配合。

直接结论:只写 button:disabled 是危险的,必须搭配 button[disabled],且禁用态样式不能只靠灰度或透明度——它必须同步视觉、交互和语义三者。
为什么 button:disabled 单独写经常没反应
根本不是 CSS 写错了,而是 DOM 上压根没真实存在 disabled 属性。React 的 disabled={true} 和 Vue 的 :disabled="true" 都是直接设置 el.disabled = true,这能触发 :disabled 匹配,但不会自动写入 HTML 属性 disabled="";而 SSR 渲染出的静态 HTML、或手动用 setAttribute('disabled', '') 添加的按钮,只响应 [disabled]。两者覆盖场景不同,缺一不可。
常见错误现象:
- 本地开发看着正常,部署到 SSR 环境后禁用按钮颜色/光标没变
- 按钮禁用了,鼠标悬停时仍显示高亮色(被
.btn:hover覆盖) - 移动端 iOS Safari 对
:disabled样式支持保守,[disabled]更稳
button:disabled 和 button[disabled] 必须一起声明
推荐写法(显式、权重合理、覆盖全场景):
button:disabled,
button[disabled],
input:disabled,
input[disabled],
select:disabled,
select[disabled],
textarea:disabled,
textarea[disabled] {
background-color: #eaeaea;
color: #666;
border-color: #d0d0d0;
cursor: not-allowed;
opacity: 0.65;
transition: none;
}
关键点:
- 不要只写
button:disabled—— 它在 SSR 或属性直设场景下会漏掉 - 必须显式重置
cursor: not-allowed,浏览器不会自动改光标 -
transition: none是必须的,否则悬停动画可能残留 - 避免用
!important,靠选择器并列提升权重更可控
非原生按钮(如 div 或自定义组件)怎么办
:disabled 只匹配 button、input、select、textarea 这几类原生可禁用元素。给 div 加 disabled 属性完全无效,CSS 不识别,JS 也不阻止事件。
正确做法:
- 优先改用语义化
<button type="button"></button>,别模拟按钮 - 若必须用自定义组件,用 class 控制状态:
<my-button class="is-disabled"></my-button>,再配.is-disabled { cursor: not-allowed; color: #999; } - 同步设置
aria-disabled="true"和tabindex="-1",保证屏幕阅读器和键盘导航可感知 - JS 事件处理开头必须加
if (el.disabled || el.hasAttribute('aria-disabled')) return;
滤镜(filter: grayscale())是兼容性陷阱
老版 Safari 对 filter: grayscale(1) 解析异常(比如显示全黑),且高对比度模式下滤镜会被覆盖。更重要的是,它不改变鼠标指针,也不阻止焦点,用户可能仍尝试键盘操作。
更稳妥的组合:
- 用
opacity: 0.65+color: #666+background-color: #eaeaea替代纯灰度 - 如果坚持用滤镜,至少加 fallback:
filter: grayscale(1) brightness(0.9); - 禁用态必须加
cursor: not-allowed,否则视觉与行为割裂 - 测试时打开 DevTools,手动删掉
disabled属性,看样式是否同步消失,验证是否真由该伪类控制
真正可靠的禁用,从来不是“看起来不能点”,而是 DOM 层设属性、CSS 层控样式、行为层拦事件——三者缺一不可。漏掉任意一环,用户就会遇到“看着像不能点,结果点了有反应”或者“读屏器说能点,但点不动”的情况。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











