只读元素加灰失效的主因是:read-only仅作用于原生表单控件;自定义元素设readonly无效;IE/旧Edge需用[readonly]兜底;Vue/React中须正确绑定属性。

只读元素加灰失效?检查是否漏了 :read-only 的作用对象
浏览器只对原生支持 readonly 属性的表单控件(如 <input>、<textarea></textarea>)触发 :read-only 伪类。自定义组件或 div 加了 readonly 属性不会生效——它不是 HTML 标准可读写属性的合法宿主。
- ✅ 正确:
<input readonly>、<textarea readonly></textarea> - ❌ 无效:
<div readonly>、<code><span readonly></span>(即使 JS 设置了该属性) - ⚠️ 注意:
contenteditable="true"元素即使设了readonly,也不匹配:read-only;得用[contenteditable="false"]单独处理 - 推荐写法:
background-color: #f5f5f5;+color: #666;+border-color: #ddd; - 避免用
filter:它会干扰父容器的transform或will-change,还可能在 Safari 中导致重绘异常 - 如果必须保留原背景图/渐变,可用
background-blend-mode: multiply;叠一层浅灰遮罩层(需测试兼容性) - HTML 中同时写:
<input readonly>(重复属性无害,但确保存在) - CSS 写双规则:
input[readonly] { background-color: #f5f5f5; } input:read-only { background-color: #f5f5f5; } - 注意:不要写成
input[readonly="readonly"]—— 布尔属性值为空时,属性选择器仍能匹配 - Vue 模板中确保用
:readonly="isReadonly"(带冒号),而非readonly="{{isReadonly}}" - React 中用
readOnly={isReadonly}(注意是readOnly,不是readonly) - 调试技巧:打开 DevTools,右键元素 → “Edit as HTML”,确认
readonly是否真实存在于 DOM 属性中
背景置灰不均匀?别只靠 opacity 或简单 filter: grayscale()
opacity: 0.6 会让文字和边框一起变淡,但可读性反而下降;filter: grayscale(100%) 则可能把边框、图标也一并灰掉,视觉上像“禁用”而非“只读”。更稳妥的是控制背景色+文字色组合。
IE 和旧版 Edge 不支持 :read-only?用属性选择器兜底
IE 完全不识别 :read-only,旧版 Edge(≤17)也存在兼容问题。不能只依赖伪类,得配合 HTML 属性做降级。
Vue/React 中动态 readonly 状态没触发样式?别忘了属性绑定方式
框架中用 v-bind:readonly 或 readOnly={true} 渲染后,DOM 上确实会出现 readonly 属性,但某些情况下(比如用 Object.freeze 包裹 props、或使用 shouldComponentUpdate 阻断更新),属性可能没真正写入 DOM,导致 :read-only 不触发。
立即学习“前端免费学习笔记(深入)”;


















