App端字体不生效主因是路径错误,须用@/static/fonts/xxx.ttf;需提供woff2/woff/ttf多格式并正确声明format();全局字体须覆盖html、body、page、view、text等所有文本容器。

App端字体不生效,大概率是路径写错了
UniApp在App端(Android/iOS真机)加载自定义字体时,url('/static/fonts/YouYuan.ttf') 这种写法几乎必失败。原因在于App打包后,静态资源被解压到原生容器的沙盒目录,Webview无法通过根路径直接访问。
必须改用带 @/ 别名的写法:url('@/static/fonts/YouYuan.ttf') —— 这个路径会被Vue CLI解析为实际文件位置,并由uni-app构建系统正确映射到App内资源路径。
- 别名
@/指向项目根目录下的static/,不是src/ - 字体文件必须放在
/static/fonts/下(不能放assets/,否则不会被复制进App包) - 打包前务必删除
unpackage/目录,避免旧缓存干扰 - H5和小程序仍可用
/static/...,但App端只认@/static/...
@font-face 中 format() 值要匹配真实格式
很多开发者复制网上示例时直接写 format('truetype'),结果iOS上字体不渲染——因为iOS对woff2支持更好,而安卓对ttf更友好,但format()声明必须与文件扩展名严格一致,否则部分平台会跳过该字体源。
推荐写法是同时提供多格式并显式声明:
@font-face {
font-family: 'YouYuan';
src: url('@/static/fonts/YouYuan.woff2') format('woff2'),
url('@/static/fonts/YouYuan.woff') format('woff'),
url('@/static/fonts/YouYuan.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
-
.woff2体积最小,优先放第一位 -
.woff兼容性广,作为fallback -
.ttf必须写format('truetype'),不能写'ttf'或'truetype'拼错 - 不要省略任意一个
format(),即使只用一种格式
全局字体设置要覆盖所有默认选择器
只给 html, body 设 font-family 是不够的。UniApp在不同平台会生成不同根节点:H5用 body,小程序用 page,App端nvue页面甚至用 view 和 text。漏掉任一选择器,对应平台就会回退系统默认字体。
最稳妥的写法是显式列出所有可能的文本容器:
html, body, page, view, text, input, textarea, navigator, uni-button, uni-input {
font-family: 'YouYuan', 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
-
input/textarea等表单控件常被忽略,导致输入框字体异常 - 第三方组件如
uni-button内部文字也依赖父级继承,需显式覆盖 - scoped样式下无效,必须写在
App.vue的非scoped中
App真机调试时字体不显示,先检查这三件事
真机运行时字体“看不见”,往往不是代码问题,而是构建或环境卡点:
- 确认字体文件名全是英文+数字,不含中文、空格、括号(如
幼圆.ttf→ 必须重命名为YouYuan.ttf) - 检查
unpackage/dist/build/app-plus/目录下是否存在对应字体文件,没有就说明没打进包(常见于路径写成assets/或拼错@/) - Android端若仍不显示,尝试在
manifest.json → app-plus → usingComponents中添加"nvueStyleCompiler": "uni-app"(部分老版本需要)
字体加载本身不可见、无报错,出问题时最耗时间的是验证路径是否真正打进包里——比调样式更值得花两分钟手动进 unpackage 目录翻一遍。











