ToolAct工具行动

HTML 格式化工具

输入 HTML
输出结果
行数: 1字符数: 0字节数: 0
行数: 1字符数: 0

什么是 HTML 格式化?

HTML 格式化会把压缩、混乱或难以阅读的标记整理成缩进一致、层级清楚、换行合理的代码。它能提升审查、调试、教学、交接和维护效率,尤其适合查找未闭合标签、错误嵌套、过长属性列表或生成代码中不易发现的问题。生产环境有时需要相反操作:压缩会移除多余空格、注释和换行,减少传输体积。这个工具可以在可读性和紧凑输出之间切换,但不会自动修复语义结构、无障碍问题、失效链接、不安全嵌入内容或框架模板错误,这些仍需要单独验证。

使用方法

使用方法

  1. 在左侧输入框中粘贴或输入 HTML 代码
  2. 选择缩进大小和换行行宽
  3. 点击「格式化」美化代码,或点击「压缩」减小体积
  4. 在右侧查看格式化后的代码(带语法高亮)
  5. 点击「复制」复制到剪贴板

选项说明

缩进大小选择 2 空格、4 空格或 Tab 缩进
换行行宽超过指定字符数时自动换行,选择「不限制」保持原始格式

快捷键

  • Ctrl + Enter格式化
  • Ctrl + Shift + C复制结果

格式化技巧

  • 格式化可以帮助发现错误的嵌套或可疑的内联脚本,但它不会清理 HTML 也不会让不安全的标记变得安全。
  • 仅对用于发布的代码进行压缩。保留可读的源码以便审查、对比差异和进行无障碍检查。

使用场景

格式化包含内联样式和脚本的 HTML粘贴标记代码后可选择 2 空格、4 空格或 Tab 缩进。格式化器会移除注释、保留 pre 内容,并对提取出的 style 和 script 块进行格式化后再放回 HTML 结构中。
压缩小型 HTML 片段用于嵌入切换到压缩模式,折叠标签间的空白并移除注释,然后复制或下载紧凑的 HTML 片段。解析错误时会尽可能附带行号和列号提示,因此从 CMS 导出中发现的缺失闭合标签可以无需重新打开原始编辑器即可修复。在嵌入生产环境前,请通过项目 linter 或 html-validate 管道验证结果,因为格式化不会清理属性、内联脚本或不安全的 href 值。
用于可审查的片段而非完整构建验证本工具采用轻量级的基于 token 的实现,最适合处理复制的片段、邮件内容和 CMS 导出。复杂模板,特别是使用了 Vue、Angular 或带自定义元素的服务端渲染片段,仍应使用项目自身的格式化器或解析器,无障碍检查应在渲染后的 DOM 上使用 axe-core 或 Lighthouse 单独执行,而不是在格式化后的源码上进行。
格式化 CMS 导出或邮件编辑器生成的 HTML粘贴从 CMS、newsletter 工具或邮件编辑器导出的标记代码,重新缩进以便发现未闭合的 div、错误嵌套的 table 或多余的 script 标签,然后再发送或发布。格式化输出应配合对渲染 DOM 的独立无障碍检查,因为格式化器只负责重新缩进,不会修复缺失的 alt 文本、对比度或 ARIA 角色。
在格式化和压缩之间切换以对比差异在同一片段上切换格式化和压缩模式,将可读版本与生产压缩版本进行并排 diff 对比,用于排查布局或属性回归问题。两种输出来自同一个解析器,因此任何差异都可以归因于空白、注释或属性顺序,而不是两个格式化器对 DOM 的不同理解。

技术原理

