HTML 格式化与压缩器

全球通用工具

粘贴一个页面或一个片段,工具会给出渲染结果完全一致的最小版本;反过来,也能把同一份标记排成一行一个块级元素,方便人阅读。每删掉一个字节都会被计数并归类,因此结果自带一份审计报告:去掉了多少条注释、多少段连续空白,以及哪些区域被原样复制。

可以粘贴完整页面或片段,内容不会被截断。页面初始会载入一份可替换的示例。

压缩会删除不参与渲染的内容;美化只改变排版,绝不改变内容。

`<!--! ... -->` 注释是许可声明惯例,`<!--[if ...]>` 注释用于区分旧浏览器,除非你另行选择,否则两者都会保留。

留空时会根据页面生成:`page.html`、`page.min.html`。

边输入边更新。所有计算都在你的浏览器里完成,数据不会离开本机。

压缩后的 HTML

-18.3%

339 B 变为 277 B:删除了 0 条注释和 22 段连续空白,同时 1 个受保护区域(<pre>)逐字节复制。其余内容与原文一致。

输入
339 B
输出
277 B
节省
62 B
删除的注释
0

压缩后的 HTML

<!doctype html><html lang="en"><head><meta charset="utf-8"><title>Sample page</title></head><body><main class="wrap"><!--! danfio sample page --><h1>Hello</h1><p>A paragraph with <a href="/">a link</a> and some text.</p><pre>  keep   this   spacing  </pre></main></body></html>

可以复制,也可以下载。框里的字节就是文件里的字节。

改动明细与数量

项目数量说明
已删除注释0所有 `<!--!` 许可声明与条件注释均已保留
折叠的连续空白22绝不进入字符串、pre、textarea、script 或 style 内部
逐字节复制的区域1<pre>

这些数字是这一遍处理实际做了什么,而不是它可能做什么;把它们打印出来,正是为了这一点。

刻意没有做的事

  • 不删除任何内容:不删元素、不删属性、不去引号、不省略结束标签。自闭合斜杠也会保留,因为内联 SVG 需要它来结束元素。
  • `pre`、`textarea`、`script` 和 `style` 逐字节复制,所以页面里的样式表不会被顺手处理,脚本也绝不会被误压缩。
  • 空白只在紧邻块级元素时删除;紧邻无法归类的内容时会保留,代价是多一个字节,但绝不会改变布局。
  • 唯一看不见的情况是:用 `white-space: pre-wrap` 设置的元素会渲染自己的空白,而文本里没有任何信息说明这一点。如果这个差异重要,请把内容包进 `pre`。

HTML 压缩器要回答的是“浏览器会渲染什么”,所以这个工具按词法单元逐个处理,而不是堆一堆正则。空白只在块级元素旁边删除,因为浏览器不会在那里绘制;`pre`、`textarea`、`script` 和 `style` 逐字原样复制,因为在它们内部空白和标点就是内容;标签不成对的页面会被拒绝,并在问题位置给出插入符,而不是被处理一半。上述每条规则都会在结果下方的列表里再次点名,你可以拿输出对照页面自己的承诺,而不必信任一个黑箱。

关于这个工具

本页是压缩器组合中的 HTML 那一半,它的边界也停在那里:除了注释和浏览器不会渲染的空白,什么都不删;任何可能改变页面行为的改写,一概不做。`<script>` 里的 JavaScript 不会被压缩——那个块逐字原样复制,因为缩小它需要真正读懂 JavaScript 语法的读取器,属于真正压缩器的工作。如果这条诚实的边界对你重要,页面会在每个结果下方印出来。

一切都在标签页里完成:文本由页面上的 JavaScript 读取、重写和度量,唯一离开电脑的文件,是你主动下载的那些。静态页面已经携带生成页面时用示例算出的真实压缩结果,所以即使关闭 JavaScript 它依然有用。如果你要的是另一半,CSS 工具只有一步之遥,并且共享同一套计算、同一张计数表和同样诚实的“不碰什么”清单。

它是怎么工作的

压缩器可以不问自删的东西

会删除的只有两类:注释和无害的空白。注释会被删除,除非它以 `<!--!` 开头,那是许可声明的惯例;或者它是为旧浏览器编写的 `<!--[if ...]>` 条件注释。这两类都由一个默认开启的开关保留。空白先折叠成一个空格,再在 `white-space: normal` 下浏览器不会渲染的位置删除:页面开头或结尾,或者紧邻 `div`、`p`、`ul`、`h1` 这样的块级元素。紧邻无法归类的内容时,空白会保留,因为猜错的代价是布局悄悄发生位移。

其余内容一律保持原样。不重排属性,不去掉引号,不补充可省略的结束标签,不触碰自闭合斜杠——内联 SVG 需要这个斜杠来结束元素——也不合并任何元素。输出的风格是刻意选择的:你可以把它和输入做 diff,并看懂每一处差异。

粗心的压缩器会弄坏的四个元素

`pre`、`textarea`、`script` 和 `style` 里保存的是文本,每个空格、每个换行都有意义,因此它们的内容逐字原样复制。`<style>` 块里的样式表保留自己的格式,绝不会被顺手压缩;`<script>` 块原样保留,原因页面已经写明——压缩 JavaScript 需要真正读懂语法的读取器,而一个只看得到页面的工具无法猜出模板字面量在哪里结束。

同一条逐字规则也保护内联 SVG 里的自闭合斜杠,因为在那里斜杠就是元素结束的标志。把 `pre`、`textarea`、`script`、`style` 和这个斜杠一起保护起来,才使压缩器可以安全地跑在一个没人检查过的页面上:空白真正重要的位置是按名字列出来的,而不是寄希望于运气。

