piapia123
zh

SVG 压缩

格式化

所有处理都在浏览器本地完成,数据不上传服务器

输入
把文件拖到这里可直接载入
输出

把设计工具导出的 SVG 压小:去掉注释与 `<title>`/`<desc>`/`<metadata>`、折叠标签之间的空白与换行、把坐标的小数位降下来、删掉没人引用的 `id`。 体积的大头在坐标:路径数据(`d`)通常占整个文件一半以上,而它由一长串坐标组成。把 `M12.345678` 降到 `M12.35` 往往能省下两三成,而视觉上看不出来 —— 所以默认开 3 位小数。 ⚠️ 通用的「去掉一切空白、删掉一切无用属性」在 SVG 上会静默改坏图形,而 SVG 坏了往往只是「某一块不见了」,没有明确征兆。所以这里逐条写明哪些碰不得:`viewBox` 一个字符都不动(删了它 SVG 就不能缩放了,而固定尺寸下看着还是对的)、`<text>` 里的空格是内容(`Hello World` 折成 `HelloWorld` 是这类压缩最经典的事故)、被引用的 `id` 绝不能删(`url(#a)` 在引用它,删了渐变就没了)。

功能

  • 去掉注释与 title / desc / metadata(块级的一起删,含嵌套)
  • 折叠标签之间的空白与换行,而 `<text>` / `<tspan>` / `<style>` / `<script>` 里的一个字符都不动
  • 坐标降精度:路径、points、transform 等数字属性可选 0–3 位小数,默认 3 位
  • 只删没被引用的 id(`url(#a)`、`href="#a"`、SMIL 的 `begin="a.click"` 都算引用)
  • viewBox 与 preserveAspectRatio 永不改动
  • 颜色、类名、style 属性不做数字处理(`#ff0000` 不会被改成 `#ff0`)
  • 可选去掉 xmlns —— 明确说明这只在「内联进 HTML」时才对
  • 输出带语法着色,下方显示压缩后的字符数

使用方法

  1. 粘贴 SVG 源码
  2. 按需要开关几项:默认只做「注释 + 元数据 + 空白 + 3 位小数」这四件安全的事
  3. 要更小就降到 1–2 位小数,或打开「去掉未引用的 id」
  4. 复制压缩结果

常见问题

为什么 viewBox 不能删?
因为 `viewBox` 定义的是坐标系:它决定了图形的哪一块内容映射到多大的区域。删掉之后 `preserveAspectRatio` 也跟着失效,SVG 就失去了缩放能力 —— 而它在你设定的那个固定尺寸下看起来还是对的,问题只在别人拿去放到别处时才出现(图标变形、只剩一角)。省下的那十几个字符完全不值得这个风险,所以这个工具一个字符都不动它。
为什么 text 里的空格不能压?
因为那是内容。`<text>Hello World</text>` 里的空格删掉就变成一个词,而屏幕上只是「文字挤到一起了」,很容易当成字体问题。所以空白折叠只发生在标签之间,`<text>`、`<tspan>`、`<style>`、`<script>` 内部一律原样保留 —— 后两个甚至不是标记语言,里面的空白有自己的规则。
降精度会不会让图形变形?
3 位小数在绝大多数情况下看不出来(一个 24px 的图标上,0.001 的误差相当于屏幕上的 1/40 像素)。降到 1 位(0.1)在大尺寸渲染时会开始出现轻微的多边形棱角,尤其是曲线与斜线;0 位(整数)在小图标上问题不大,但放大后会有明显误差。所以默认是 3 位,激进的那两档要自己判断 —— 判据是「这个 SVG 会不会被放大到很大的尺寸显示」。
xmlns 到底要不要删?
看你打算怎么用。内联进 HTML(把 `<svg>` 直接写在页面里)时可以删,几字节而已,而且父文档的命名空间会接管。但单独存成 `.svg` 文件、写在 CSS 的 `url()` 里、或者作为 `<img src>` 的目标时必须保留 —— 少了它浏览器不认这个文件,表现是「图不显示」,而文件本身看不出任何问题。所以这一项默认关,标签上也写明了适用条件。

相关工具