opacity作用于整个元素及子元素并触发层叠上下文,而rgba()仅控制颜色透明度且不影响子元素;需根据场景选择:整体淡出用opacity,局部控色用rgba()。
很多人调 opacity 时发现:父容器设了 opacity: 0.5,里面的文字、按钮也跟着半透明,根本没法单独控制。这不是 bug,是规范行为——opacity 作用于整个渲染盒(rendering box),包括所有后代内容。
常见错误现象:div 设了 opacity: 0.3,结果里面 button 的文字看不清、图标发虚,交互反馈变弱。
z-index 行为想让背景透明但文字清晰?用 rgba()。它只作用于颜色本身,不影响子元素,也不改变层叠关系。
使用场景:卡片背景、按钮底色、边框、阴影——任何需要“局部透明颜色”的地方。
立即学习“前端免费学习笔记(深入)”;
background-color: rgba(0, 0, 0, 0.1) → 黑色背景 + 10% 不透明度border-color: rgba(255, 100, 100, 0.7) → 红色边框 + 70% 不透明度0(全透)到 1(不透),不是百分比rgba(),若需兼容,得配 filter: progid:DXImageTransform.Microsoft.gradient(但建议放弃)二者叠加会导致双重透明,容易过度削弱视觉对比度,尤其在深色模式或小字号文本上。
典型错误:给一个 div 同时设 opacity: 0.8 和 background-color: rgba(255, 255, 255, 0.9),实际背景透明度变成 0.8 × 0.9 = 0.72,还不可控。
opacity;要精确控色用 rgba()
opacity:它会强制浏览器开启合成层,可能引发意外重绘或内存占用升高rgba() 在 CSS 变量中不能直接被 calc() 修改 alpha 值,得靠预定义变量或 JS 动态生成如果目标是“毛玻璃”效果(比如悬浮菜单透出底下内容),opacity 和 rgba() 都不合适——它们只是变淡,不模糊。
这时候得用 backdrop-filter,但它依赖父容器背景可穿透:
background-color: rgba(255, 255, 255, 0.7) 或类似透明色才生效chrome://flags/#backdrop-filter(v124+ 已默认开启)-webkit-backdrop-filter 前缀保 Safari 兼容