pre默认不响应width约束且禁用自动换行,必须用设width:100%、overflow-x:auto、-webkit-overflow-scrolling:touch的div包裹;若允许格式简化,可用code+white-space:pre-wrap替代。

pre 代码块在移动端横向溢出,不是因为内容太长,而是它默认无视父容器宽度约束,且不触发自动换行。 单纯加 overflow-x: auto 到 pre 元素上,在多数 iOS Safari 和 Android WebView 中会失效——滚动条不出现、内容被截断或直接撑破页面。
为什么 pre 默认不响应 width / max-width?
pre 是内联级元素(display: block 但有特殊渲染逻辑),它的换行行为由 white-space: pre 控制:保留所有空格与换行符,同时**禁止自动折行**。这意味着即使父容器设了 max-width: 100%,pre 仍会按原始字符流无限延展,浏览器不会主动压缩它。
- iOS Safari 15.4+ 对
pre的overflow处理更严格,若未显式触发 BFC 或未加-webkit-overflow-scrolling: touch,横向滚动会卡死 - 安卓 X5 内核(微信)至今不支持
pre上的overflow-x: auto直接生效,必须靠外层包裹 -
pre若嵌套在flex容器中,且父项没设min-width: 0,flex 的默认min-width: auto会锁死收缩,导致外层overflow彻底无效
必须用 wrapper + display: block + overflow-x: auto
不能直接对 pre 加滚动,得用一层 div 包裹,并确保该容器能正确感知宽度边界和触发滚动:
- 包裹
div必须设display: block(不能是inline或未声明) - 必须设
width: 100%或max-width: 100%,且父级不能有overflow: hidden或flex-shrink: 0干扰 - 必须加
overflow-x: auto和-webkit-overflow-scrolling: touch(iOS 真机刚需) -
pre自身要去掉width、margin等可能干扰宽度计算的样式,让它自然撑开
示例结构:
<div class="pre-wrapper"> <pre class="brush:php;toolbar:false;">const url = "https://api.example.com/v1/users/1234567890abcdef";











