Markdown 转公众号的四个排版坑:白名单样式、代码块、图片、中英空格

· 约 5 分钟 📰 Markdown 转公众号

公众号是中文内容创作最高频的发布场景之一,但它的编辑器对外部 HTML / CSS 的兼容性极弱,从其他工具粘贴进去经常翻车。理解四个高频坑能省下大量调整时间。

公众号编辑器的样式白名单

公众号粘贴 HTML 的处理流程:

  1. 解析 HTML
  2. 遍历每个标签
  3. 只保留白名单内的 inline style
  4. 移除所有 class / id / 外联 CSS

白名单大致包括:

  • 颜色:colorbackgroundbackground-color
  • 字体:font-sizefont-weightfont-familyline-height
  • 边距:paddingmargin(部分)
  • 边框:border(部分)、border-radius
  • 文本:text-aligntext-indentletter-spacing

不在白名单的(display: flexgridtransformanimation、伪类、媒体查询)全部失效。

实战影响:转换工具必须把所有样式 inline 写到每个标签上——

<!-- 不行:会被剥成纯 div -->
<div class="quote">引言文字</div>
<style>.quote { background: #f5f5f5; padding: 16px; }</style>

<!-- 行:inline 样式 -->
<section style="background: #f5f5f5; padding: 16px; border-left: 4px solid #6c63ff;">
  引言文字
</section>

本工具的输出 HTML 体积大约是 Markdown 源文件的 5-10 倍,原因就在 inline 样式重复。

代码块:从 pre 到 span 海

公众号原生没有代码块——白名单连 <pre> 都不在。要在公众号呈现代码高亮,必须把每个语法 token 变成 inline 染色的 <span>

<section style="background: #1e1e1e; padding: 16px; border-radius: 6px; font-family: Menlo, Consolas, monospace; font-size: 13px; line-height: 1.6; overflow-x: auto;">
  <span style="color: #569cd6;">function</span>
  <span style="color: #dcdcaa;">hello</span><span style="color: #d4d4d4;">() {</span>
  <span style="color: #ce9178;">"world"</span>
  <span style="color: #d4d4d4;">}</span>
</section>

一段 30 行代码扩成几 KB HTML 是常态。本工具内置的代码主题

主题风格文章场景
GitHub Light白底克制彩色技术教程、长文
GitHub Dark深蓝灰底通用深色
One Dark紫黑底暖色视觉冲击、公众号文风
Dracula紫调深色设计感强
Monokai经典暖色深底代码 demo

注意:代码块不要太长——公众号正文区移动端只有 ≈340px 宽度,超出会出现水平滚动条,阅读体验差。建议 60 字符 / 行以内,超长代码截图代替。

图片:链接还是上传

把 Markdown 里的图片直接粘到公众号有三种翻车:

1. 图被压糊:公众号会重新压缩外链图,质量降很多 2. 图被裁切:编辑器有”自动适配宽度”,长图被裁 3. 防盗链 403:粘贴外链图,发布后图变成”X”——公众号 CDN 反爬,外链域名取不到图

正确流程:

  1. 在 Markdown 编辑器把全文写完,图片用占位
  2. 复制 Markdown → 粘贴到公众号编辑器
  3. 每张图重新点编辑器的”图片”按钮上传——上传后图存在公众号 CDN,无防盗链问题,质量更稳

公众号编辑器对图片的常见限制:

  • 单张图片大小有上限(一般 5-10MB,超过会拒收)
  • 单篇图片数量有上限,写作中建议控制在几十张以内,否则会卡编辑器
  • 客户端按设备能力下发 WebP 或 JPEG(节省流量)
  • 可设置”封面图”(卡片显示用)

中英文混排空格

中英文之间手动加半角空格是中文排版社区的约定(“盘古之白”),不是字体技术问题——加了之后中英文密度均匀,节奏更舒服;不加则视觉上中英黏连,长文累眼。

正式排版规则(盘古之白 / Pangu):

  • 中文与英文之间加半角空格:使用 React
  • 中文与数字之间加半角空格:年龄 28 岁
  • 中文与全角符号之间不加:他说:"你好"
  • 标点不加空格:Vue.js,React.js
不规范:
我用React写了一个CRUD应用,性能比Vue3好30%。

规范:
我用 React 写了一个 CRUD 应用,性能比 Vue3 好 30%。

本工具的”自动空格”开关使用 pangu.js,自动在中英文交界处加半角空格。可手动关。

引用块和强调

公众号默认引用块样式很丑(左侧灰色细边)。转换工具一般会重写:

<blockquote style="
  border-left: 4px solid #6c63ff;
  padding: 12px 16px;
  margin: 1em 0;
  background: #f7f8fa;
  color: #555;
">
  引言文字
</blockquote>

加粗和斜体需要 inline 强化:

<strong style="color: #6c63ff;">重点</strong>
<em style="color: #ff9800;">侧重</em>

光用 <strong><em> 标签虽然会显示加粗 / 斜体,但颜色变化能让重点更突出。

表格的兼容性

Markdown 表格转公众号 HTML 后展示尚可,但有限制:

  • 移动端宽表会水平滚动(公众号支持,但部分老版本不支持)
  • 表格无法插入图片(公众号编辑器限制)
  • 单元格合并(rowspan / colspan)部分失效

复杂表格建议截图作为图片插入,不要用 Markdown 表格。

标题层级

公众号正文 H1 不建议用——大标题已经是文章标题。正文从 H2 开始:

<h2 style="
  font-size: 19px;
  font-weight: bold;
  color: #333;
  margin: 24px 0 12px;
  padding-bottom: 6px;
  border-bottom: 2px solid #6c63ff;
">第一章</h2>

<h3 style="
  font-size: 16px;
  font-weight: bold;
  color: #555;
  margin: 18px 0 8px;
">小节</h3>

H4 以下慎用——大多数主题不会差异化样式,用户辨识不出层级。

字体栈

公众号字体回退链:

font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "PingFang SC", 
             "Microsoft YaHei", "Source Han Sans CN", sans-serif;

iOS / macOS 显示 PingFang,Windows 显示 Microsoft YaHei,其他用系统默认。代码用:

font-family: Menlo, Consolas, "Courier New", monospace;

Mac 上 Menlo,Windows 上 Consolas,老系统回退到 Courier New。

一句话总结

公众号粘贴前问自己四件事:样式都 inline 了吗、代码块切 span 了吗、图准备重传了吗、中英文加空格了吗——四件都对,复制即上线。

❓ 常见问题

复制到公众号编辑器后样式全没了,是什么情况?

公众号编辑器有一份白名单 CSS——粘贴进来的 HTML 只保留白名单内的 inline style,其余全部丢弃。class、id 完全失效,外联 CSS / style 标签都被剥。所以转换工具必须把所有样式 inline 写到每个 HTML 元素上——<h2 style="color: #333; font-weight: bold; ..."> 这种又长又重复的写法是公众号唯一认的格式。本工具默认输出全 inline 样式,复制到编辑器粘贴即可保留。

公众号代码块为什么总是变成纯文本?

公众号原生不支持代码块——<pre><code> 标签会被白名单过滤。要保留代码高亮,转换工具会把每个 token(关键字、字符串、注释)变成带 inline color 的 <span>,再用 <section> 容器加背景色和等宽字体。结果是几十甚至几百个 span 的嵌套,复制一段代码可能膨胀到几 KB HTML,但视觉效果一致。本工具用 highlight.js 染色,输出 inline-styled span。

图片在公众号里为什么会变窄 / 拉变形?

公众号编辑器的"图片宽度"被它自己控制——你写 width: 100% 它会重写为 data-width: 100%,最终展示宽度按编辑器布局而定。正确的图片粘贴流程:先在转换工具里复制 Markdown,粘贴到公众号编辑器后,手动重新插入图片(点编辑器图片按钮上传),不要让原图链接直接进来。否则三种翻车:图被裁、图被压糊、图链接 403(公众号防外链)。

为什么中英文混排有时空格不齐?

因为微信 / 公众号字体栈对中英文的处理不一致。默认字体(PingFang / Microsoft YaHei)下,中英文之间会有一个视觉缝隙(约 0.25em),这是字体的中文字宽度造成的。"标准排版"原则建议:中英文之间 / 中文与数字之间手动加半角空格——视觉缝隙规整化。本工具的"自动空格"选项会自动加这个空格(基于 pangu.js 算法),保持文章气质一致。

📰 打开 Markdown 转公众号 Markdown 实时预览·多主题排版·一键复制到公众号保留样式