CSS贴图效果实战:用样式绘制纹理并用CSSO压缩优化 📅 发布时间:2026/9/3 1:50:04 👁 浏览次数: 很多前端开发者在做“贴图效果”时第一反应是切一张 PNG 或 JPG 丢进页面再用background-position或者object-fit慢慢调位置。遇到渐变、光泽、纹理叠加就只能继续切图结果页面体积越来越大首屏加载越来越慢换一套皮肤还要重新出一套图片。这个问题的根源不是设计资源不够而是很多人低估了 CSS 本身能做多少事情。如果把贴图效果理解成“用图片贴上去”思路就被图片格式和网络请求限制住了如果把它理解成“用样式绘制纹理”那渐变、阴影、滤镜、伪元素、遮罩、动画全部可以成为贴图工具而且这些能力几乎全部由浏览器 GPU 合成加载成本远低于图片。这篇文章要讲清楚一条完整的优化路径先理解 CSS 贴图效果的本质再掌握一款轻量级 CSS 优化工具 CSSO 1.0 在工程中的接入方式最后通过一组可复制的示例把渐变、噪点纹理、光晕、卡片质感这些高频“贴图效果”用纯 CSS 做出来并把样式文件体积压到最低。读完你会得到三个东西一套不再依赖切图的视觉效果实现思路一套 CSS 代码压缩与结构优化的工程配置以及一份可以直接贴在项目里的排错清单。1. 这篇文章真正要解决的问题日常开发中“贴图效果”这个词听着简单实际踩坑的人非常多。最常见的场景是这样的设计师给了一张带磨砂玻璃质感的弹窗背景你直接把这个背景做成整张图片弹窗尺寸一变图片拉伸变形为了适配不同屏幕又出了 2x、3x 两套图为了减少请求数你还可能把它转成 base64 塞进 CSS结果 CSS 文件直接膨胀到几百 KB。页面是用图片“贴”出来了但性能和维护性全部牺牲掉了。另一种常见场景是你其实已经用 CSS 写出了不错的效果但代码里堆了几百行样式颜色值满天飞相似的渐变块重复出现压缩工具也不太会用样式文件越来越大。项目跑起来之后每次改主题都要翻半天选择器。这两类问题恰好对应两个层面的优化第一层是视觉实现层。用 CSS 的渐变、滤镜、遮罩、混合模式、伪元素来替代静态图片实现“贴图”的视觉结果。这样做的收益是效果是矢量的不随尺寸变形颜色和透明度可编程改主题只改变量没有额外图片请求加载速度更快。第二层是工程构建层。用 CSSO 这类优化器对样式文件做深度压缩和结构合并。很多人会用 Webpack 或 Vite 内置的 CSS 压缩但内置压缩往往只做了空白删除和注释清理CSSO 还能做结构优化把重复声明合并、把过长的属性值缩短、把无用的分号清理干净。在项目里接入之后CSS 产物体积通常能再降 10% 到 30%。从实用角度看最值得读这篇文章的读者有三类日常写页面、做活动页、做可视化大屏的前端工程师正在被图片体积和样式维护成本困扰。负责前端工程化配置想把 CSS 产物压缩做到位的开发者。想做 CSS 视觉效果但不太清楚渐变、滤镜、遮罩怎么组合使用的新手。下面先从概念讲起把“CSS 贴图效果”和“CSSO”这两个关键词掰开揉碎。2. 基础概念CSS 贴图效果与 CSSO 优化器2.1 什么是 CSS 贴图效果“贴图效果”不是 CSS 规范里的官方术语它是实际开发中对“用样式绘制类似图片纹理的视觉效果”的统称。传统做法里一个按钮的金属质感通常是这样实现的设计师切一张带高光和阴影的按钮背景图前端用background-image引入。这种做法的优点是效果稳定缺点也很明显图片体积、尺寸适配、多倍屏适配都要处理。用 CSS 实现同类效果时不再依赖位图而是依赖浏览器绘制能力。核心技术包括linear-gradient和radial-gradient绘制线性渐变、径向渐变相当于把“颜色过渡”变成可编程的纹理。box-shadow绘制外阴影、内阴影、多层阴影用来模拟立体感和光晕。filter对元素施加模糊、亮度、对比度、饱和度的变化常配合伪元素制造发光和滤镜质感。mask与clip-path裁剪元素显示区域实现不规则形状和遮罩过渡。mix-blend-mode让元素与背景发生颜色混合适合做质感叠加。伪元素::before和::after在不增加 HTML 节点的情况下叠加额外的纹理层。background-blend-mode在同一元素的多张背景图之间做混合配合背景渐变可以模拟噪点、纸张纹理、颗粒感。把这些能力组合起来可以做出很多看起来“必须用图”的效果。关键在于一个思维转变CSS 贴图效果不是“把图片贴上去”而是“用样式把视觉纹理画出来”。2.2 什么是 CSSO 以及它和 CSS 压缩的区别CSSO全称 CSS Optimizer是一个基于 Node.js 的 CSS 优化工具。它的目标不是简单删除注释和空格而是对 CSS 的语法结构进行解析、分析、重写在保证样式含义不变的前提下让代码更短、更紧凑、更规范。很多人会把 CSSO 和常见的 CSS 压缩混淆。其实它们的目标层级不一样。传统 CSS 压缩做的是文本层优化/* 压缩前 */ .button { margin: 0px; padding: 10px 10px 10px 10px; color: #ffffff; background-color: #ff0000; }/* 传统压缩后 */ .button{margin:0;padding:10px;color:#fff;background-color:red}CSSO 除了做文本层优化还会做结构层优化它会解析选择器、声明、属性值然后进行安全合并和重写。例如合并相同选择器的多条规则。移除被覆盖的重复声明。压缩和合并相邻的 margin、padding、border 等简写属性。优化颜色表示比如把#ff0000写成red。移除无意义的单位比如0px中的px。移除最后一个分号。删除没有效果的空规则。需要特别强调的是CSSO 的优化是“安全”的它只在保证渲染结果一致的前提下做重写。它不会像某些激进工具那样为了压缩而破坏样式。实际工程中CSSO 经常作为 PostCSS 插件或构建工具插件出现但也有独立的 CLI 和 API 方式。1.0 版本指的是这类工具的早期稳定版本体系重点演示链路清晰、可用的接入方式。下面我以一个典型的构建流程为例讲清楚怎么把它用起来。3. 环境准备与前置条件在开始实操之前先把环境准备好。本文的示例以 Node.js 环境为主因为 CSSO 本身就是一个 Node.js 工具接入现代前端构建流程最方便。3.1 基础环境Node.js 环境建议使用 14 及以上版本。版本号请以实际项目为准本文重点演示通用思路。npm 或 yarn 包管理器用来安装依赖。一个最简单的 HTML/CSS 项目不需要引入复杂框架方便观察 CSSO 的优化效果。如果你还没有项目目录可以先用下面的命令初始化mkdir css-effect-demo cd css-effect-demo npm init -y3.2 安装 CSSO使用 npm 安装 CSSOnpm install csso --save-dev安装完成之后可以用下面的命令确认是否安装成功npx csso --version如果能看到版本号输出说明 CSSO 已经就绪。3.3 准备测试文件在项目目录下创建一个src文件夹并且创建两个文件。src/index.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 / meta nameviewport contentwidthdevice-width, initial-scale1.0 / titleCSS 贴图效果与 CSSO 优化演示/title link relstylesheet href./style.css / /head body main classstage div classcard card--glass磨砂玻璃卡片/div div classcard card--metal金属质感按钮/div div classcard card--glow光晕扩散效果/div div classcard card--noise噪点纹理区域/div /main /body /htmlsrc/style.css/* 基础样式 */ * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: PingFang SC, Microsoft YaHei, sans-serif; min-height: 100vh; display: flex; align-items: center; justify-content: center; background: #0f172a; padding: 24px; } .stage { display: grid; grid-template-columns: repeat(2, 1fr); gap: 24px; max-width: 960px; width: 100%; } .card { border-radius: 16px; min-height: 180px; display: flex; align-items: center; justify-content: center; color: #f8fafc; font-size: 18px; font-weight: 600; letter-spacing: 2px; position: relative; overflow: hidden; }这段样式先不追求效果目的是给后面的优化对比准备一份“未压缩”的输入。接下来进入核心流程。4. 核心流程拆解CSSO 接入与贴图效果实现4.1 用 CSSO 命令行完成第一次压缩CSSO 最直接的用法是命令行。语法如下npx csso 输入文件 [输出文件] [选项]把刚才的src/style.css压缩到dist/style.min.cssmkdir -p dist npx csso src/style.css dist/style.min.css执行完成后可以在dist/style.min.css里看到压缩结果。如果只想在终端预览而不写文件可以省略输出文件参数npx csso src/style.cssCSSO 推荐的文件后缀不是固定的.min.css是常见约定你也可以用.css。很多构建工具里CSSO 处理完之后再由插件重命名这个不影响压缩逻辑本身。4.2 把 CSSO 接入 npm 脚本每次手敲命令不够方便更推荐把压缩写入package.json的scripts字段{ name: css-effect-demo, version: 1.0.0, scripts: { build:css: csso src/style.css dist/style.min.css }, devDependencies: { csso: ^1.0.0 } }之后执行npm run build:css这样每次修改完样式只需要执行一条命令就能得到压缩版本。4.3 理解 CSSO 的优化效果为了更直观地理解 CSSO 做了什么可以对比一段未压缩和压缩后的代码。未压缩版本注意这里故意写了一些冗余声明.main-title { margin: 0px; margin-bottom: 12px; padding: 10px 10px 10px 10px; color: #ffffff; background: #ff0000 none repeat scroll 0% 0%; border-width: 1px 1px 1px 1px; border-style: solid; border-color: #000000; }CSSO 处理后会变成类似这样.main-title{margin-bottom:12px;padding:10px;color:#fff;background:red;border:1px solid #000}可以看到它做了几件事删除了margin: 0px这种默认值。保留了margin-bottom这个有效声明。把四个值相同的padding合并成padding: 10px。把#ffffff和#ff0000缩短为#fff和red。把四边相同的border-width、border-style、border-color合并成border简写。删除了不影响渲染的多余空格和分号。这里要特别提醒一个容易误解的点CSSO 不会盲目删除所有默认值。它依赖解析器和规则库来判断哪些值是安全的。不同版本的 CSSO对同一段代码的压缩结果可能略有差异这个差异不影响整体思路。实际项目中如果你遇到了“压缩后样式变了”的情况通常是压缩前就存在无效或冲突声明而不是 CSSO 改坏了你的样式。4.4 在构建工具中接入 CSSO很多项目并不直接使用命令行而是通过 Webpack、Vite 或 PostCSS 进行构建。CSSO 也可以作为 PostCSS 插件接入。安装 PostCSS 和 CSSO 插件npm install postcss postcss-csso --save-dev创建postcss.config.jsmodule.exports { plugins: [ require(postcss-csso)({ restructure: true, comments: false }) ] };关键参数说明restructure是否启用结构优化。开启后 CSSO 会尝试合并和重排规则体积更小但在极少数复杂选择器场景下可能有风险。生产环境建议开启灰度验证时可以先关闭。comments是否移除注释。生产环境建议false但如果你依赖 CSS 注释做标记或调试可以保留。在 Vite 项目中可以通过css.postcss配置加载同一个文件// vite.config.js export default { css: { postcss: ./postcss.config.js } };在 Webpack 项目中可以使用postcss-loader并且把它放在 CSS 处理链路的最后阶段。这里需要给出明确判断如果你用的是 ViteVite 默认的 CSS 压缩已经可以满足大部分需求CSSO 的价值更多体现在需要精细控制压缩策略、或者没有使用框架自带压缩工具的旧项目里。如果你的项目构建链很复杂不建议贸然把多个压缩工具叠加先检查是否已经存在 cssnano 或 esbuild 压缩避免重复压缩导致意外问题。5. 完整示例用 CSS 实现四类高频贴图效果为了让贴图效果的优化路径更完整下面给出四个可以直接复制到项目里的示例。它们分别覆盖了磨砂玻璃、金属质感、光晕扩散、噪点纹理都是平时“必须切图”的高频场景。这些示例有两个共同特点一是没有引入任何图片资源全部由 CSS 绘制二是都写成了比较规范的样式结构方便交给 CSSO 优化。5.1 磨砂玻璃卡片磨砂玻璃效果Glassmorphism在近两年的设计风格中非常流行。实现的核心是半透明背景、背景模糊、细边框和内外阴影的组合。将下面的内容追加到src/style.css.card--glass { background: rgba(255, 255, 255, 0.12); backdrop-filter: blur(16px) saturate(180%); -webkit-backdrop-filter: blur(16px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.22); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.36); }关键逻辑background使用半透明白色制造“透过玻璃看背景”的层次感。backdrop-filter是关键属性它让元素背后的内容产生模糊和饱和度变化。-webkit-前缀用于兼容 Safari 和旧版 Chrome。半透明边框提亮边缘模拟玻璃边缘的反光。外阴影把卡片从背景中“抬”起来。需要注意backdrop-filter对浏览器性能有一定消耗。页面中如果大量使用滚动时可能出现卡顿。建议在卡片数量多的时候把模糊半径控制在合理范围内并且避免在超大元素上使用。5.2 金属质感按钮金属质感的关键是高光、过渡和边缘暗部。用多层渐变可以模拟这类反射效果。.card--metal { background: linear-gradient(180deg, rgba(255, 255, 255, 0.6) 0%, rgba(255, 255, 255, 0) 40%), linear-gradient(180deg, #c0c7d0 0%, #8a94a6 45%, #4f5b6d 100%); border: 1px solid rgba(0, 0, 0, 0.25); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.8), inset 0 -2px 6px rgba(0, 0, 0, 0.18), 0 10px 20px rgba(0, 0, 0, 0.3); color: #1e293b; }关键逻辑第一层linear-gradient绘制高光带从顶部白色半透明过渡到透明这模拟的是金属表面的反射亮条。第二层linear-gradient绘制金属底色从上到下由亮到暗形成圆柱体的体积感。box-shadow中inset内阴影模拟了边缘的厚度和暗部外阴影则让按钮有悬浮感。文字颜色选择了深色避免在亮色金属背景上对比度不足。这个效果真正容易踩坑的地方是渐变的百分比位置。如果高光过渡的位置不对金属感会非常生硬。建议把第一层渐变的高光结束位置放在35%到45%之间视觉上比较自然。5.3 光晕扩散效果光晕效果常被用于状态提示、加载动画、地图定位点。原理是两层结构核心圆点加扩散的波纹。这里用::before和::after伪元素来实现。.card--glow { background: radial-gradient(circle at center, #38bdf8 0%, #0284c7 60%, transparent 100%); border: none; } .card--glow::before { content: ; position: absolute; inset: 0; border-radius: 16px; background: radial-gradient(circle, rgba(56, 189, 248, 0.9) 0%, transparent 70%); animation: glow-pulse 2.2s ease-out infinite; z-index: -1; } keyframes glow-pulse { 0% { opacity: 0.7; transform: scale(0.9); } 100% { opacity: 0; transform: scale(1.6); } }关键逻辑radial-gradient从中心向四周扩散形成光斑的底色。::before是扩散波纹层通过animation不断放大并降低透明度产生脉冲效果。z-index: -1保证波纹扩散时不会挡住文字内容。transform: scale()是动画性能最好的方式之一因为它只触发合成层不触发重排。实际项目中如果希望光晕沿着不规则形状扩散可以把border-radius改成50%或者使用clip-path。但要注意clip-path会裁剪伪元素如果动画里包含超出元素的阴影边缘会被裁掉。5.4 噪点纹理区域噪点纹理在设计中常用于模拟纸张质感、胶片颗粒感、或者给大面积纯色背景增加细节。传统做法是引用一张噪点 PNG 图片这里用 CSS 的重复渐变来模拟颗粒感。.card--noise { background: repeating-radial-gradient( circle at 17% 32%, rgba(255, 255, 255, 0.08) 0px, rgba(255, 255, 255, 0.08) 1px, transparent 1px, transparent 3px ), linear-gradient(135deg, #1e293b 0%, #0f172a 100%); }关键逻辑repeating-radial-gradient会不断重复一个从中心向外扩散的渐变环产生类似噪点的细小颗粒。颗粒的大小由1px和3px这些数值控制数值越大颗粒越粗。第二层linear-gradient是底色噪点层叠加在上面形成质感。这个方案并非真正的随机噪点颗粒分布有规律性但在大多数背景下视觉上已经足够。如果想要完全随机颗粒只能使用 SVG 滤镜或者 Canvas 生成那不是本文讨论范围。项目对纹理随机性要求极高时再考虑图片方案。5.5 组合使用与维护建议上面四种效果可以自由组合。例如在金属按钮上叠加噪点纹理在磨砂玻璃上叠加光晕。组合时记住一个原则一层渐变负责一种视觉维度。底色负责体积高光负责反射噪点负责质感动画负责状态变化。每一层之间用逗号分隔顺序上靠前的层会覆盖靠后的层。当你写下很多层渐变时CSS 代码的可读性会下降。建议在每一条规则上方写一行注释说明这一层渐变负责什么。CSSO 压缩时会移除注释不影响产物体积但对维护者非常友好。6. 运行结果与效果验证6.1 查看页面效果在src目录下启动一个本地静态服务器npx serve src打开浏览器访问终端输出的地址比如http://localhost:3000。正常情况下你应该看到四张卡片分别呈现磨砂玻璃、金属、光晕脉冲、噪点纹理效果。如果页面空白优先检查index.html中样式文件路径是否正确。由于我们最终要把 CSS 输出到dist目录这里有两种选择一种是在 HTML 中直接引用src/style.css开发环境看到的是未压缩版本另一种是构建完 CSS 之后把 HTML 中引用改成dist/style.min.css。个人建议开发环境直接引用源文件构建发布时才切换为压缩文件。6.2 验证 CSSO 压缩效果执行压缩命令npm run build:css然后对比源文件和压缩文件的体积ls -lh src/style.css dist/style.min.css在文件不太大时体积差异可能只有几 KB但在真实项目里几百 KB 的样式文件经过 CSSO 处理体积下降会非常明显。判断压缩是否成功的标准有三个压缩文件存在并且路径正确。文件内容不包含多余空格、注释和分号。浏览器页面效果和压缩前保持一致。6.3 验证优化前后的一致性把dist/style.min.css复制到src/下临时命名为style.prod.css修改index.html把它引用为测试样式表刷新页面观察四张卡片是否仍然正常显示。这一步很关键因为 CSSO 的优化是语法级的理论上不会改变渲染结果。如果发现某个效果变了对比源文件和压缩后文件中相关选择器的差异确认是不是原有 CSS 写法就存在歧义。确认没有问题时删除测试文件恢复原样。7. 常见问题与排查思路CSS 贴图效果和 CSSO 压缩这两个方向在实践中最容易遇到一些问题。下面把高频问题整理成表格。问题现象可能原因排查方式解决方案backdrop-filter不生效浏览器不支持或未加前缀打开 DevTools 查看 Computed 样式添加-webkit-前缀确认浏览器版本渐变效果显示为纯色渐变方向或百分比写错在浏览器中临时删掉一层渐变观察检查渐变的to方向和%位置伪元素动画遮挡文字z-index设置不合理临时把伪元素背景改成红色调整z-index文字容器设置更高的层级CSSO 压缩后样式缺失原 CSS 存在重复或冲突声明对比源文件和压缩文件的相关规则修复源文件中的无效声明保留有效声明CSS 压缩后体积变化不明显源文件本身已经精简检查文件是否包含大量简写属性和较短颜色值使用restructure开启结构优化多个压缩工具叠加导致样式异常Webpack/Vite 中同时使用了 cssnano 和 CSSO查看构建配置中的 CSS 处理链只保留一个压缩工具构建后注释消失团队无法定位代码comments设置为 false检查 postcss-csso 配置开发环境保留注释生产环境再移除几个容易混淆的概念这里专门说明backdrop-filter和filter不一样。filter只作用于元素自身backdrop-filter作用于元素背后的内容。磨砂玻璃必须用后者。linear-gradient和background-color可以同时存在。如果渐变加载失败或语法错误浏览器会回退到背景色。这个特性可以用来做降级处理。CSSO 和 cssnano 不是同一个工具。cssnano 基于 PostCSSCSSO 是独立解析器。两者都能压缩 CSS但优化策略不同不要同时启用两个。8. 最佳实践与工程建议8.1 贴图效果的代码组织CSS 贴图效果写多了之后最怕两件事一是样式类名看不出来效果类型二是渐变层数太多导致别人看不懂。推荐的做法是把视觉层拆成原子类。例如.glass { background: rgba(255, 255, 255, 0.12); backdrop-filter: blur(16px) saturate(180%); -webkit-backdrop-filter: blur(16px) saturate(180%); border: 1px solid rgba(255, 255, 255, 0.22); } .metal { background: linear-gradient(180deg, rgba(255, 255, 255, 0.6) 0%, rgba(255, 255, 255, 0) 40%), linear-gradient(180deg, #c0c7d0 0%, #8a94a6 45%, #4f5b6d 100%); } .glow { background: radial-gradient(circle at center, #38bdf8 0%, #0284c7 60%, transparent 100%); }然后在业务类中组合使用.navbar { composes: glass; } .confirm-btn { composes: metal; }CSS Modules、Tailwind、或者原生 CSS 都可以实现类似组合。原子化的好处是视觉效果被复用而不是被复制粘贴。项目里如果有 20 个地方用到磨砂玻璃只需要维护一份基础类。8.2 颜色与尺寸走变量贴图效果中颜色和数值非常多。强烈建议把关键颜色抽成 CSS 变量否则换主题时会非常痛苦。:root { --glass-bg: rgba(255, 255, 255, 0.12); --glass-border: rgba(255, 255, 255, 0.22); --metal-light: #c0c7d0; --metal-mid: #8a94a6; --metal-dark: #4f5b6d; --glow-primary: #38bdf8; --glow-deep: #0284c7; }替换主题时只需要调整:root中的变量值。这在 CSSO 压缩后同样有效因为变量引用的是运行时计算值压缩不影响变量机制。8.3 CSSO 的接入边界CSSO 在工程中的定位是“构建产物优化”不是“开发调试工具”。它的作用是把臃肿的 CSS 变短但它不能替你解决 CSS 结构混乱的问题。如果源文件里到处是!important、深层嵌套、重复选择器先把结构理顺再交给 CSSO 压缩否则压缩完也只是“短了但依然乱”。在生产环境中接入 CSSO建议遵循以下原则确保在测试环境验证压缩后页面样式无异常。在构建配置中保留源文件的 Sourcemap方便线上问题定位。每次升级 CSSO 版本后对比压缩前后的产物差异避免新版优化规则影响特殊写法。不要把压缩后的 CSS 作为唯一产物提交到代码仓库源文件仍然要保留。如果项目使用了 CSS Modules 或 styled-components需要确认压缩插件与这些方案的类名生成机制兼容。8.4 性能优化的完整视角用 CSS 替代图片只是性能优化的一部分。即使所有贴图效果都用 CSS 实现了如果单个页面同时存在大量模糊、渐变和动画GPU 合成压力依然不小。合理的策略是贴图效果优先使用 CSS减少图片请求。避免在position: fixed的大面积元素上使用backdrop-filter滚动时会持续触发重绘。动画属性优先使用transform和opacity而不是width、height、top、left。渐变层数控制在合理的范围内多层渐变虽然不会增加请求但会增加绘制成本。在移动端低端设备上测试动画流畅度必要时降低动画帧率或模糊半径。这套思路的关键不只是一个工具或一个 CSS 属性而是把“视觉实现”和“工程构建”两条线打通。视觉实现层负责减少图片资源工程构建层负责减少样式体积两层叠加才能真正把贴图效果做到又快又好看。9. 总结与后续学习方向这篇文章讲了三个层面的内容。第一贴图效果不一定要用图片。CSS 的渐变、滤镜、遮罩、混合模式、伪元素和动画组合起来足以应付磨砂玻璃、金属质感、光晕扩散、噪点纹理这些高频场景。核心思维转变是“用样式绘制纹理而不是用图片贴纹理”。第二CSSO 是 CSS 优化链路里值得了解的工具。它能做注释清理、属性值压缩、结构合并等深度优化在命令行、npm 脚本、PostCSS 插件三种方式下都能使用。接入成本不高但收益取决于源文件结构和原有压缩手段。第三工程实践不能只看单个工具。视觉效果的代码要原子化、变量化压缩工具的配置要在测试环境验证性能优化要同时考虑绘制成本和文件体积。后续可以继续深入的方向有几个CSS 滤镜与混合模式的更多组合用法尤其适合做暗色模式下的微质感。CSS 自定义属性与渐变结合实现主题化贴图效果。浏览器渲染管线的知识理解为什么transform动画比width动画更流畅。PostCSS 生态中 cssnano 与 CSSO 的对比分析根据不同项目场景选择合适的压缩方案。如果你正在做一个对视觉效果要求高、同时又不希望页面体积失控的项目建议把本文的四个示例代码建一个 demo 项目跑一遍按照第 4 节的流程接入 CSSO然后实际对比一下页面体积的变化。只有在真实项目里验证过这套流程你才会真正理解“贴图效果”这四个字应该落在 CSS 上而不是图片请求上。建议收藏备用。