如果你做前端越久,会越来越发现一个现象:同样是图片展示和视觉表现,有人做出来的页面是"好看的网页",有人做出来的是"有质感的设计稿"。差距往往不在切图和标注,而在对视觉层级、色彩关系和图层关系的掌控能力。而在CSS里,滤镜(filter)、混合模式(mix-blend-mode / background-blend-mode)和遮罩(mask)正是把"普通页面"推向"高级视觉效果"的三大利器。
听起来有点唬人,但实际用起来之后,你会发现它们并不是遥不可及的"特效API",而是完全可以在日常业务里反复落地的基础能力。这篇文章我打算从头串一遍我的实践思路:什么时候用滤镜,什么时候上混合模式,遮罩到底帮我们解决什么问题,以及它们组合在一起能做出什么从静态稿上"看不出来是纯CSS"的页面效果。适合已经能熟练写布局和样式、但还没系统接触过高级视觉效果的前端同学,也适合想把手上的图片资源玩出更多花样的设计师和工程师。
1. 为什么视觉效果能力是前端进阶的分水岭
1.1 从"切图工具"到"图像处理引擎"的思维转变
早几年做前端,遇到圆角、阴影、透明渐变这类效果,第一反应是找设计师要切图,或者自己在本地拿图像处理软件导出一张PNG。现在这些都是CSS基本功,谁还在为了一颗阴影做切图,多少有点落后于时代。
但真正让前后端分工边界变化的,是视觉合成能力。什么意思?就是你不只展示一张图片,而是能在浏览器里对这张图片做二次加工:调节它的明暗、色彩、透明度,把它跟背景颜色、另一张纹理图、甚至一段动态渐变做"化学混合";或者用一个半透明的形状去控制它哪些部分露出来、哪些部分淡出。这些能力原本属于图像处理软件的范畴,现在CSS直接暴露给了浏览器渲染引擎。
我见过很多团队在做一个促销banner的时候,设计师输出一张2000px宽的JPG,前端直接丢上去,再用绝对定位压一层半透明黑蒙层。结果图片稍微偏色一点,文案的对比度就出问题;换个活动主题,又得让设计师回来加班改图。但如果你真正掌握了滤镜和混合模式,会发现大部分适配问题都可以在前端解决:同一张底图,用滤镜调个色、用混合模式叠一层渐变色、用遮罩控制边缘淡出,三行代码就能适配出三套不同视觉方案。
所以我把这项能力称为"分水岭":它考验的不是你会不会写某个属性,而是你有没有意识到,浏览器是一个有完整图像处理能力的渲染环境,而不是一个只能按原样显示图片的框。
1.2 这个技能栈能解决哪些真实业务问题
从我自己的实践看,滤镜、混合模式、遮罩这三件套能覆盖的高频场景至少有这些:
第一,图片与页面氛围的统一。很多页面底图是从视觉站下载的高清照片,但照片本身色调和页面品牌色不一致。用filter: hue-rotate()可以快速微调色相,用saturate()或sepia()能统一复古底调,用brightness()和contrast()能压出更高级的低对比质感。这一套操作下来,不需要改图,就能让所有配图保持同一"气质"。
第二,纹理叠加与纸张质感。混合模式里的multiply、overlay、soft-light非常适合把噪点、纸张纹理、光晕叠加在图片上。以前这一类效果必须在专业软件里做图层混合,现在一个mix-blend-mode属性就能实时混合,还能跟随滚动或动画变化。
第三,图文可读性与边缘过渡。遮罩属性可以让图片在某个方向由实到虚地淡出,文字叠加在上面的可读性会自然提升。对比硬切矩形,视觉上会高级一大截。
第四,动态效果与交互反馈。滤镜值几乎都是可过渡的,比如鼠标悬停时从灰度变成彩色,或者滚动时图片模糊度逐渐变化。配合CSS过渡和动画,效果平滑程度远超切换两张图片。
1.3 学习路线:滤镜、混合、遮罩三件事的关系
很多初学者把三个知识点混在一起背,实际使用的时候却分不清该用哪个。
我给它们做一个特别简单的分类:滤镜是"对单个图层内部的像素做变换",也就是图层自己的明暗、颜色、位置形变等;混合模式是"两个图层之间的像素按计算公式合并",解决的是图层和图层之间的关系;遮罩是"控制图层内部哪些位置透明、哪些位置保留",解决的是图层的可见区域形状。
这样拆开之后,逻辑就清晰多了:你想要一张图片整体变复古,用滤镜就够了;你想要一张图片跟背景文字或颜色产生通透感,需要混合模式;你想要图片边缘从清晰过渡到透明,让位给文案,那是遮罩的活。组合使用时也按这个思路分步拆解,不会乱。
2. 滤镜全套打法:filter的属性拆解与工程化用法
2.1 十个函数逐个过一遍:除了blur还有谁
filter属性支持一批函数,官方统称滤镜函数。它们可以单个使用,也能用空格连接多个,形成一个滤镜链。
blur(px):高斯模糊,接收长度值,代表模糊半径。别设置太大,尤其在大屏上,模糊半径过大会明显吃掉GPU资源。brightness(%):亮度。1是原始亮度,大于1变亮,小于1变暗。contrast(%):对比度。小于1会发灰,大于1会变得锐利。drop-shadow(x y blur spread color):投影。很多人把它和box-shadow混淆,最大的区别是drop-shadow会沿着元素的真实轮廓走,包括PNG透明区域边缘,适合给镂空图形加阴影。grayscale(%):灰度。1是完全黑白,0是原图。hue-rotate(deg):色相旋转。输入0到360度,颜色会沿色环转动,适合快速改图片主色调。invert(%):反相。1会把颜色完全反转,效果类似底片。opacity(%):透明度。和CSS的opacity属性不完全等价,在滤镜链里更接近像素级透明处理。saturate(%):饱和度。0变为完全去色,大于1会色彩溢出。sepia(%):棕褐色调,复古感利器。
这几个函数在MDN都有详细说明,但我在工程项目里用下来,真正高频的只有brightness、contrast、saturate、hue-rotate和grayscale。核心原因很简单:它们可以线性调节,方便做动画和交互状态切换。
2.2 函数链的调用顺序与数值敏感度
这里有个特别容易踩的细节:多个滤镜函数是按书写顺序依次执行的。看起来都是组合,但同样的数值换一个顺序,结果完全不同。
举个例子,grayscale(1) hue-rotate(90deg)和hue-rotate(90deg) grayscale(1)的输出色彩就不一样。前者先把图变黑白,再旋转色相——已经灰度化的图片色相值已经丢失,旋转几乎不起作用;后者先旋转色相,再灰度化,最终只是黑白亮度稍微变了一点。实际项目里如果你发现hue-rotate没生效,八成是把顺序放到了grayscale或其他消色函数后面。
再补充一个数值敏感性的经验:brightness(1.2)和brightness(1.4)从肉眼上看差别很细微,但contrast(1.4)和contrast(2.0)之间的差距就有天壤之别。在移动端,亮度和对比度同时调高会让低端机渲染出明显的色带和噪点,所以我通常建议把对视觉影响最显著的contrast调幅控制在0.25以内。
2.3 让效果更好看的三个组合公式
我在自己做过的一些专题页里反复使用过三组公式,基本可以套用在大部分场景:
第一种,胶片感:sepia(0.35) contrast(1.15) brightness(0.95)。这个组合能把数码照片压出一种淡淡的暖灰质感,特别适合内容型页面头部背景。
第二种,高级灰:grayscale(0.8) contrast(1.2) brightness(1.1)。注意灰度不是绝对拉满,保留一点点颜色会让页面不至于死气沉沉,适合商务型产品氛围。
第三种,统一暖调:saturate(1.2) hue-rotate(-8deg) brightness(1.05)。适合品牌色偏暖的电商环境,给同一批不同色温的底图做一致性处理。
这些数值不是固定的,建议根据实际图像微调,但可以作为初始参数直接套用来体验。
2.4 性能开销与层提升问题
filter一个值得警惕的性质是:任何滤镜函数都会让元素创建新的渲染层,换句话说,这个元素会被浏览器单独拎到一层做GPU处理。如果页面里同时存在大量带滤镜的元素,尤其是模糊半径较大的,内存占用会明显上升,滚动时也会出现掉帧。
我踩过的一个真实案例:一个活动页里放了八张带滚动模糊效果的专辑封面,每张都用了blur(12px)。在MacBook上看着还可以,但用集成显卡的Windows笔记本一滚动,整个页面都卡顿。后来我把模糊效果挪到容器背景、用混合模式配合半透明遮罩去模拟,视觉差异不大,性能问题却彻底消失。
如果确实需要动画,尽量只对brightness、contrast、opacity、grayscale这种不需要大范围采样邻居像素的滤镜做过渡,避免频繁改变blur半径,也不要在动画过程中动态更换整个滤镜链。
3. 混合模式:让两个图层真正"化学反应"
3.1 混合模式分类:乘、除、叠、光的底层逻辑
第一次接触mix-blend-mode的时候,我觉得它像魔法,后来把每个值都测了一遍,发现其实是有规律可循的。
混合模式本质上是把两层的每个像素颜色按特定数学公式合并:multiply是正片叠底,对两个颜色做乘法,结果只会更暗,适合去掉白色保留深色质感;screen是滤色,效果相反,结果只会更亮,适合模拟光晕和高光;overlay是叠加,根据底色明暗决定乘还是除,高光区变亮、阴影区变暗,同时保留灰阶过渡;soft-light比overlay更柔和,适合做纹理叠加不破坏底图;color-dodge和color-burn的对比度更重,容易出现极端效果,慎用;difference和exclusion会把两个图层颜色做差值混合,一般用来做艺术化处理,比如故障风。
我给一个更容易理解的类比:multiply像把两张彩色纸叠在一起,透过的光越叠越暗;screen像把两张幻灯片投影在同一块幕布上,光越投越亮;overlay像在已曝光的底片上再显影,明暗区域各自强化。
3.2 mix-blend-mode和background-blend-mode选谁
mix-blend-mode定义的是整个元素和它背后所有内容之间的混合关系。它影响的是"这个元素层"和"底下上下文"的关系,适合用来做图文交错、标题字叠在图片上的特殊呼应。
background-blend-mode则作用于同一个元素内部的多层背景之间,适合在同一元素上叠多层background-image,比如一张照片底图、一层渐变光、一层噪点纹理,它们之间的混合关系完全在元素内部解决,不会影响外部内容。
从实际使用角度讲,如果你只是想让一张背景图片上叠一层颜色,推荐background-blend-mode,因为它不会产生额外的“第三方图层”干扰,也不容易触发堆叠上下文问题。如果你是想让一个浮动的文字块跟底图混合,那应该用mix-blend-mode。
3.3 最容易翻车的堆叠上下文与isolation
这也是我强烈建议认真读文档的地方。mix-blend-mode是否生效,跟父级是否创建了隔离环境有很大关系。
当一个元素加上了mix-blend-mode,它默认会和父级背景以及兄弟元素混合。但如果父级设置了opacity、filter、transform、will-change等属性,就可能创建了新的堆叠上下文,此时子元素的混合范围会变成"父级内部",视觉上可能出现混合不过去的情况,甚至整个效果提前失效。
解决之道是使用isolation: isolate。这个属性会强制让当前元素作为混合模式的隔离边界,子层只在它内部进行混合,不污染外层。反过来,如果你发现某个子元素混合生效范围超出了预期,可以在它的父级上加isolation: isolate来限制边界。
我尝试过一个具体场景:一个商品卡片,用mix-blend-mode: multiply把标签颜色叠到商品图片上,结果因为卡片外层有一个filter: drop-shadow,标签的混合范围瞬间变得不自然。后来在卡片本身上面加了一层isolation: isolate,文字盒子的混合效果才恢复到预期。
3.4 实战:给图片叠加纸张纹理和渐变光
我们结合一个简单场景:一张商品图要处理出复古纸张的质感。
先给商品的容器设置一张曲面纸纹理图为背景,再在容器上叠加一个带mix-blend-mode: multiply的图片元素:
<div class="goods-paper"> <img class="goods-img" src="goods.jpg" alt="商品图" /> </div>.goods-paper { position: relative; isolation: isolate; } .goods-paper::before { content: ""; position: absolute; inset: 0; background: url("paper-texture.png") center/cover; mix-blend-mode: multiply; pointer-events: none; } .goods-img { width: 100%; height: 100%; object-fit: cover; }这里最关键的是pointer-events: none,因为纹理层只是视觉效果,绝对不能挡住用户交互。另外纹理图最好选择不太浓的浅灰噪点,否则商品图会变得脏兮兮的。如果你想让光晕从左上角打下来,可以把纹理层替换成一个从白色到透明的对角线渐变,混合模式改为screen,效果会更清透。
4. 遮罩:渐变遮罩、图片遮罩与clip-path的边界
4.1 mask-image怎么用:渐变遮罩的万能套路
mask-image 应该算这三件套里最被低估的一个。它可以用一张图片作为遮罩层,图片里每个像素的透明度决定了元素对应位置显示的程度:白色是完全显示,黑色是完全隐藏,中间灰度是半透明。
实际用得最多的形式是CSS渐变遮罩。比如让一张图片左端清晰、右端淡出:
.fade-right { -webkit-mask-image: linear-gradient(to right, #000 0%, #000 60%, transparent 100%); mask-image: linear-gradient(to right, #000 0%, #000 60%, transparent 100%); }注意我这里特意写了-webkit-mask-image,因为到目前为止去前缀的mask-image在各浏览器的支持还有不少差异,Safari和Chrome对部分mask子属性的实现不一致。这个坑很实际:不加前缀在桌面Chrome基本正常,但一旦打开iOS Safari,遮罩可能整个失效。我在项目里最稳妥的做法是同时写两份,让标准属性在后,兼容属性在前。
渐变遮罩最适合用在大段图文混排的过渡区,比如正文从图片上切入时,用mask-image做上下或左右渐变,视觉上会显得非常平滑。
4.2 mask与clip-path的本质区别
很多人第一次接触mask-image时会把clip-path扯进来:都是裁出一块可见区域,到底有什么不同?
我的理解是:clip-path是"硬裁剪",它按路径把元素外面的区域直接裁剪掉,只有几何边缘,不会被中间灰度影响;mask-image是"软遮挡",它通过每个像素的透明度决定可见度,可以实现柔和过渡、半透明边缘和任意渐变效果。
举例来说,你希望一个产品图以圆形展示,用clip-path: circle(50%)最快;但你希望正方形图片从边缘模糊扩散到中间、形成环绕渐隐效果,那就只有mask-image能胜任。
还有一个容易被忽视的点:clip-path裁剪后的元素在布局上仍然保持原来的盒子尺寸,它只是视觉裁剪,并不会影响点击区域的形状,所以如果涉及交互热区,需要严谨测试。遮罩同理,它不改变布局尺寸,但透明区域一般也不会响应事件,因此需要额外确认事件绑定区域。
4.3 SVG遮罩与mask的URL引用
当需要不规则形状的遮罩时,可以借助SVG里的<mask>元素,然后在CSS里通过mask-image: url(#gradient-mask)引用。这种方式的好处在于遮罩图形可以被SVG的渐变和路径精确控制,更容易复用。
但实际用的时候要注意:引用url(#id)时,如果SVG是隐藏元素,部分浏览器会有兼容差异。我在一个细节实现上吃过亏——给图片加SVG文字遮罩,在桌面Chrome完全正常,在移动端部分版本中SVG遮罩失效,图片直接全显。后来把SVG<mask>放进了HTML并设置width="0" height="0"的占位方式,问题才稳定下来。
另一个稳妥方案是把遮罩导出成PNG图片,用mask-image: url(mask.png)引用。优点是兼容性好、可控性强,缺点是占一次网络请求。如果遮罩图形比较固定,还是建议直接用PNG。
4.4 遮罩动画:让图片边缘动态变化
遮罩的-webkit-mask-position和-webkit-mask-size都可以参与CSS过渡和动画,这让图片的边缘可以动态变化,视觉冲击力很强。
我自己写过这样的效果:鼠标悬停时,图片从中间用圆形遮罩向外扩散展示,类似放大镜扫过。核心思路是设置一个径向渐变遮罩,尺寸从0过渡到100%:
.zoom-mask { -webkit-mask-image: radial-gradient(circle, #000 60%, transparent 61%); mask-image: radial-gradient(circle, #000 60%, transparent 61%); -webkit-mask-size: 0%; mask-size: 0%; transition: mask-size 0.4s ease; } .zoom-mask:hover { -webkit-mask-size: 100%; mask-size: 100%; }这里的技巧是渐变里60%到61%之间的两个色标做硬过渡,从而在遮罩边缘形成清晰边界。如果你想要柔和效果,就把两个色标距离拉开,比如#000 0%, #000 60%, transparent 100%,那样出来的是柔光边缘。通过调整这个数值,可以很轻松地控制扩散边缘的虚实。
5. 实战:用三件套做一张海报级卡片
5.1 目标效果与设计拆解
前面讲了不少零散知识点,现在用一个完整案例把它们串起来:我要实现一个"电影海报风格"的内容卡片,顶部是一张城市夜景照片,右侧用大标题压暗底图,卡片左下角有一块强烈的品牌色渐变,照片从中间到底部自然淡出,整体色调偏青蓝。
拆解一下视觉效果需要的三件事:
第一,照片本身的色调要统一,我直接用filter: hue-rotate(10deg) saturate(1.3)把暖色夜景往青蓝方向拉。第二,标题文字要跟底图形成"从背景里长出来"的感觉,我给标题套一层mix-blend-mode: multiply,让文字和夜景中的暗部融合得更自然。第三,底部区域需要一个渐变遮罩,让照片从横向阅读过渡到纯色背景。
5.2 HTML结构与基础样式
<section class="poster-card"> <img class="poster-bg" src="city-night.jpg" alt="城市夜景" /> <div class="poster-overlay"></div> <div class="poster-content"> <h2 class="poster-title">城市夜航计划</h2> <p class="poster-desc">在灯光与建筑之间,寻找一条自己的航线。</p> </div> </section>基础样式:
.poster-card { position: relative; width: 100%; aspect-ratio: 3 / 4; overflow: hidden; isolation: isolate; background: linear-gradient(160deg, #0d2a3e 0%, #10233a 100%); } .poster-bg { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; filter: hue-rotate(10deg) saturate(1.3); -webkit-mask-image: linear-gradient(to bottom, #000 0%, #000 55%, transparent 95%); mask-image: linear-gradient(to bottom, #000 0%, #000 55%, transparent 95%); }这里用aspect-ratio保证不同屏宽下始终是竖向电影海报比例;isolation: isolate隔离整个卡片内部混合,防止后续内容溢出影响外部。
5.3 一步步叠加滤镜、混合、遮罩
滤镜已经加在图片上,接下来加品牌色渐变覆盖层,并让它跟图片发生叠加反应。
.poster-overlay { position: absolute; inset: 0; background: linear-gradient(120deg, rgba(0, 140, 180, 0.45), transparent 45%); mix-blend-mode: screen; pointer-events: none; }渐变覆盖层用了screen混合,会在夜景图片上叠加一层青蓝光感,原图的暗部不会被完全覆盖,亮部会透出轻微色彩。如果你希望覆盖层更有"印上去"的质感,也可以试试overlay,但数值要调得更淡一些。
然后把文字层放上来,利用multiply让大标题和背景产生压暗效果:
.poster-content { position: absolute; left: 10%; right: 12%; bottom: 12%; z-index: 2; } .poster-title { font-size: clamp(2rem, 8vw, 4rem); color: #eaf2ff; mix-blend-mode: multiply; filter: drop-shadow(0 2px 6px rgba(0, 0, 0, 0.4)); margin: 0; }我在标题上没少下功夫:multiply会让白色文字变成"叠加色"自然压进背景暗部,再配一个drop-shadow增加轮廓感。但要注意文字混入暗部后对比度可能下降,所以标题字体加粗、字号加大,并用亮色文字配合。
5.4 实现后的性能与兼容性调优
这个卡片用到的属性有filter、mix-blend-mode、mask-image,其中filter和mask-image都会创建渲染层。考虑到它可能出现在首页首屏或者专辑列表里,如果页面里同时出现三张以上同构卡片,建议做以下调优:
给卡片外层容器加will-change: transform不是必须的,但可以提示浏览器提前创建合成层;更常见的方式是让卡片本身不参与大范围filter动画,滤镜值保持静态,只让内容的opacity或transform动。我实际测试过,同样的三张卡片,把滤镜链条简化成纯静态、遮罩也改为静态固定尺寸之后,移动端滚动帧率明显稳定。
另外,我在移动端safari测试时发现,aspect-ratio配合object-fit: cover和mask-image有时候会出现轻微的裁切偏移。解决方案是给图片增加-webkit-mask-position: center和mask-position: center,让遮罩中心跟图片中心对齐。
6. 兼容性对照、调试经验与无障碍问题
6.1 浏览器兼容性速查
如果对兼容性比较关注,我用最常遇到的场景总结了一张速查表:
| 特性 | Chrome / Edge | Firefox | Safari | iOS Safari |
|---|---|---|---|---|
| 基础 filter | 全面支持 | 全面支持 | 全面支持 | 全面支持 |
| filter动画 | 流畅 | 流畅 | 略卡 | 略卡 |
| mix-blend-mode | 支持 | 支持 | 支持 | 支持 |
| background-blend-mode | 支持 | 支持 | 支持 | 支持 |
| mask-image(标准属性) | 支持 | 支持 | 部分需前缀 | 需-webkit- |
| clip-path | 支持 | 支持 | 支持(部分旧版需-webkit-) | 支持 |
| SVG mask引用 | 支持 | 支持 | 部分老版本异常 | 异常较多 |
从表里可以看出来,mask是兼容性最不稳定的,所以前面一直强调写前缀。还有一个很关键的点:mix-blend-mode在Safari上偶尔会出现不跟随滚动重绘的问题,我碰到过在滚动列表里某个混合元素颜色闪一下的情况。这个没有完美解决方案,最有效的办法是让混合元素尽量小,或者用background-blend-mode代替。
6.2 开发调试技巧
视觉效果的调试,最忌讳的是盲改数值。我一般会在浏览器开发者工具里直接编辑CSS属性做实时预览,因为滤镜和混合模式对数值变化非常敏感,肉眼盯着页面比改一行刷新一次高效得多。
filter的值可以通过连续点击上下箭头微调,非常方便;mix-blend-mode则直接在下拉列表里切换,可以快速对比多个模式。mask-image如果引用了PNG图片,建议用开发者工具的网络面板确认图片加载成功,因为遮罩图片一旦404,元素不会报错,而是直接完全隐藏或全显,很容易让人觉得是定位问题。
另一个实用技巧是打开Chrome的"渲染"面板,勾选"图层边框"和"显示图层绘制区域"。这样能直观地看到哪些元素被拆成了独立渲染层。如果一个页面上有十几个渲染层,就说明视觉效果属性用得太多了,该分层优化。
6.3 可访问性和内容可用性的坑
高级视觉效果在让页面变好看的同时,很容易牺牲可访问性。我见过一个让人印象深刻的失败案例:某页面用filter: contrast(2)给整段文字加特效,结果白底灰字的对比度从4.5:1掉到不足2:1,很多人根本看不清。所以给文字图层用滤镜时,尤其要注意对比度,不要为了视觉牺牲阅读。
混合模式同样有风险。用multiply让文字融入背景时,如果背景特别暗,文字直接消失在画面里;用screen时,亮部背景上的文字又会被淹没。比较稳妥的方案是:把带混合模式的元素用isolation: isolate隔离,再配合一层弱化的纯色文字作为后备,或者给文字单独加text-shadow来提高边缘光感。
遮罩也不要忽略屏幕阅读器。被遮罩掉的部分虽然视觉上看不到,但内容仍然存在于DOM中,阅读器会正常朗读。如果你是做标题淡出,而且不想让辅助技术读到隐藏标题,应该在HTML层面用aria-hidden配合或用visibility隐藏,而不是单纯依赖遮罩。我在项目中一般会把纯装饰性图片放在CSS背景里,这样既不占语义,也不会给阅读器造成额外噪音。
最后说一下动画方面的无障碍。如果使用了大量涉及滤镜变化或遮罩移动的动画,最好尊重用户的prefers-reduced-motion偏好。这个媒体查询虽然很基础,但在视觉效果多起来之后尤其重要。我的策略是:当用户开启减弱动态效果时,把动画时长改为接近0,同时用静态滤镜结果代替过渡过程,这样既不丢失质感,也能照顾到晕动症用户。
说实话,CSS滤镜、混合模式和遮罩这些特性,刚上手时觉得''会几个属性就行'',真正深入以后才发现,它们的难点从来不在语法,而在对色彩、图层和渲染机制的理解。我建议你从今天给的三个小公式和一个海报卡片案例开始,在自己的项目里找一个图片模块,试着把其中的一张图做多轮调整:先看看滤镜怎么改变它的氛围,再叠一个渐变层观察混合模式的变化,最后用遮罩控制它的边缘收放。等你能熟练地把这三个属性组合出不属于设计稿的质感,前端视觉这条路,你就算是真正走过来了。