评论

小程序中如何加载使用第三方字体

本文介绍了小程序中加载第三方字体的三种方式和需要注意的规则。

简述:使用开启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)
  }
});

注意:

  1. 格式支持常见的基本所有类型(ttf、woff、woff2(web主流)、otf、sfnt),建议格式为 TTF 和 WOFF(推荐),WOFF2 在低版本的 iOS 上会不兼容。
  2. 字体链接仅支持https链接
  3. 字体链接访问需满足浏览器同源策略,字体文件资源设置CORS的Access-Control-Allow-Origin为小程序域名:servicewechat.com或者*才可以。
经过测试,ios和小米手机对于未设置CORS的字体文件仍然可以正常加载,荣耀和vivo无法正常加载,需要设置正确的CORS即可正常加载
  1. 在加载成功之后,会自动刷新字体显示
  2. 不需要设置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修改源码实现。

参考

  1. wx.loadFontFace(Object object) | 微信开放文档
  2. 微信小程序使用自定义字体的三种方法 - 掘金
  3. loadFontFace 支持全局生效 | 微信开放社区
  4. wxml-to-canvas没有fontWeight的相关支持? | 微信开放社区
  5. 光明正大用字体——2023年“不要钱”的字体集合!哔哩哔哩bilibili


最后一次编辑于  2023-03-21  
点赞 1
收藏
评论

2 个评论

  • 鑫
    01-17

    不设置字体,小程序默认使用系统字体算不算侵权?

    01-17
    赞同
    回复 1
    • simple
      simple
      01-17
      不涉及侵权
      01-17
      回复
  • 恭喜發財
    恭喜發財
    2023-07-19

    安卓机使用字体无效果

    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);
          },
        });
    
    2023-07-19
    赞同
    回复 9
    • simple
      simple
      2023-07-20
      关注下这个规则看下呢:字体链接访问需满足浏览器同源策略,字体文件资源设置CORS的Access-Control-Allow-Origin为小程序域名:servicewechat.com或者*才可以
      2023-07-20
      回复
    • 。。。
      。。。
      2023-07-29回复simple
      view元素中回显正常,但是在textarea输入框中显示也是这个规则导致的吗?
      2023-07-29
      回复
    • simple
      simple
      2023-07-29回复。。。
      textarea虽然文档中未提及,但应该和input一样由于原生组件,无法设置font-family,为默认系统字体,官方文档见:https://developers.weixin.qq.com/miniprogram/dev/component/input.html#Bug-Tip
      2023-07-29
      回复
    • 。。。
      。。。
      2023-07-30回复simple
      wx.lodeFontFace可以设置请求头吗?
      2023-07-30
      回复
    • simple
      simple
      2023-07-31回复。。。
      官方文档未提及,就没有的
      2023-07-31
      回复
    查看更多(4)
登录 后发表内容