总结一下核心要点:用伪元素叠加 linear-gradient() 是最稳的选择,IE9+ 全支持;而 mask-image 兼容性堪忧,Firefox 直接忽略,Safari 对 transparent 解读错误,Chrome/Edge 还需要加前缀;实现时需要容器 relative + 伪元素
总结一下核心要点:用伪元素叠加linear-gradient()是最稳的选择,IE9+ 全支持;而mask-image兼容性堪忧,Firefox 直接忽略,Safari 对transparent解读错误,Chrome/Edge 还需要加前缀;实现时需要容器 relative + 伪元素 absolute 覆盖;如果图片是背景图,直接多层background搞定;如果要加交互内容,必须用真实 DOM;遮罩的透明度要根据图片明暗反向调整。

给图片加渐变遮罩层,直接用伪元素叠加 linear-gradient() 是最稳、最容易调试的方案,不需要 JavaScript,也不依赖那些实验性属性,IE9+ 都能正常跑。下面逐个拆解核心步骤和避坑要点。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
乍一看,直接用 mask-image 似乎更“对路”,但千万别被表象迷惑——兼容性上是个不折不扣的坑。mask-image: linear-gradient(to bottom, black, transparent) 在 Firefox 里会被完全忽略,在 Safari 里 transparent 会被转成 #000,结果整个图片都露出来;Chrome/Edge 则必须加上 -webkit-mask-image 前缀才能生效。你明明只写了一行代码,却得为三套浏览器逻辑分别兜底。除非你真的要做 Alpha 裁剪(比如镂空文字),否则这不是遮罩,是自找麻烦。
核心不是给 本身加样式,而是把图片包进一个容器,再让伪元素“浮”在上面。这里有几点容易踩坑:
position: relative,同时要有明确尺寸(比如 display: inline-block 或固定宽高),否则伪元素没参照。content: "",不然浏览器压根不渲染它。position: absolute 加上 top: 0; left: 0; width: 100%; height: 100%,才能完整覆盖容器。to bottom,比 0deg 更直观。注意 alpha 值必须用小数,比如 rgba(0,0,0,0.6),不能写 70%,那是无效值。height: auto),要确保它的高度能被计算出来,否则伪元素可能塌陷或错位。如果图片是通过 background-image 加载的(比如 banner 区域),就别额外加 DOM 了,直接在同一元素的背景栈里搞定。注意这几个细节:
background: linear-gradient(to bottom, rgba(0,0,0,0.35), rgba(0,0,0,0.35)), url('hero.jpg');——顺序反了,渐变会被图片盖住。background-size: cover 或 100% 100%,不然小屏上渐变只覆盖原始图片尺寸区域,显示不全。background-attachment: fixed,iOS Safari 里它会让渐变层不跟随滚动更新,效果怪异。auto,至少得设个 min-height: 100vh 或具体数值,否则背景没有渲染空间。::before 和 ::after 毕竟是伪元素,不支持子节点、无法聚焦、对屏幕阅读器也不友好。一旦你要加链接、按钮、标题,就得换成真实 DOM:
![]()
.overlay 同样需要 position: absolute + top/left/right/bottom: 0 覆盖容器。display: flex; justify-content: center; align-items: center 最省心。background: rgba(0,0,0,0.6),千万别用 opacity,否则文字也跟着变淡。真正容易被忽略的是:遮罩不是越黑越好,而是要服务于文字可读性。同一套 rgba(0,0,0,0.6) 在暗图上可能压过细节,在亮图上又不够衬托文字。得根据图的主色调反向微调——深色文字配浅图时,甚至该用 rgba(255,255,255,0.15)。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述