rpx无法动态调整字体大小,因其编译时静态换算且运行时不可变;需改用rem/vw单位配合js控制根字号,并注意多端兼容与持久化存储。

uni-app 用 rpx 就没法动态调字体大小?
rpx 是 uni-app 官方推荐的响应式单位,但它本质是“静态换算”——编译时按设计稿宽度(如 750rpx = 屏幕宽)固定映射到 px,运行时无法改变。这意味着:你改不了根字号,也改不了 rpx 的实际像素值。用户点“放大字体”,rpx 字体照样小,因为它的换算基准写死在编译逻辑里,不走 CSS 变量或 DOM 样式链。
所以别想着给 rpx 加响应式控制。真要动态调字号,必须绕开 rpx,统一转成可被 JS 控制的单位(rem 或 vw),再通过修改根元素或 CSS 自定义属性来驱动变化。
postcss-px-to-viewport 配置踩坑最多的地方
很多项目装了 postcss-px-to-viewport 却没生效,不是插件问题,而是配置和工程链路断了。常见错误:
-
viewportWidth值和设计稿不一致:比如设计稿是 375px 宽,却配成viewportWidth: 750,结果所有 rem 算出来翻倍,页面直接错位 - 没关掉 H5 端的自动缩放:H5 在某些安卓 WebView 下会强制缩放,导致
rem基准失真,得加<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> - 漏排除 UI 库:
uview-ui、uni-ui这些组件内部用了 rpx 或固定 px,必须在插件exclude里写上/node_modules\/uview-ui/,否则它们的样式会被错误转成 rem,按钮变大、弹窗错位 - 开发环境没启用转换:默认只在生产环境生效,开发时看不到效果,得手动加
enable: true或删掉条件判断
page-meta 的 root-font-size 怎么绑定才真正生效
微信小程序从基础库 2.9.0 起支持 <page-meta root-font-size></page-meta>,但它只对当前页面的 rem 计算起作用,且必须写在页面最顶层、第一个节点位置。Vue SFC 里如果它被包在 <template></template> 或 <view></view> 里,就无效。
实操建议:
- 用 Vite 插件自动注入,别手写——比如
page-root-insert-element.js解析 AST,在每个页面<template></template>开头插入<page-meta :root-font-size="fontSize + 'px'"></page-meta> -
fontSize必须是响应式变量(ref或store.fontSize),不能写死字符串,否则切换不触发重绘 - H5 和 App 端不支持
page-meta,得 fallback 到document.documentElement.style.fontSize,所以一定要做平台判断:uni.getSystemInfoSync().platform === 'mp-weixin'
vuex/pinia 存字体大小,但缓存没同步怎么办
用户调完字号退出再进,又回到默认值——问题不在状态管理,而在没持久化。uni-app 的 vuex 或 pinia 是运行时内存态,App 关闭就清空。
必须配合本地存储:
- 设置时立刻写入:
uni.setStorageSync('fontScale', scale)(小程序)或plus.storage.setItem('fontScale', scale)(App) - App 启动时,在
main.js或store/index.js初始化阶段读取:const saved = uni.getStorageSync('fontScale') || 1,再赋给 store - 注意小程序 setData 有频率限制,别在滑块拖动中高频更新
root-font-size,加个throttle或只在松手时提交
最易忽略的一点:nvue 页面不走 Vue 渲染器,page-meta 和 CSS 变量全失效,只能靠 native.css + uni.setNavigationBarColor 类似机制硬切,这部分得单独适配。










