☰
吃透CSS背景样式:从图层思维到工程避坑
2026/9/30 6:33:11 网站建设 项目流程

做前端这些年,被问得最多的样式问题里,背景样式绝对排得进前三。很多人对 CSS 背景样式的印象还停留在"给盒子刷个颜色、贴张图",真到项目里要写一个全屏首屏、一张带纹理的卡片、一条渐隐的分割线,就开始一边翻文档一边试参数。背景样式这套东西看着简单,实际上它是 CSS 里少数几个"属性数量不多、组合方式极多"的模块:八个属性互相影响,简写里还有顺序陷阱,多层背景的层叠顺序又和盒子模型的裁剪区域绑在一起。把背景样式吃透,你能解决的不只是"好看"的问题,还包括首屏加载体验、文字在图片上的可读性、移动端的渲染抖动、打印时的输出效果这些工程层面的东西。这篇内容适合三类人:刚学完选择器和盒模型、准备啃样式细节的新手;写过不少页面但背景一复杂就靠猜的中级同学;以及想把手上的"氛围感"做成可复用组件的同学。我会沿着"思路拆解、属性精讲、场景落地、踩坑排查"这条线往下走,中间该给公式给公式,该给可直接抄的代码就给代码。

1. 先把背景样式的全局思路理清楚

1.1 图层思维:背景不是一张图,而是一叠纸

理解背景样式的第一道坎,是把"背景"这个词从单数变成复数。浏览器渲染一个元素的背景时,心里想的是"有一个背景定位区(background positioning area),我在这个区域里按从下到上的顺序铺若干层"。background-image支持逗号分隔写多个值,写在最前面的那一层在最上面。这个规则和z-index的直觉正好相反——大多数人第一次写多层背景,都会以为先写的在下、后写的在上,结果调半天发现遮罩把图盖住了。

拿一个最常见的需求举例:图片上要压一层半透明黑,让白色标题看得清。直觉写法是把颜色放在上面,实际写法是:

.hero { background-image: linear-gradient(180deg, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0.15)), url("hero.webp"); background-repeat: no-repeat; background-position: center, center; background-size: cover, cover; }

注意background-position和background-size也是按逗号分层对齐的:第一个值对应第一层(渐变遮罩),第二个值对应第二层(图片)。如果你只写一个值,所有层都会用同一个值,这在某些场合反而方便——比如两层都要cover、都要居中,写一个就够了。一旦某一层需要单独设置,就必须把逗号补齐,否则浏览器会把值按顺序错位分配,出来的是另一种效果,而且不报错,只能靠肉眼对。

理解图层之后,很多"玄学问题"就通了:为什么加了遮罩之后图片变暗了但背景色没了?因为简写或者background-image只写了图片,颜色那条属性被重置了。为什么加了第三层纹理之后,前两层都不见了?因为background-size只写了一个值,导致原本该cover的图变成了默认的auto,图被平铺或者尺寸不对。图层思维建立起来,排查效率至少翻一倍。

1.2 简写与单属性的取舍:什么时候该用 background

background这个简写属性,是背景样式里争议最大的一个。它写起来爽:background: #0f172a url("a.png") no-repeat center / cover;一行搞定五件事。但它有个特别容易吃亏的特性——简写会把它没写的子属性全部重置为初始值。也就是说,你前一天给这个元素设置过background-clip: padding-box,今天在别的地方补了一句background: #fff;,那个background-clip就被干掉了。跨文件改样式的时候,这种问题极难定位,因为你会盯着background-clip那行代码看半天,觉得它明明写对了。

我自己的取舍规则是这样的:组件级别的独立样式块里用简写,方便整体替换;需要精细控制某一两个属性、或者要写多层背景时,用单属性。比如一个按钮的默认态,用简写很清楚;但一个卡片既要纹理又要裁到padding-box,我会老实拆开写。

还有两个简写里必须记住的语法点。第一,尺寸只能跟在位置后面,用斜杠分隔,例如center / cover;位置不能省。第二,位置可以写成两个关键字,也可以用长度或百分比,但斜杠前面的部分必须是完整的位置写法,不能只写一个cover。

/* 合法:位置 + 斜杠 + 尺寸 */ background: #111 url("a.webp") no-repeat center / cover; /* 不合法:想只写尺寸 */ background: #111 url("a.webp") no-repeat cover; /* size 被当成了位置的无效值 */

