什么是 CSS 压缩?
CSS 压缩是在不改变样式表行为的前提下,移除所有不必要字符的过程。具体包括:删除空白字符、换行符、注释,以及尾部分号、多余引号等冗余语法。浏览器解析压缩后的 CSS 与解析原始格式的 CSS 完全一致。W3C CSS 语法模块定义了相关语法规则:标记之间的空白字符是可选的,仅在分隔标识符时必须保留。压缩正是利用了这一特性,将样式表精简到最少所需字符。
在线 CSS 压缩工具接收你格式化后的样式表,输出针对传输大小优化的紧凑版本。典型压缩率在 15% 到 40% 之间,具体取决于源文件中空白字符和注释的数量。对于一个 50 KB 的样式表,这意味着每次页面加载可减少 7–20 KB 的网络传输。配合服务器端的 gzip 或 Brotli 压缩,效果更佳——已压缩 CSS 的二次压缩比格式化原文件的压缩效果更好。
CSS 压缩是前端构建流水线中的标准步骤。cssnano、clean-css、esbuild 等工具均在构建过程中执行压缩。但在开发阶段,你经常需要对单个代码片段进行压缩测试、内联关键 CSS 块,或在将样式表加入打包配置前估算压缩效果。这正是基于浏览器的 CSS 压缩工具的用武之地:粘贴 CSS,获取压缩输出,复制结果,继续工作。
/* Main navigation styles */
.nav {
display: flex;
align-items: center;
padding: 1rem 2rem;
background-color: #1e293b;
}
/* Links inside nav */
.nav a {
color: #e2e8f0;
text-decoration: none;
margin-right: 1.5rem;
transition: color 0.2s ease;
}
.nav a:hover {
color: #818cf8;
}.nav{display:flex;align-items:center;padding:1rem 2rem;background-color:#1e293b}.nav a{color:#e2e8f0;text-decoration:none;margin-right:1.5rem;transition:color .2s ease}.nav a:hover{color:#818cf8}为什么使用这款 CSS 压缩工具?
粘贴任意 CSS,毫秒内即可获得压缩输出。无需配置构建工具,无需执行命令行命令,无需创建账户。
CSS 压缩工具使用场景
CSS 压缩技术
CSS 压缩工具通过多种转换方式减小文件大小,每种方式针对源码中不同类型的冗余。下表列出了主要技术及其在格式化样式表上的典型压缩效果:
| 技术 | 作用说明 | 典型节省 |
|---|---|---|
| Whitespace removal | Strips spaces, tabs, and newlines between tokens | 15–25% |
| Comment stripping | Removes /* ... */ block comments | 5–15% |
| Zero shortening | 0px → 0, 0.5 → .5 | 1–3% |
| Shorthand colors | #ffffff → #fff, #aabbcc → #abc | 1–2% |
| Semicolon removal | Drops the last semicolon before } | <1% |
| Quote removal | font-family: "Arial" → font-family: Arial | <1% |
具体压缩率因输入内容而异。注释较多的文件从注释删除中获益更大,而已较为紧凑的 CSS 收益则较小。最稳定的优化来自空白字符删除和简写属性优化。cssnano 等高级压缩工具还能合并重复选择器、将完整属性折叠为简写形式(如将 margin-top + margin-right + margin-bottom + margin-left 合并为 margin),并删除被覆盖的声明。
压缩与 Gzip 的对比
CSS 压缩与服务器压缩是互补关系,而非可互换的替代方案。两者在不同层级运作,可叠加使用:
代码示例
如何在不同语言和环境中以编程方式压缩 CSS:
import postcss from 'postcss'
import cssnano from 'cssnano'
const input = `
.nav {
display: flex;
padding: 0px 1rem;
color: #ffffff;
/* TODO: update color */
}
`
const result = await postcss([cssnano]).process(input, { from: undefined })
console.log(result.css)
// → ".nav{display:flex;padding:0 1rem;color:#fff}"import csscompressor
css = """
.nav {
display: flex;
padding: 0px 1rem;
color: #ffffff;
/* navigation styles */
}
"""
minified = csscompressor.compress(css)
print(minified)
# → ".nav{display:flex;padding:0 1rem;color:#fff}"package main
import (
"fmt"
"github.com/tdewolff/minify/v2"
"github.com/tdewolff/minify/v2/css"
)
func main() {
m := minify.New()
m.AddFunc("text/css", css.Minify)
input := ".nav { display: flex; padding: 0px 1rem; color: #ffffff; }"
output, _ := m.String("text/css", input)
fmt.Println(output)
// → ".nav{display:flex;padding:0 1rem;color:#fff}"
}# Using cssnano via PostCSS CLI
npx postcss styles.css --use cssnano -o styles.min.css
# Using clean-css CLI
npx clean-css-cli styles.css -o styles.min.css
# Quick one-liner with Node.js
node -e "const CleanCSS=require('clean-css');console.log(new CleanCSS().minify('body { margin: 0px; }').styles)"
# → "body{margin:0}"