该用 而非 实现语义化换行; 仅适用于诗歌、歌词等换行即内容的场景,且需注意 xss 风险与可访问性问题。

HTML里用 <br> 还是 <p></p> 换行?
直接说结论:<br> 是强制换行,<p></p> 是语义化段落。多数时候该用 <p></p>,而不是堆 <br>。
常见错误是写简历、地址、诗歌时全靠 <br> 拆行,结果一改样式就错位,屏幕阅读器也读成一句话。比如:
<div>张三<br>北京市朝阳区<br>100000</div>
这看着整齐,但语义上全是“张三北京市朝阳区100000”,搜索引擎和读屏软件无法区分字段。
- 地址、联系人信息这类结构化内容,优先用
<address></address>或带aria-label的<div> + <code><p></p> - 纯视觉换行(比如歌词、诗行)才用
<br>,且必须确保换行本身是内容的一部分 -
<br>是空元素,不能闭合为<br>,XHTML 风格的<br>在 HTML5 中合法但非必需 -
white-space: normal:默认,忽略换行和多余空格 -
white-space: pre:保留空格和换行,像<pre class="brush:php;toolbar:false;"></code>,但不等宽字体</li> <li><code>white-space: pre-line</code>:保留换行,合并空格 —— 最接近“按源码换行但不卡格式”的需求</li> </ul> <p>比如用户提交的评论含手动换行,后端存的是带 <code>\n</code> 的字符串,前端渲染时:</p> <pre class="brush:php;toolbar:false;"><div style="white-space: pre-line">第一行\n第二行</div></pre> <p>这样比在服务端把 <code>\n替换成<br>更安全,避免 XSS(没过滤就插标签)。<pre class="brush:php;toolbar:false;"></code> 和 <code><code></code> 里的换行为什么自动生效?</H3> <p>因为它们默认设置了 <code>white-space: pre</code>,所以源码里的回车、空格原样显示。</p> <p>但注意两点:</p> <ul> <li><code><pre class="brush:php;toolbar:false;"></code> 是块级、等宽字体、带默认上下边距;<code><code></code> 是行内、等宽字体、无额外间距</li> <li>如果只是想让普通 <code><div></code> 表现得像 <code><pre class="brush:php;toolbar:false;"></code>,加 <code>white-space: pre</code> 就够了,不用硬套 <code><pre class="brush:php;toolbar:false;"></code> 标签</li> <li><code><pre class="brush:php;toolbar:false;"></code> 内容过长会撑破容器,需要配合 <code>overflow-wrap: break-word</code> 或 <code>word-break: break-all</code></li> </ul> <H3>Vue/React 里动态插入换行符为什么失效?</H3> <p>因为框架默认把字符串当纯文本渲染,<code>\n</code> 不会被解释为 <code><br></code>,也不会触发 <code>white-space</code> 生效(除非你显式设了)。</p> <p>常见错误写法:</p> <pre class="brush:php;toolbar:false;">{{ description }} // description = "第一行\n第二行" → 渲染成“第一行第二行”</pre> <p>解决方式取决于你信任内容来源:</p> <ul> <li>可信内容(如后台配置的说明文案):用 <code>v-html(Vue)或dangerouslySetInnerHTML(React),并提前把\n替成<br> - 不可信内容:用
white-space: pre-line+display: inline-block等组合,避免执行 HTML - 更稳妥的做法是组件内封装一个
TextWithLineBreaks,内部统一处理\n,而不是到处写v-html
CSS 的 white-space 能替代 <br> 吗?
能,但要看场景。默认 HTML 会把连续空格、换行符都压缩成一个空格,所以你在源码里敲回车,页面并不换行。
立即学习“前端免费学习笔记(深入)”;
white-space 控制的就是这个行为,常用值有:
换行从来不是排版问题,而是语义、安全、可访问性的交汇点。随便塞 <br> 看着快,改需求时第一个遭殃。