1.3 八个背景属性的分工表

在动手写之前,先把这八个属性的职责钉死,后面遇到任何需求你都能迅速判断该动哪一个。它们不是平级关系,而是分成三组:画什么、怎么画、画在哪。

属性负责的事关键取值最常被忽略的点
background-color打底色颜色值、transparent、currentColor简写里不写会被重置
background-image铺内容url()、各类 gradient()、多层逗号分隔先写的层在上
background-repeat重复方式repeat、no-repeat、space、roundspace 与 round 的差异
background-size缩放规则auto、长度、百分比、cover、contain百分比相对定位区而非图片
background-position定位点关键字、长度、百分比、四值语法百分比不是"偏移量"
background-attachment是否跟随滚动scroll、fixed、local移动端 fixed 有坑
background-clip绘制到哪一层截止border-box、padding-box、content-box、text与 origin 经常被混淆
background-origin定位起点在哪同上(无 text)只影响位置计算,不影响裁剪

提示:background-clip决定"能画到哪里",background-origin决定"从哪里开始算位置"。一个管裁剪,一个管基准,这在给虚线边框元素设背景时会直接决定观感。

有了这张表,后面所有场景其实都是"选哪几个属性,配什么值"的组合题,而不是记忆题。

2. 八个背景属性逐个拆开讲透

2.1 background-color:颜色写法、透明度与 currentColor

background-color是唯一一个不涉及图层的背景属性,它永远在最底层,而且可以被子元素继承出各种有意思的效果。颜色写法上,十六进制和rgb()是主力,hsl()在做同色系明暗变化时比十六进制舒服得多——比如想做一组"主色调不同明度"的标签背景,用hsl(220 80% 90%)、hsl(220 80% 70%)这样递进,比手调十六进制快。带透明度的rgba()和hsla()在遮罩、毛玻璃、hover 高亮这几个场景里几乎是标配。

transparent需要单独说一句:它是rgba(0, 0, 0, 0)的意思,不是"没设置"。在渐变里做渐隐,必须用透明色,而且要注意透明黑的渐变会发灰这个经典问题。下面两种写法,视觉上差别很明显:

