在写页面的时候,经常会让某个模块"半透明"一点,让背景透出底下的内容,营造层次感。CSS 里有两个很容易混淆的东西:opacity 和rgba()。看起来都能"变透明",但其实作用范围完全不一样。
🎯 opacity 是什么
opacity用来设置整个元素的透明度,取值在0.0 ~ 1.0之间:
- 0:完全透明(元素看不见,但还占着文档流的位置)
- 1:完全不透明(默认值)
- 0.5:半透明,可以写成
.5
.box{opacity:0.5;/* 等价于 */opacity:.5;}⚠️ 一个容易踩的坑:opacity一旦不是 1,就会把这个元素拎到一个新的层叠上下文里(z-index相关的行为会受影响)。另外,opacity是"连坐制"——元素本身 + 它的所有子元素 + 背景 + 内容整体一起变透明,哪怕子元素自己写了opacity: 1也没用。
🆚 opacity vs rgba:到底差在哪
这是面试和学习里最高频的一道题,记住一句话就够了:
rgba只管"颜色"透不透明;opacity 管"整个元素"透不透明。
| 对比项 | rgba() | opacity |
|---|---|---|
| 作用对象 | 某一种颜色(背景色 / 文字色 / 边框色) | 整个元素(背景 + 内容 + 子元素) |
| 是否影响文字 | ❌ 不影响同元素其他部分 | ✅ 文字一起变透明 |
| 是否影响子元素 | ❌ 子元素不受影响 | ✅ 子元素被连坐 |
| 典型场景 | 只想背景透一点,字要清晰 | 整个卡片 / 浮层要淡掉 |
📦 看个直观例子
<style>.box1{width:200px;height:100px;/* rgba 只让红色背景半透明,字不受影响 */background-color:rgba(255,0,0,0.5);}.box2{margin-top:50px;width:200px;height:100px;background-color:red;/* opacity 让整个元素(红底 + 文字)一起半透明 */opacity:0.5;}</style><divclass="box1">好好学习!</div><divclass="box2">好好学习!</div>.box1:红底半透明,"好好学习"字样仍然浓黑清晰👈 这就是rgba的好处.box2:红底半透明,"好好学习"也一起灰掉了 👈opacity的"连坐"效果
如果你想要的是"背景朦胧、字要清楚",选rgba();如果你想要的是"整块东西都淡出去",再用opacity。
🛠 几个实用小贴士
- hover 淡入淡出:
opacity+transition是做淡隐淡现的神器
.card{opacity:0;transition:opacity .3s;}.card:hover{opacity:1;}- 完全隐藏别乱用
opacity: 0:它只是看不见,元素还在那占位置、还能点。真要隐藏又不想占流,用display: none;只想看不见但还能点,才用opacity: 0。 - 层级陷阱:
opacity < 1会创建新的层叠上下文,父子z-index排序要注意。
📚 参考
- MDN - opacity
读者互动:
- 如果你觉得文章有待改进,请在评论区留言,我会认真考虑每一条建议。
- 如果觉得文章有帮助,欢迎点赞鼓励。
- 想与我共同进步,欢迎关注我。
💬 感谢各位读者的支持与关注!期待与大家一起在前端开发的道路上共同进步!🎉