HTML 格式化器遵循 WHATWG HTML 标准的树构建算法。字节流先进行解码(通常按 meta charset 或 BOM 指定的 UTF-8),词法分析器依次处理数据状态、RCDATA、RAWTEXT、script-data 以及 §13.2.5 中定义的多种属性状态,树构建阶段通过插入模式状态机(initial、before html、in head、in body、in table、in select 等)构建 DOM。解析器本身就是容错设计的:未闭合的 <p> 在遇到块级元素时会自动关闭,多余的 </tr> 会被忽略,位置错误的 <table> 会通过 foster parenting 机制重新挂载。浏览器级解析器通过 new DOMParser().parseFromString(src, 'text/html') 暴露此能力;Node 端工具则使用 parse5(WHATWG 参考实现)、htmlparser2 或 cheerio。 重排打印时遍历生成的树,按元素类别进行序列化。空元素——area、base、br、col、embed、hr、img、input、link、meta、source、track、wbr——在 HTML5 中不接受闭合标签(XHTML 的自闭合 /> 允许但非必需)。块级容器(div、section、article、header、footer、nav、main、ul、ol、li、table)独占一行,按 depth*indent 空格缩进;短语/行内内容(span、a、strong、em、code)保持内联,因为 CSS white-space: normal 会将连续空白折叠为单个字符。两类元素必须原样保留:<pre> 和 <textarea> 具有 white-space: pre 语义,其前导换行会被解析器消费;<script> 和 <style> 的内容属于 RAWTEXT,重新缩进会改变运行时行为——它们通常交给 JS 或 CSS 子格式化器处理后再嵌入。 属性序列化会规范化引号风格(单引号/双引号),并通过命名字符引用 &amp;、&lt;、&gt;、&quot; 和数字引用 &#39; 重新编码内嵌分隔符。属性顺序在 DOM 中无意义,因此格式化器通常采用稳定排序(id、class,然后按字母顺序)。超过配置的 printWidth 时触发换行:属性逐行拆分,闭合 > 可以独占一行(prettier-plugin-html 的 bracketSameLine: false)或紧贴最后一个属性。压缩则执行相反操作——移除块级标签间的空白、剥离注释(保留 IE 条件注释 <!--[if),并去掉属性值匹配 [A-Za-z0-9._-]+ 的引号。两种操作对输入长度均为 O(n)。

  • 解析器:浏览器中通过 DOMParser('text/html') 使用 WHATWG HTML 树构建算法(§13),Node 端使用 parse5/htmlparser2/cheerio;插入模式状态机处理缺失/错位标签和 foster parenting。
  • 空元素(无结束标签):area、base、br、col、embed、hr、img、input、link、meta、source、track、wbr——HTML 现行标准共 14 个元素。XHTML 自闭合 /> 被容忍但多余。
  • 保留空白的元素:<pre> 和 <textarea> 具有 CSS white-space: pre 语义,会消费一个前导换行;其内部字节永远不会被重新缩进,否则可见输出会改变。
  • RAWTEXT 上下文:<script> 和 <style> 的内容不是 HTML——交给 JS/CSS 子格式化器处理(或原样保留)。在正则或字符串字面量内部重新缩进原始文本会破坏运行时语义。
  • 属性规范化:选择引号风格(单引号/双引号),用五个命名引用(&amp;、&lt;、&gt;、&quot;、&#39;)重新编码内嵌分隔符,应用稳定排序(id、class,然后按字母顺序),因为 DOM 中属性顺序无意义。
  • 超过 printWidth 时换行(通常 80/100/120):属性逐行拆分,闭合 > 独占一行或紧贴最后一个属性,与 prettier-plugin-html 的 bracketSameLine 选项行为一致。
  • 压缩:折叠标签间空白,剥离注释(保留 <!--[if IE]> 条件注释),移除可选结束标签(</li>、</p> 后跟兄弟元素时),并去掉匹配 [A-Za-z0-9._-]+ 的属性引号;往返操作复杂度为 O(n)。

示例

压缩 HTML → 格式化(2 空格缩进)

输入:
<div class="card"><h2>Title</h2><p>Body text</p></div>

Formatted:
<div class="card">
  <h2>Title</h2>
  <p>Body text</p>
</div>

格式化 → 压缩(生产部署)

Source (412 bytes):
<nav>
  <ul>
    <li><a href="/">Home</a></li>
    <li><a href="/about">About</a></li>
  </ul>
</nav>

Minified (96 bytes, -77%):
<nav><ul><li><a href="/">Home</a></li><li><a href="/about">About</a></li></ul></nav>

属性较多时自动换行

输入:
<input type="email" id="user-email" name="email" placeholder="you@example.com" required autocomplete="email">

Formatted (超过 80 字符自动换行):
<input
  type="email"
  id="user-email"
  name="email"
  placeholder="you@example.com"
  required
  autocomplete="email"
>

保留自闭合标签和行内内容

输入:
<p>Click <a href="/docs">here</a> for help.<br><img src="icon.png" alt=""></p>

Formatted (行内同级元素保留在同一行):
<p>
  Click <a href="/docs">here</a> for help.
  <br>
  <img src="icon.png" alt="">
</p>

常见问题

它会格式化哪些内容?

HTML 标记本身:缩进、属性排布、空行处理,以及(可选)按指定列宽换行。不会改变页面渲染结果——页面看起来完全一样,只是源代码更易读。

<pre>、<textarea> 和 <script> 块会被破坏吗?

不会。pre、textarea、code、script 中的空白具有渲染意义(会显示在页面上),格式化器会原样保留。其他元素的空白则会被规整化。

为什么我的自闭合标签被改写了?

在 HTML5 中,<br/>、<img/>、<hr/> 和 <br>、<img>、<hr> 等价(不强制要求斜杠)。格式化器可能会统一为某一种风格。在 XHTML、JSX、Vue 模板中,请配置格式化器保留末尾斜杠。

它会校验 HTML 吗?

不会。它只对你粘贴的内容做格式化。校验请用 W3C Validator 或浏览器开发者工具。未闭合的标签、引号不匹配等问题会原样保留。

HTML 会被上传吗?

不会。格式化在浏览器中完成,粘贴的 HTML 不会经过网络。

它能压缩 HTML 吗?

如果存在压缩模式则可以。HTML 压缩会去除标签之间的空白,合并文本中连续的空格,并删去可省略的闭合标签。结果不便阅读但体积更小,适合生产环境。

内嵌的 CSS 和 JS 怎么处理?

如果工具支持,<style> 和 <script> 中的内容通常会调用各自的 CSS、JS 格式化器。否则会原样保留内部内容,避免破坏语法。