App端字体不生效主因是路径错误,应使用url('@/static/fonts/YouYuan.ttf')而非url('/static/fonts/YouYuan.ttf'),且字体须放/static/fonts/下、文件名全英文、删unpackage后重新发行。

App端字体不生效,90%是路径写错了
App端(Android/iOS真机)加载自定义字体时,url('/static/fonts/YouYuan.ttf') 这种写法基本无效。原因在于打包后资源被解压到原生沙盒目录,WebView 无法通过根路径访问。
必须改用带别名的写法:url('@/static/fonts/YouYuan.ttf')。这个 @/ 是 Vue CLI 别名,指向项目根目录下的 static/(不是 src/),uni-app 构建系统会将其正确映射到 App 内实际路径。
- 字体文件必须放在
/static/fonts/下(不能放assets/,否则不会打进 App 包) - 文件名建议全英文、无空格、无中文(如
YouYuan.ttf,别用幼圆.ttf) - 每次改完字体配置,务必删除
unpackage/目录再重新发行,否则旧缓存会干扰验证
@font-face 中 format() 参数不能乱填
不同平台对字体格式支持程度不同,format() 声明必须和实际文件类型严格匹配,否则某些端会跳过该字体源。
常见错误是把 .ttf 文件写成 format('woff'),或漏掉 truetype —— iOS 和部分安卓机只认 format('truetype') 或 format('opentype')。
-
.woff2:H5 和较新 iOS 支持好,但很多安卓 WebView 不兼容,慎作主力 -
.woff:App 端兼容性最稳,建议保留为 fallback -
.ttf:必须配format('truetype'),不能写format('ttf') - 多格式声明顺序建议:woff2 → woff → ttf,让支持者优先加载更小的格式
全局字体要覆盖所有文本容器,不只是 html/body
uni-app 的渲染模型里,view、text、page 都是独立样式作用域,仅设 html, body { font-family: 'YouYuan' } 是不够的。
必须显式覆盖所有可能承载文字的组件标签:
-
html, body, page, view, text—— 这是最低覆盖集合 - 如果用了自定义组件(比如封装了
u-text),也要加上其标签名 - 避免用
!important全局强刷,容易被页面级样式覆盖;优先靠选择器权重和声明位置控制 - 备选字体链建议写全:
font-family: 'YouYuan', 'PingFang SC', 'Microsoft YaHei', sans-serif
iconfont 图标显示为空白?先查 font-family 大小写
uni-app 编译过程会把 @font-face 中的 font-family 值自动转为小写。如果你直接复制 iconfont 官网生成的 CSS,里面写着 font-family: "IconFont" 或 font-family: "myIcon",那最终注册进引擎的就是小写名,但类名引用时仍按原大小写匹配,结果就是字体加载成功、图标却显示为方块。
解决方法只有一条:打开下载的 iconfont.css,把所有 font-family: "xxx" 里的引号内内容全部手动改成小写,例如:
font-family: "iconfont"
然后确保:
- 字体文件放在
/static/iconfont/下 - CSS 里所有
url()改成绝对路径:url('/static/iconfont/iconfont.woff2') - 图标必须用
,且.iconfont类里声明font-family: 'iconfont' !important - 不要用
包裹图标,除非加style="font-family: 'iconfont'"
真正容易被忽略的是字体加载时机——App 端首次启动时,@font-face 注册和页面渲染几乎同时发生,若字体文件稍大或设备较慢,可能首屏文字已渲染完毕才加载完字体。此时需要配合 uni.loadFontFace 主动控制加载时机,或接受首帧回退到默认字体的事实。











