uniapp无全局字体颜色api,需用page、.uni-app、.uni-page-body三类选择器加!important跨端生效;h5依赖body无效因内容挂载于.uni-app下,小程序page不继承body,app(nvue)原生渲染忽略body样式。

uni-app 没有“全局默认字体大小和颜色”的统一 API,所有样式必须通过 CSS 层级控制。直接在 App.vue 的 <style></style> 中设置 html 或 body 的 font-size 和 color,对 H5 有效,但在小程序和 App 端基本无效——因为这些平台不渲染标准 HTML 树,body 不是根容器,html 甚至不存在。
为什么 App.vue 里设 body { font-size: 16px } 不生效
小程序(微信/支付宝等)和 App 端的渲染层不基于完整 DOM,body 是伪节点或被忽略;H5 虽然能读取,但 uni-app 的页面内容实际挂载在 .uni-app 容器下,且各端对继承链的支持不一致。例如:
- 微信小程序中,
page元素不继承body字体,需显式设置page { font-size: 16px } - App(nvue)用原生渲染,
body样式完全不参与计算 - H5 下即使设置了
body,部分组件(如uni-nav-bar)内部用了内联样式或 scoped style,会覆盖继承值
真正跨端生效的写法:用 page + .uni-app + 全局 class
必须同时覆盖三类选择器,才能在 H5、小程序、App(vue 页面)中稳定起效:
/* App.vue <style> 中 */
page,
.uni-app,
.uni-page-body {
font-size: 14px !important;
color: #333 !important;
}
</style>
注意点:
-
page是小程序的根容器选择器,必须单独写,不能合并成page, body -
.uni-app是 H5 和 App(vue 渲染模式)的最外层包裹类,所有页面内容都在其内 -
.uni-page-body是 uni-app 内部用于承载页面主体的类,某些版本中它才是实际文本容器 - 必须加
!important,否则组件库的 scoped style 或内联样式容易覆盖
想支持用户动态切换字号?别碰 font-size 继承
依赖继承链的方案在跨端场景下极其脆弱。比如你改了 page 的 font-size,但 uni-input 内部用的是 px 固定值,它就不会变。真正可靠的做法是:
- 用
postcss-px-to-viewport把项目中所有font-size的px单位转成rem - 通过
page-meta的:root-font-size动态控制 rem 基准(仅 H5 和部分小程序支持) - 对不支持
root-font-size的平台(如旧版微信小程序),改用 CSS 变量 +var(--font-base),并在每个用到文字的组件里显式声明font-size: calc(var(--font-base) * 1) - App(nvue)需单独处理:用
uni.setStorageSync存字号,启动时注入 JS 变量,再通过uni.createSelectorQuery批量修改关键节点样式(代价高,慎用)
颜色可以靠 CSS 变量统一,但得避开 scoped
字体颜色比大小更容易统一。推荐在 App.vue 的 <style></style>(非 scoped)中定义:
:root {
--text-color: #333;
--text-color-secondary: #666;
}
然后在任意组件中使用:
<template><view class="content">正文</view></template><style>
.content {
color: var(--text-color);
}
</style>
但要注意:scoped 样式无法穿透到子组件,如果子组件用了 scoped,它的 color 不会响应 :root 变量变化;解决方案是把变量定义放在非 scoped style 中,并在子组件里也用非 scoped 或 deep 修饰。
最麻烦的不是怎么写,而是哪一层该信、哪一层会被绕过——page-meta 在 H5 里只是个摆设,html 在小程序里根本没定义,而 !important 在 nvue 里又可能被原生控件无视。跨端样式从来不是“写一次”,而是“按平台补三次”。