/* 会发灰:从黑过渡到透明黑,中间经过的是半透明灰 */ background: linear-gradient(to right, #000, transparent); /* 干净:显式指定与起始色同色但透明 */ background: linear-gradient(to right, rgb(0 0 0), rgb(0 0 0 / 0));

原因是颜色插值发生在 RGB 空间里,#000到"透明"中间会经过rgba(0,0,0,0.5)这类灰调。想要渐变干净,就要保证过渡两端的色相一致,只让 alpha 变化。

currentColor是我个人很喜欢的取值,它取的是元素当前的color。用它做背景,能天然跟着文字颜色走:一个按钮设了color: #2563eb,背景写background-color: color-mix(in srgb, currentColor 12%, white)就能自动得到一个浅蓝底,改主色的时候背景自动跟着变,不用维护两处颜色变量。

2.2 background-image:从 url 到渐变到多层叠加

background-image的取值远比想象中多。除了url(),还有linear-gradient()、radial-gradient()、conic-gradient()以及对应的repeating-*系列,另外image-set()可以做分辨率适配。这些不是"额外功能",而是背景体系的一部分——很多看起来像图片的效果,用渐变实现更轻、更可控、还能跟随主题色变化。

渐变的第一价值是不产生额外请求。一个纯色到纯色的渐变条、一个径向光晕、一个条纹图案,如果用图片,就是一次 HTTP 请求加一项缓存管理;用渐变,零成本。第二价值是可以参与主题计算,用var(--brand)直接拼进去,暗色模式下一改变量全站生效。

几类渐变的用法差异,用一张表说清楚:

类型形状典型用途需要留意的点
linear-gradient直线方向遮罩、分割线、按钮底色方向关键字与角度容易搞混
radial-gradient圆形或椭圆光晕、聚光灯、涟漪默认椭圆,要圆形必须写 circle
conic-gradient绕中心旋转环形进度、饼图、色轮角度起点在 12 点钟方向
repeating-linear-gradient重复直线条纹、斑马纹必须给出明确的重复长度

linear-gradient的方向,我建议统一用角度而不是to right这类关键字,团队协作时歧义最小:0deg向上、90deg向右、180deg向下。共用一个约定,比每人凭感觉写关键字要靠得住。

多层叠加的时候,除了位置和尺寸要按层对齐,还要注意层数不匹配时的兜底行为:如果background-image写了三层,而background-color只有一个,那没问题;但如果background-position写了两个值对应三层,多出来的那层会用最后一个值循环匹配。这个"循环"规则很多人不知道,所以经常出现"我明明设了三层位置,怎么第三层不对"的情况。稳妥做法是层数统一,写全。

2.3 background-size 与 background-repeat 的配合关系

background-size的五个取值,理解成本最低但用错率最高。cover是"铺满,宁可裁掉边",contain是"完整显示,宁可留白"。这两个词记住一句话就够了:cover 保尺寸不保完整,contain 保完整不保尺寸。做全屏背景永远用cover,做图标永远用contain。

百分比取值和cover的区别,是新手最容易踩的坑。background-size: 100% 100%表示把图片拉伸到和定位区一样大小,会变形;background-size: 100% auto表示宽度撑满、高度按比例;而background-size: cover会在保持比例的前提下尽可能放大,超出部分裁掉。所以"图片铺满容器又不失真",正确写法是cover,不是100% 100%。

还有一点容易忽略:当background-attachment: fixed时,background-size的百分比基准会从元素的定位区变成视口,这个细节会导致同一段代码在加了fixed之后尺寸突然不对。

background-repeat里有两个冷门但很好用的值。space表示图片之间平均分布空隙、不裁切边缘,适合做小图标平铺;round表示图片会被轻微缩放以填满整数个,适合做纹理。做无接缝的纹理背景时用round能避免出现被切掉半块的边缘图案。

注意:写background-repeat: no-repeat时,别忘了同时确认background-position,否则图片默认贴着左上角,在宽容器里看起来像"位置错了",其实是定位没写。

2.4 background-position 的百分比算法与关键字组合

background-position的百分比是最反直觉的地方,必须给公式:

实际偏移量 = (定位区尺寸 - 图片尺寸) × 百分比

比如容器宽 600px,图片宽 200px,background-position: 25%的实际偏移是(600 - 200) × 0.25 = 100px。这就解释了两件事:第一,0%是左边对齐,100%是右边对齐,50%是居中;第二,当图片尺寸大于容器时,公式结果会变成负数,偏移方向反过来,这也是宽图在窄容器里50%依然居中的原因。

理解了公式,就能解释"为什么background-position: 50% 50%和center center完全等价"——关键字其实就是百分比的语法糖。

四值语法值得专门学一下,它在做"从右边 24px、从底部 16px"这种需求时非常直接:

.icon-bg { background-image: url("dot.svg"); background-repeat: no-repeat; background-position: right 24px bottom 16px; background-size: 16px 16px; }

这比用calc()去算百分比可读性好得多。当然,如果容器尺寸会变、图片尺寸固定、又要精确到像素,四值语法和calc()都得看场景,不能一把梭。

2.5 attachment、clip、origin 三兄弟容易混的地方

background-attachment有三个值:scroll(默认,跟随元素自身滚动但相对视口固定)、fixed(相对视口固定,形成视差感)、local(跟随元素内容一起滚动)。fixed做视差效果确实好看,但它在移动端的历史兼容问题不少,而且一旦父级元素上有transform、filter、will-change,fixed的参照系就会被"劫持",变成相对那个元素固定,视觉上突然就崩了。我的做法是:需要视差就用固定高度的容器加cover,或者用两层图层配transform: translateY()做,可控性更好。

background-clip和background-origin是最容易混的一对,因为它们取值列表长得太像。区别一句话:clip 管"到哪为止",origin 管"从哪算起"。最典型的使用场景是虚线边框:

.card { border: 8px dashed #94a3b8; background-color: #f1f5f9; background-clip: padding-box; /* 颜色不渗进虚线缝隙 */ }

默认的border-box会让背景色一直铺到边框外沿,虚线的缝隙里也填满颜色,看着像实线;改成padding-box之后,虚线才真正"虚"起来。这是我在做设计稿还原时最常修的一处细节。

background-clip: text是个特殊值,它让背景只在文字形状内绘制,配合透明文字色就是经典的渐变文字。这个值在部分环境里还需要-webkit-前缀,而且它有个副作用:文字一旦透明,阴影、描边这些依赖文字本身不透明度的效果就会一起受影响,后面场景部分会细说。

3. 五个高频场景的落地写法

3.1 全屏首屏:大图 + 遮罩 + 文字可读性

首屏是全站最考验背景样式的地方。要求通常有三个:图铺满不失真、任意尺寸下文字都看得清、加载不能太慢。前两个靠cover加渐变遮罩就能解决,第三个涉及加载策略,放在第 4 节讲。

遮罩的选择要看图片内容。图片整体偏亮,用均匀的半透明黑;图片底部暗、上部亮,用方向性渐变;图片色彩很杂,用左下角加深的斜向渐变。三种写法:

/* 均匀压暗,最简单也最稳 */ .hero-a { background-image: linear-gradient(rgb(0 0 0 / .55), rgb(0 0 0 / .55)), url("a.webp"); } /* 上浅下深,适合底部放标题 */ .hero-b { background-image: linear-gradient(to top, rgb(0 0 0 / .8), rgb(0 0 0 / 0) 60%), url("b.webp"); } /* 斜向加强,画面更有方向感 */ .hero-c { background-image: linear-gradient(115deg, rgb(0 0 0 / .7), rgb(0 0 0 / .1) 70%), url("c.webp"); } .hero-a, .hero-b, .hero-c { background-repeat: no-repeat; background-position: center; background-size: cover; min-height: 60vh; }

另外一个很多人没用过的技巧是background-blend-mode。它让背景的各层之间用混合模式合成,比如纹理图加纯色底:background-blend-mode: multiply能让纹理和底色融合,不必额外做一张合成图。再比如给整张图统一色偏,overlay和soft-light都是常用值。这个属性的好处是省掉一张导出图,坏处是不同浏览器的色彩处理略有差异,做品牌视觉的时候要真机确认。

提示:background-blend-mode是层与层之间的混合,mix-blend-mode是元素与背景之间的混合,名字像但作用范围完全不同,别混用。

3.2 网格、纹理与渐变分割线

网格背景是后台系统、设计工具类页面里的常客,纯渐变实现只要三行核心代码:

.grid-bg { background-image: linear-gradient(to right, rgb(0 0 0 / .06) 1px, transparent 1px), linear-gradient(to bottom, rgb(0 0 0 / .06) 1px, transparent 1px); background-size: 24px 24px; }

逻辑是:第一层画竖线,第二层画横线,各自用background-size控制间距。想做成"大格子里套小格子",再加两层、把间距改成 120px 即可。想换成点阵,把两条线换成radial-gradient的小圆点就行。这些图案如果导出成图片,一张就得几十 KB,而渐变版本的体积是零。

条纹和斑马纹用repeating-linear-gradient更直接:

.stripes { background-image: repeating-linear-gradient( 45deg, rgb(0 0 0 / .05) 0 6px, transparent 6px 12px ); }

斑马纹表格需要注意的是这个背景要加在tbody tr:nth-child(even)上,而不是加到table上,否则整张表会被纹理覆盖。

段落分割线是另一个高频需求。传统做法是给hr加边框,但直线的两端生硬,接缝明显。用渐变的思路,两端透明、中间实色,视觉上自然得多:

.divider { height: 1px; border: 0; background-image: linear-gradient(to right, transparent, #94a3b8, transparent); }

如果只想让线条占容器一部分宽度,配上width: 60%; margin: 24px auto;就好。这里的关键认知是:背景不只能上色,它本身就是可以画线的绘图工具。

3.3 按钮 hover 与渐变动画的正确姿势

渐变在 hover 上的过渡问题,几乎是每个前端都会遇到的一次顿悟:你写了background-image: linear-gradient(...),然后在:hover里换一个渐变,结果颜色是"啪"地跳过去的,transition完全不起作用。原因是渐变的插值发生在图像层面,浏览器没办法在两个渐变的"像素集合"之间做补间。

正确做法是加一层伪元素承载渐变,用opacity做过渡。透明度是可以补间的,而且性能友好:

.btn { position: relative; isolation: isolate; padding: 12px 28px; border: 0; border-radius: 10px; color: #fff; background-color: #2563eb; cursor: pointer; } .btn::before { content: ""; position: absolute; inset: 0; border-radius: inherit; background-image: linear-gradient(120deg, #2563eb, #7c3aed); opacity: 0; transition: opacity .25s ease; z-index: -1; } .btn:hover::before { opacity: 1; }

这里有两处细节值得抄:border-radius: inherit保证伪元素圆角和按钮一致,不然 hover 时会出现方角;z-index: -1配合父元素isolation: isolate保证伪元素在文字下面又不会被更外层背景遮住。

鼠标移入不只是改背景色,很多设计还会配一条从左到右扫过的高光。实现方式是把linear-gradient做成一段窄的透明-白-透明,然后过渡background-position:

.shine { background-image: linear-gradient(100deg, transparent 30%, rgb(255 255 255 / .35) 50%, transparent 70%); background-size: 220% 100%; background-position: 180% 0; transition: background-position .6s ease; } .shine:hover { background-position: -80% 0; }

3.4 文字渐变裁剪与描边的注意事项

渐变文字的实现代码很短,但坑不少:

.title-gradient { background-image: linear-gradient(90deg, #f97316, #ec4899 60%, #8b5cf6); background-clip: text; -webkit-background-clip: text; color: transparent; }

三个必须留意的地方。第一,文字必须真的透明,color: transparent不能省,否则渐变被文字色盖住看不到。第二,一旦文字透明,text-shadow就会在文字后面透出来变成"影子背景",想要描边就得靠别的手段,比如叠一层伪元素文字做描边,或者改用-webkit-text-stroke(注意它是描边线、会占掉笔画内部空间,粗笔画字上会显得瘦)。第三,部分环境里-webkit-text-fill-color: transparent和color: transparent会同时存在,前者优先级更高,如果你之后想给这段文字改颜色,改color是不生效的,得一起改。我自己倾向于只用color: transparent,少留一个隐性覆盖。

还有一个兼容性上的现实问题:background-clip: text在选中文字时的高亮可能表现不一致,长段落正文慎用,短标题用是安全的。

3.5 涟漪光圈与氛围光:低成本做出高级感

"涟漪扩散"效果用径向渐变加background-size动画能做出来,写起来很短:

.ripple { background-image: radial-gradient(circle, rgb(56 189 248 / .45) 0%, rgb(56 189 248 / 0) 70%); background-repeat: no-repeat; background-position: center; background-size: 0% 0%; animation: ripple-spread 1.6s ease-out infinite; } @keyframes ripple-spread { from { background-size: 0% 0%; } to { background-size: 220% 220%; } }

它能跑,但我要诚实地说:动画background-size会触发重绘,单个元素没问题,几十个一起动就会掉帧。生产环境里我更常写成两层结构——外层固定尺寸的径向渐变,内层用transform: scale()加opacity做扩散,transform和opacity走合成层,性能好一个数量级:

.ripple-safe { position: relative; background-image: radial-gradient(circle, rgb(56 189 248 / .45), transparent 70%); } .ripple-safe::after { content: ""; position: absolute; inset: 25%; border: 2px solid rgb(56 189 248 / .6); border-radius: 50%; animation: ripple-ring 1.8s ease-out infinite; } @keyframes ripple-ring { from { transform: scale(.4); opacity: .8; } to { transform: scale(1.8); opacity: 0; } }

同样的思路可以用来做"氛围光":在卡片的一角放一个模糊的径向渐变,把background-position设在角落,视觉上立刻有层次。注意渐变的光晕要有衰减曲线,两个色标之间加一个中间色标会让过渡更自然,不然会看到一圈明显的边界。

4. 性能、兼容与踩坑排查

4.1 背景图的加载时机与性能代价

有一个认知必须建立:background-image里的图片,不会被浏览器作为"有意义的图片资源"对待。它没有替代文本,也不参与首屏关键资源的预加载优先级判断。所以把首屏主视觉做成背景图,往往会比用<img>加载慢一截,而且搜索引擎和辅助技术也读不到它。

我的判断标准很直接:这张图承担内容表达,就用<img>;只承担氛围和装饰,才用背景。首屏主图、文章配图、商品主图属于前者;网格纹理、光晕、装饰性图形属于后者。装饰性图形还有一个升级方案——用内联的 SVG 数据做背景,可以随手改颜色,也不用多一次请求:

.dot-bg { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Ccircle cx='1' cy='1' r='1' fill='%2394a3b8'/%3E%3C/svg%3E"); background-size: 8px 8px; }

注意数据 URI 里的#必须转义成%23,否则会被当成片段标识符截断,这是内联 SVG 背景失效最常见的原因。

分辨率适配可以用image-set()一次声明同一张图的多个版本,让浏览器按设备像素比挑:

@media-bg { background-image: image-set( url("hero.webp") 1x, url("hero@2x.webp") 2x ); }

体积层面,背景图宁可多花点时间导出成 AVIF 或 WebP,也别用一张原始 JPG 硬扛。全屏背景控制在 200KB 以内是比较舒服的量级,超出的话首屏体验会明显打折。

4.2 常见问题速查表

下面这张表基本覆盖了我在团队里被问过的全部背景问题,按现象查就行。

现象常见原因处理方式
背景图 404 或者不显示图片路径是相对 CSS 文件的位置,不是相对 HTML按 CSS 文件所在目录写相对路径,或临时换绝对路径确认
背景图铺满后被拉伸变形写了background-size: 100% 100%改用cover,或100% auto保持比例
多层背景只有最后一层可见层叠顺序相反,或background-size只写了一个值第一层在最上;位置和尺寸按层补全
渐变的 hover 过渡不生效渐变之间无法补间伪元素承载渐变 +opacity过渡
虚线边框的缝隙被颜色填满默认background-clip: border-box改成padding-box
渐变渐隐处发灰从颜色过渡到transparent时经过了灰调用同色相不同 alpha 的颜色做两端
打印时背景全部消失浏览器默认不输出背景加print-color-adjust: exact,并提醒用户开启背景打印
加了transform后fixed背景乱跳父级创建了新的包含块去掉父级transform,或改用普通cover方案
背景色在暗色模式下刺眼硬编码颜色,没跟随变量用color-mix()或var()从主色派生
内联 SVG 背景不生效数据 URI 里的#没转义写成%23

注意:space和round在旧环境下的支持度不如前三个值,如果项目要求覆盖很老的浏览器,这两个值当增强用,不要当基础布局依赖。

4.3 我自己的调试自查清单

背景类问题有个特点:不报错、不崩溃,就是"看起来不对"。所以排查靠的是固定顺序,而不是随机试。我自己的顺序是这样的。

先看路径。把样式面板里那条url()复制出来,在地址栏直接打开,能打开说明路径没问题,打不开就是路径或者资源本身的问题。这一步能解决大概三成的"背景不显示"。

再看层。在开发者工具的样式面板里,把background-image临时改成只有一层,确认那一层能不能正常显示,然后一层一层加回来。多层背景出问题,九成是层序或者属性值数量对不上。

再看盒子。给元素临时加个高亮背景色,看它实际占多大区域、是不是被overflow: hidden裁掉了、height是不是为 0。背景画在一个高度为 0 的元素上,是不会有任何显示的,这个原因听起来傻,但真的常见——尤其是用了padding-bottom撑比例的元素,一旦外层约束变了,高度就塌了。

最后看覆盖。用开发者工具的元素检查功能看该元素最终生效的背景属性是哪一条,是不是被后面的规则或者简写覆盖了。这一条专治"我明明写了"的疑难杂症。

顺着这个顺序走,基本能覆盖绝大多数情况。真正的经验是:背景问题里,超过一半根本不在背景属性本身,而在盒子的尺寸、层级和资源路径上。所以别一上来就怀疑background-size,先把盒子和资源排查干净,能省很多时间。

一个我踩了很久才想明白的细节:同一个页面上大面积的渐变背景,如果数量多、又都带background-attachment或者参与动画,内存占用会明显高于图片方案。渐变虽然省请求,但它每次都要参与栅格化。做纯装饰的大面积纹理时,简单图案用渐变、复杂图案用图片,这个取舍比"一律用渐变"更实际。

还有一点值得留个心眼,就是背景和文字对比度的关系。设计稿上看着舒服,实机上因为图片明暗分布不均,文字可能在某个断点位置刚好压在亮部上看不清。所以背景遮罩建议留一点余量,比"刚好能看清"再深一档;在响应式里配合@media调整遮罩强度,比一套遮罩走天下要靠得住。我在实际项目里就是这么做收尾的:任何叠在图片上的文字,都在最小和最大两个断点上各看一遍,确认都过关再交付。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询