根本原因是浏览器默认字号基准被系统或ua覆盖,ios safari将小屏设备根字号设为13px且不响应html{font-size:16px},安卓webview也会按系统字体模式压缩;唯一可靠解法是在public/index.html的中用内联脚本强制设置document.documentelement.style.fontsize='16px'。

uni-app H5端字体偏小,根本原因不是代码写得小,而是浏览器默认字号基准被系统或UA覆盖,尤其在iOS Safari、部分安卓WebView(如华为/小米定制内核)中,font-size: 16px 实际渲染可能只有 13px 或更小——这不是bug,是浏览器对“可读性”和“缩放策略”的主动干预。
为什么H5端在iOS和部分安卓上字体偏小
iOS Safari默认将小屏设备(如iPhone SE)的根字号设为 13px 而非标准 16px,且不响应 html { font-size: 16px } 的强制设置;部分安卓WebView(尤其EMUI、MIUI)会根据系统“极小字体”模式把所有文本按比例压缩,且不暴露 fontSizeSetting 字段。此时哪怕你用 rem 或 vw,基准都塌了。
- 现象:设计稿标 14px,H5真机上看像 12px,文字发虚、行距挤
- 关键线索:打开 Chrome DevTools 模拟 iPhone SE,
getComputedStyle(document.documentElement).fontSize返回"13px" - 不能靠
postcss-pxtorem解决——它只转单位,不改基准 - 不能依赖
page-meta——H5 不支持该标签
必须在HTML层重置根字号:直接操作 document.documentElement.style.fontSize
H5端唯一可靠的方式,是在DOM就绪后立刻覆盖根字号。注意:不能在 App.vue 的 onLaunch 里做(document 还未就绪),也不能等 mounted(部分iOS Safari会闪一下默认小字再放大)。
- 最佳时机:在
public/index.html的里插入内联脚本,确保早于任何CSS解析 - 代码示例(放在
底部):<script> // 强制设为16px,绕过iOS Safari默认13px document.documentElement.style.fontSize = '16px'; </script>
- 若需适配高DPR设备(如iPhone 14 Pro),可结合
window.devicePixelRatio微调:document.documentElement.style.fontSize = (16 * Math.min(window.devicePixelRatio, 2)) + 'px' - 不要用
rem单位去设这个值——这里必须是绝对px,否则又掉进基准循环
配合 viewport 和 text-size-adjust 防二次压缩
光设根字号还不够。iOS Safari和某些安卓WebView会在渲染阶段再次缩放文本,尤其当容器宽度窄、字体小、行高密时,触发「自动文本缩放」机制,导致文字被无故压扁。
- 在
App.vue的<style></style>中加全局重置:body, input, textarea, select, button { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; } -
<meta name="viewport">必须包含maximum-scale=1.0, user-scalable=no,否则横屏后可能重算缩放比 - 避免给文本容器设固定
width+ 小font-size组合,比如width: 200px; font-size: 12px是高危组合 - 慎用
text-size-adjust: none——iOS 17+ 已废弃,且会禁用用户手动缩放,无障碍不友好
postcss-pxtorem 配置失效的常见坑
很多人配了 postcss-pxtorem 却发现H5 CSS里还是满屏 px,根本没转成 rem——因为 uni-app H5 构建链路默认不走你 vue.config.js 里的 postcss 配置。
- 真正生效的位置是
vue.config.js的configureWebpack.chainWebpack,且必须插在css-loader后、style-loader前 - 务必
exclude所有 UI 库路径,例如:/node_modules\/(uni-ui|uview-ui)/,否则按钮、输入框全变大 -
rootValue必须和你实际设的根字号一致:如果上面用了16px,这里就得写rootValue: 16,不能写37.5(那是750设计稿换算逻辑) - 开发环境默认不启用转换,加
enable: process.env.NODE_ENV === 'production'会导致 dev 时看不到效果,建议临时设为true调试
最易被忽略的一点:H5端字体偏小从来不是单一配置能解决的问题。它横跨 HTML 初始化、CSS 渲染规则、浏览器 UA 行为三层,任一环节漏掉(比如只改了 postcss 却没动 index.html 的根字号),都会让前面所有工作白费。动手前先用 getComputedStyle 确认当前根字号是多少,比盲目套方案更有效。











