能保留空格是因为其默认启用white-space: pre,浏览器在html解析阶段即按预格式化路径处理空白字符;普通元素默认white-space: normal会折叠空白,需显式设置pre-wrap等css或用组合确保格式。

HTML 本身不会“消除”源码中的空格,浏览器解析时会把连续空白字符(空格、换行、制表符)合并为单个空格显示——这是 HTML 规范行为,不是 bug,也不是可开关的设置。
为什么 <pre class="brush:php;toolbar:false;"></pre> 里的空格能保留,其他地方不行
因为 <pre class="brush:php;toolbar:false;"></pre> 是唯一默认启用 white-space: pre 的元素,它告诉浏览器:按源码原样渲染空白。普通元素(如 <p></p>、<div>)默认是 <code>white-space: normal,所以换行和多空格都会被折叠。
- 想保留缩进或对齐?用
<pre class="brush:php;toolbar:false;"></pre>+<code>组合最稳妥 - 只是想让段落内多空格生效?加 CSS:
white-space: pre-wrap或white-space: pre-line - 注意
pre-wrap会保留换行和空格,但允许自动折行;pre-line合并空格但保留换行
innerHTML 赋值后空格又消失了,怎么保持原始格式
JavaScript 动态写入 HTML 字符串时,如果字符串里有换行或缩进,这些在插入 DOM 后仍受 HTML 空白处理规则影响——除非你显式控制 white-space 或使用 <pre class="brush:php;toolbar:false;"></pre> 容器。
- 错误写法:
el.innerHTML = "a b\n c"→ 渲染为 “a b c” - 正确做法:包裹进
<pre class="brush:php;toolbar:false;"></pre>,或给容器加style="white-space: pre-wrap;" - 若内容来自用户输入或 API,建议先用
textContent写入再套样式,避免 XSS 风险
用 强行塞空格?小心踩坑
是非断行空格,确实能“锁住”一个空格不被折叠,但它本质是字符,不是排版控制手段。
- 多个
连用(如)可模拟缩进,但语义混乱、难以维护 - 响应式布局下,
不会随字体缩放等比变化,可能错位 - 屏幕阅读器会逐个读出“空格”,影响无障碍体验
- 真正需要对齐,请用 CSS
text-indent、padding-left或 Flex/Grid
最常被忽略的一点:所谓“多余空格”往往不是渲染问题,而是开发者误把 HTML 当作纯文本编辑器来用。该用 CSS 控制间距,就别靠敲空格;该用语义化标签表达结构,就别依赖缩进来“看起来整齐”。











