CSS 格式化 / 压缩

美化 CSS 缩进排版,也能一键压缩去掉冗余空白

CSS 格式化与压缩:calc 里的空格为什么不能删

压缩具体删了什么

CSS 压缩(minify)是安全地去掉语法上非必需的字符。常见优化包括:

优化示例
删除注释/* ... */ 全部移除(包括版权声明——商业项目要注意许可证是否要求保留)
折叠空白与换行多条规则压成一行
删除最后一个分号color:red;} → color:red}
零值去单位margin: 0px → margin: 0
缩短十六进制颜色#ffffff → #fff,#aabbcc → #abc
省略小数前导零0.5em → .5em

体积通常能减少 20%~30%。但有一点要清楚:如果你在 HTTP 层开了 gzip 或 brotli 压缩,手工压缩 CSS 的额外收益很小——通用压缩算法本身就会消除重复的空白与结构。压缩真正有价值的地方是:不能启用服务端压缩的静态托管、内联在 HTML 里的样式块、以及有严格体积限制的场景。

不能删的空格:calc()

这是压缩 CSS 时最危险的一处。CSS 的 calc() 里,加号和减号两侧必须有空格:

写法结果
calc(100% - 10px)正确
calc(100%-10px)失效(会被解析成无效表达式)
calc(100% -10px)失效

原因是解析器遇到 100% 后会尝试识别一个数字或单位标记,-10px 被当作负值而不是减法运算,整体表达式非法。

乘号和除号不受影响(calc(100%/3) 合法),因为乘除不需要依靠空白来区分操作数和运算符。所以"统一删除所有空格"的实现会悄悄破坏所有用加减法的 calc,表现为布局突然错位——而且这类 bug 在压缩后只出现在线上,本地开发看不到。工具在压缩时会保留 calc() 内加减号两侧的空格。

其他格式化注意点

  • 注释在压缩时会被删掉。用注释做的 hack(如给某些选择器故意留标记)、以及许可证声明都会消失。需要保留的内容应写在单独的许可文件里。
  • 选择器之间的空白是有意义的。.a .b(后代)与 .a.b(同时匹配)完全不同,压缩时不能把选择器内的空格一律删除。
  • 属性选择器和内容里的引号。content: "";、[href^="http"] 里的引号必须保留,删除会导致语法错误。
  • !important 前后的空白可以压缩,但 ! 与 important 之间的空白在部分老解析器里不允许省略。! important 和 !important 都合法,压缩时统一成后者最保险。
  • 自定义属性(CSS 变量)的值是原始 token。--gap: 8px 16px; 里的空白是值的一部分,压缩算法不应随意处理自定义属性的值。
  • 媒体查询与嵌套。压缩后一堆规则挤在一行会让排查困难,所以保留一份未压缩的源文件是必要的——压缩产物只应作为部署产物,不该作为编辑对象。

工具怎么用

两个方向:格式化(按规则集缩进排版,便于阅读和评审)、压缩(去掉冗余空白,用于部署)。可逆性不同——压缩是不可逆的(注释和格式信息已经丢失),所以压缩务必在源文件的副本上做。

处理在浏览器本地完成。

常见问题

压缩会删掉注释吗?

会。压缩模式会移除 /* */ 注释并去掉所有冗余空白,体积显著减小,适合上线。

压缩会改变样式效果吗?

不会。只在语法允许处去除空白,等价压缩。