这也正是 HTML 压缩与 CSS 压缩的差别所在:CSS 里的空白大多只影响可读性,而 HTML 的文本节点会直接把空白渲染给用户,`pre` 更是把缩进当作内容。很多压缩器出问题,恰恰是因为用正则删除“看起来多余”的空白,把代码块、`textarea` 的初始值或内联脚本改坏;这里改为先分词、再按区域判断,宁可多留一个字节,也不改动无法确认的内容。

空白在哪里承载语义,在哪里只是装饰

规则就是浏览器在 `white-space: normal` 下执行的那一条:一段连续空白在两个邻居都是行内内容时保留为一个空格;紧邻块级元素、位于块开头或块结尾时删除。这就是为什么 `<p>Hello <b>world</b></p>` 会保留文本与加粗单词之间的空格,而 `<p>` 两侧的空格会被去掉。

诚实的边界写在页面自己的清单里:用 `white-space: pre-wrap` 设置的元素会渲染自己的空白,而文本里没有任何信息说明这一点。处理对未知元素和行内元素采取保守策略,因此这样的页面最多是稍微大一点,而不会明显错位——如果这个差异重要,请把预格式化内容包进 `pre`。

美化方向:同一份文件,为人排版

另一个方向不删除任何内容,也不改变内容,只改变排版:一行一个块级元素,按嵌套缩进,行内内容留在自己那一行。注释留在原处,属性空白得到整理,每个标签、属性和值都与原文完全一致——一份 diff 能处理、人也能读的页面。

美化并不声称还原任何人的原始排版,因为没有人能恢复另一位作者选择过的换行。它只是用同一套“哪些空白重要”的规则,把同一份文档重新安排间距;也正因如此,两个方向对“空白在哪里存在”共享同一个判断。

示例

示例使用页面自带的默认输入,只改设置;下面的结果与你在页面上看到的完全一致。

一个小页面压缩之后

粘贴 HTML: <div> <p>Hello <b>world</b></p> </div>

压缩后的 HTML

-10.0%

40 B 变为 36 B:删除了 0 条注释和 3 段连续空白,同时 0 个受保护区域(此页面中未找到)逐字节复制。其余内容与原文一致。

输入: 40 B · 输出: 36 B · 节省: 4 B · 删除的注释: 0

块级元素周围的缩进消失,文本与加粗单词之间的空格保留。

许可声明与受保护元素都保留

粘贴 HTML: <!--! (c) 2026 --> <main> <pre> keep this spacing </pre> </main>

压缩后的 HTML

-6.9%

72 B 变为 67 B:删除了 0 条注释和 3 段连续空白,同时 1 个受保护区域(<pre>)逐字节复制。其余内容与原文一致。

输入: 72 B · 输出: 67 B · 节省: 5 B · 删除的注释: 0

许可声明默认保留,`<pre>` 块逐字原样复制。

改为美化而不是压缩

粘贴 HTML: <header><h1>Hi</h1></header><p>Text</p> · 处理方向: 美化 - 排版成便于人阅读的形式

美化后的 HTML

5 行

39 B 变为 45 B。没有删除任何内容——每个标签、属性和值都还在,改变的只有排版。

输入: 39 B · 输出: 45 B · 保留的注释: 0 · 改动的值: 无

同一份标记,一行一个块级元素,不删除任何内容。

常见问题

我的 HTML 会被上传到某个地方吗?

不会。文本由这个标签页里的 JavaScript 读取、重写和度量,结果面板由页面上已有的内容构建,下载是本地创建的 blob。页面常常是一封邮件、一个模板或某个产品的组件,因此这里完全不接触服务器。

为什么 `<pre>`、`<script>` 和 `<style>` 的内容保持不动?

因为在这些元素内部,空白和标点是内容,不是排版。`<pre>` 块里的空白是浏览器真的会渲染的,样式表不是可以重新排版的标记,脚本则是代码,HTML 压缩器不能被允许去猜它的含义。它们逐字原样复制,结果面板会把它们计为受保护区域。

压缩会改变访客看到的东西吗?

不会,这正是这条边界的意义。只删除注释和浏览器不会渲染的空白,因此渲染出的页面在所有遵循相同空白规则的浏览器里完全一致。页面自己的表格会打印删除了什么、刻意保留了什么,所以这个说法可以被核对,而不是只能相信。

它会缩小页面里的 JavaScript 吗?

不会,这是一个决定,而不是缺失的功能。安全压缩 JavaScript 需要真正读懂语法的读取器,HTML 工具不适合在这里猜测——页面只是把 `<script>` 块原样留下,并说明自己这样做了。脚本请交给 esbuild、terser 或你的打包工具,标记部分交给本页。

能不能反过来用,去读一个压缩过的页面?

可以,那就是美化方向。不删除任何内容:页面会变成一行一个块级元素,带缩进,行内内容留在自己那一行。输出并不声称还原了原作者当年的排版——没有人能恢复别人删掉的换行——但它是一份人能读、diff 也能处理的文件。

资料来源与统计口径

  • 整理规则遵循浏览器处理 HTML 空白的方式:行内内容之间保留一个空格,块级元素旁边则删除。
  • `pre`、`textarea`、`script`、`style` 与内联 SVG 逐字保留;标签不成对的页面会被拒绝,并给出行号与列号。
  • 全部在你的浏览器里完成,不上传任何内容。

最近复核于 2026-10-07.

本页在您的浏览器本地运行,请保留原文件备份;不涉及财务建议。 阅读完整免责声明。