firefox中::placeholder颜色发灰是因为默认opacity:0.54,需为::-moz-placeholder和:-moz-placeholder显式设置opacity:1,且须配合color使用,仅写标准::placeholder在旧版firefox中无效。

Firefox 里 ::placeholder 颜色看着发灰、改了没反应,不是你写错了,是它默认加了 opacity: 0.54 —— 即使你写了 color: #666,最终渲染出来的也是半透明的浅灰。
Firefox 的 ::-moz-placeholder 必须显式写 opacity: 1
和其他浏览器不同,Firefox(19+)对 ::-moz-placeholder 和 :-moz-placeholder(单冒号,仅 Firefox 18–19)都施加了默认透明度。这个值不会被 color 覆盖,也不会继承父级 opacity,而是硬编码在 UA 样式里。
-
color只管色调,opacity才决定“实不实”,漏掉opacity: 1就永远偏淡 - 必须两个选择器都写:
::-moz-placeholder和:-moz-placeholder,否则旧版 Firefox(如 19)会回退到默认样式 - 加
!important不是必须,但能防住某些 UI 框架的全局重置规则意外覆盖
只写 ::placeholder 标准语法,在 Firefox 里根本不起作用
标准 ::placeholder 在 Firefox 52+ 才支持,而大量项目仍需兼容 38–51 版本。如果你只写这一条,Firefox 旧版会完全忽略,fallback 到浏览器默认的浅灰色占位符。
- 正确顺序是:先写带前缀的旧版规则,最后放
::placeholder(现代浏览器优先匹配靠后的规则,但旧版只认前缀) - 别用
input::placeholder去覆盖::-moz-placeholder—— 它们不互斥,而是并存;Firefox 会按顺序匹配第一个可用的 - 测试时别只看 DevTools 的“Styles”面板,要切到“Computed”,搜
opacity,确认最终计算值真是1
Element UI、Ant Design 等组件库里的 ::placeholder 更容易失效
这些库把原生 input 封在内部,比如 Element UI 的实际输入框是 .el-input__inner,直接写 input::placeholder 完全不命中。
- 得穿透到具体节点:
.el-input__inner::placeholder、.el-input__inner::-moz-placeholder、.el-input__inner::-webkit-input-placeholder - 同样,每个前缀版本都要配
opacity: 1,尤其.el-input__inner::-moz-placeholder容易被漏掉 - 如果用了 scoped style(如 Vue),还得加
/deep/或::v-deep穿透,否则样式根本进不去子组件
真正卡住人的从来不是怎么写,而是 Firefox 默认那个 0.54 的 opacity —— 它不报错、不警告,就 quietly 把你的颜色变淡。上线前务必在 Firefox 旧版(比如 45 或 52)真机或 BrowserStack 里点开输入框,盯着 placeholder 看三秒:是不是比设计稿浅?是不是和 Chrome 不一致?这时候再回头补 opacity: 1,往往已经晚了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











