简述:使用开启CORS的woff字体格式(或ttf)的https资源地址,使用wx.loadFontFace
API(css原生@font-face
语法)加载使用。
⚠️ 注意:字体商用需授权许可,目前免费可商用的大部分字体,可见参考索引5。以下示例使用的是开源字体:得意黑和钉钉进步体。
1. wx.loadFontFace
使用wx.loadFontFace 加载字体,配合wxss和wxml使用,参见文档 & 官方示例
// -- wxss --
// .DingTalk-JinBuTi {
// font-family: 'DingTalk-JinBuTi';
// }
wx.loadFontFace({
family: 'DingTalk-JinBuTi',
source: 'url("https://xxx/font/DingTalk-JinBuTi.woff")', //此处需替换为真实字体地址
success(res) {
console.log(res.status)
},
fail: function (res) {
console.log(res.status)
},
complete: function (res) {
console.log(res.status)
}
});
注意:
- 格式支持常见的基本所有类型(ttf、woff、woff2(web主流)、otf、sfnt),建议格式为 TTF 和 WOFF(推荐),WOFF2 在低版本的 iOS 上会不兼容。
- 字体链接仅支持https链接
- 字体链接访问需满足浏览器同源策略,字体文件资源设置CORS的
Access-Control-Allow-Origin
为小程序域名:servicewechat.com
或者*才可以。
经过测试,ios和小米手机对于未设置CORS的字体文件仍然可以正常加载,荣耀和vivo无法正常加载,需要设置正确的CORS即可正常加载
- 在加载成功之后,会自动刷新字体显示
- 不需要设置downloadFile合法域名及业务域名。
扩展:一次加载,全局使用
如下在app.js中加载添加全局参数(global: true),即可在任意页面中的font-family中使用该字体。
onLaunch() {
wx.loadFontFace({
family: 'DingTalk-JinBuTi',
global: true,
source: 'url("https://xxx/font/DingTalk-JinBuTi.woff")', //此处需替换为真实字体地址
success(res) {
console.log(res.status)
},
fail: function (res) {
console.log(res.status)
},
complete: function (res) {
console.log(res.status)
}
});
},
2. @font-face
同css加载字体的规则,见MDN文档,
注意:字体链接访问需满足浏览器同源策略。支持常见格式。
@font-face {
font-family: "SmileySans-Oblique";
src: url("https://xxx/font/SmileySans-Oblique.woff"); //此处需替换为真实字体地址
}
.SmileySans-Oblique {
font-family: 'SmileySans-Oblique';
}
扩展:全局使用
在app.wxss中引入字体即可全局使用。
@font-face {
font-family: "SmileySans-Oblique";
src: url("https://xxx/font/SmileySans-Oblique.woff"); //此处需替换为真实字体地址
}
.SmileySans-Oblique {
font-family: 'SmileySans-Oblique';
}
3. face-font base64
因源码过大致小程序增加包体积,暂不考虑。英文字体可以考虑。参见此。
扩展:在canvas中使用
小程序canvas渲染时需要字体加载完成,css方式字体加载完成不容易监听,小程序文档提到可使用wx.loadFontFaced的回调中渲染canvas。参考文档及代码示例。
另外wxml-to-canvas中不支持font-family属性,可参考链接4修改源码实现。
参考
- wx.loadFontFace(Object object) | 微信开放文档
- 微信小程序使用自定义字体的三种方法 - 掘金
- loadFontFace 支持全局生效 | 微信开放社区
- wxml-to-canvas没有fontWeight的相关支持? | 微信开放社区
- 光明正大用字体——2023年“不要钱”的字体集合!哔哩哔哩bilibili
不设置字体,小程序默认使用系统字体算不算侵权?
安卓机使用字体无效果
wx.loadFontFace({ global: true, family: 'DingTalk-JinBuTi', source: 'url("https://wx-water-station-1300008292.cos.ap-guangzhou.myqcloud.com/DingTalk-JinBuTi.woff")', scopes: ['webview', 'native'], success: (res) => { console.log('font load success', res); }, fail: (err) => { console.log('font load fail', err); }, });