将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
text-indent生效但视觉“没对齐”并非代码错误,而是首行盒未正确生成:justify需显式配text-indent;内联替换元素使缩进作用于其左侧;flex/grid父容器覆盖块格式化上下文;验证需查Computed中display为block且text-indent非0。

text-indent 生效但视觉上“没对齐”,基本不是代码写错了,而是首行盒没被正确计算——常见于 justify 配合缺失、内联替换元素干扰或父容器布局模式覆盖。
为什么 text-indent 加了却看起来没缩进
根本原因不是样式没生效,而是浏览器压根没生成可缩进的“首行盒”。以下情况会直接让 text-indent 失效:
-
<p></p>被设为display: inline或inline-block—— 块级首行概念不存在 - 父容器用了
display: flex或display: grid——<p></p>的块格式化上下文被降级,text-indent不参与布局计算 - 段落开头是
<img>、<svg></svg>或 emoji —— 缩进作用在该内联替换元素左侧,文字本身没动 - 某处高权重样式写了
p { text-indent: 0 !important }(富文本编辑器输出常见) - 用了
white-space: nowrap或pre—— 没有换行,“首行”失去定义
验证方式:打开开发者工具 → 找到目标 <p></p> → 切到 Computed 标签页 → 确认 display 是 block,且 text-indent 的最终值非 0。
text-align: justify 和 text-indent 必须同时显式声明
justify 不会自动带首行缩进,必须手动加 text-indent。但两者能共存的前提很硬:
-
text-align: justify必须写在<p></p>这类块级元素上,不能写在<div> 或 <code><span></span>上 - 段落不能以
white-space: nowrap、pre或pre-wrap开头,否则“首行”语义失效 - 如果段落含
direction: rtl或开头是图标字体,text-indent可能向右偏移,看起来像反向缩进 -
2em:最推荐。1em ≈ 当前font-size,缩进随字号放大/缩小,中文下视觉接近两字符宽度 -
2ch:语义更准(1ch ≈ 字符 “0” 宽度),但 IE 不支持,且多数中文字体里 1ch 远小于一个汉字 -
32px或20px:仅限字体大小绝对固定的静态页;系统缩放、DPI 变化时会失准 -
2%:按父容器宽度算,和字体无关——窄屏下缩进可能只剩几像素 -
2rem:若项目用 JS 动态改html { font-size }(如夜间模式),缩进会意外跳变 - 把
<p></p>包一层<div style="display: block">,强制恢复块格式化上下文 <li>放弃 <code>text-indent,改用padding-left(需同步调整box-sizing,避免总宽溢出)
更稳妥的替代方案:padding-left: 2em + text-align: justify。虽然语义弱(不是“首行缩进”,而是整体左移),但视觉对齐稳定可控。
text-indent 该用什么单位才不翻车
单位选错,缩进在响应式场景下就会“突然变小”或“随系统缩放跳变”:
别用负值或百分比兼容 IE8;它对 text-indent: -1em 和 text-indent: 5% 支持极不稳定,尤其配合 direction: rtl 时容易错位。
Flex/Grid 容器里 text-indent 失效怎么办
这不是 bug,是格式化上下文变更的自然结果。Flex/Grid 容器会让子元素脱离常规块流,text-indent 失去作用对象。此时有两个务实选择:
真正容易被忽略的是:即使你写了 text-indent: 2em,只要父容器是 flex 或 grid,computed 值仍显示为 2em,但渲染层根本不处理它——这个“假生效”状态最耽误排查时间。










