真正起效的组合是css层强制重置加平台特有兜底机制:ios上fontsizesetting恒为空,android各厂商返回不一致,小程序中该值不反映真实设置;h5需关闭enablefontsize并加text-size-adjust,小程序须每页手写page-meta,app端js无效须原生干预。

不能靠 uni.getSystemInfoSync().fontSizeSetting 动态读取后 JS 调整,也不能只加一行 CSS 就全端生效。真正起效的组合是:CSS 层强制重置 + 平台特有兜底机制。
为什么 fontSizeSetting 在多数平台返回空或不可靠
iOS 上该字段恒为空字符串;Android 各厂商(华为、小米、OPPO)返回值不一致,有的始终为 "",有的只在特定系统版本下有效;微信/支付宝小程序中它不反映用户当前设置,而是返回默认值或未定义。这意味着你无法用它做条件判断来“动态适配”——它不是信号源,而是失效的伪接口。
常见错误现象:console.log(uni.getSystemInfoSync().fontSizeSetting) 打印出空字符串,但系统字体明明已调大;页面字体却没变化,或只在部分页面突兀放大。
- 不要在
onLoad或mounted里轮询或监听它 - 不要把它当状态存进 Vuex/Pinia 做响应式控制
- 小程序端唯一可控入口是
<page-meta></page-meta>的root-font-size,而非 JS 读取值
H5 端必须关掉 enableFontSize 并加 text-size-adjust
H5 是最容易误配的一环:很多人以为“要响应缩放就得开 enableFontSize”,结果反而把字体锁死了。实际上,这个开关默认关闭;一旦你在 manifest.json 里手动设为 true,WebView 就会主动继承系统文本缩放比例,导致 CSS 字体被强制拉伸。
正确做法是:
- 删掉
manifest.json中的"enableFontSize": true,或确保它不存在 / 显式设为false - 在
App.vue <style></style>中加入:
html, body, page, .uni-app {
-webkit-text-size-adjust: 100% !important;
text-size-adjust: 100% !important;
}
注意:text-size-adjust 对 iOS Safari 和主流 Android 浏览器有效,但在微信内置 X5 内核中可能被忽略——此时需叠加 <page-meta></page-meta>(见下一条)。
小程序端必须每个页面顶部写 <page-meta></page-meta>,不能全局注入
小程序编译机制决定了:你在 App.vue 或 main.js 里写的 <page-meta></page-meta> 不会被注入到子页面。它只对当前组件模板生效,且必须位于 <template></template> 的第一行,否则无效。
示例(每个需要固定字体的页面):
<template><page-meta :root-font-size="fixedRootSize + 'px'"></page-meta><view class="content">...</view></template><script>
export default {
data() {
return {
fixedRootSize: 16 // 所有 rem 计算以此为基准
}
}
}
</script>
关键点:
-
fixedRootSize建议硬编码为16,避免任何 JS 计算或平台读取 - 如果你用了
postcss-pxtorem,确认其rootValue配置也等于16,否则 px → rem 换算错乱 - 不要用
page-font-size,它仅影响导航栏文字,不控制页面主体
App 端(iOS/Android)JS 层基本无效,必须原生干预
WebView 渲染层在 App 端完全绕过 JS 控制。iOS 上 adjustsFontForContentSizeCategory 默认开启;Android 各厂商 WebView 默认启用文本缩放支持。无论你怎么改 CSS 或拦截事件,只要原生层没关,字体就可能被系统接管。
可行路径只有两条:
- iOS:在 Xcode 工程中找到主
ViewController或使用 UTS 插件,在webView.configuration.defaultTextEncodingName之后调用webView.adjustsFontForContentSizeCategory = false - Android:在
android/app/src/main/java/...的 WebView 初始化处调用setSupportZoom(false)和getSettings().setTextZoom(100)
注意:nvue 页面不走 WebView,<page-meta></page-meta> 和 CSS 全部无效,只能靠原生层自定义渲染逻辑或禁用动态类型支持。
最常被忽略的是:H5 的 text-size-adjust 在 X5 内核里失效、小程序的 <page-meta></page-meta> 必须每页手写、App 端的 JS 拦截根本触达不到 WebView 底层——这些不是 bug,是平台设计使然。别试图用一套 JS 逻辑打天下,分层处理才是稳定解法。











