一、加载本地字体

做小程序项目时,有时为了提升页面展示效果,会引入一些第三方字体,引入方式如下代码片段

/*直接在app.css引入 */
@font-face {
    font-family: "alifont"; // 是你封装的名字
    src: url('./static/css/subset-AlibabaPuHuiTiR.ttf') format('truetype'); // 你字体包的位置
}

而常规字体文件比较大(例如以上阿里巴巴普惠字体--Alibaba-PuHuiTi-Regular.otf,字体文件大小6.9M),小程序的包大小又有2M的限制,引入本地字体会超包。

二、加载外部字体

@font-face {
    font-family:'alifont';
    src:url('https://www.jiandatech.com/test/vape/Alibaba-PuHuiTi-Regular.otf') format('opentype');
}

或者

wx.loadFontFace({
    family: 'alifont',
    source: 'url("https://www.jiandatech.com/test/vape/Alibaba-PuHuiTi-Regular.otf")',
    success: function (e) {
        console.log(e, '动态加载字体成功')
    },
    fail: function (e) {
        console.log(e, '动态加载字体失败')
    }
})

缺点:加载会很慢,会有明显的默认字体切换到外部字体的过程,体验较差,特别是字体文件越大,加载的速度越慢,有些小程序页面甚至无法加载成功。

三、简化字体文件后再本地引入

针对1和2的问题,我们可以对字体进行抽取,抽出页面中需要用到的字,文字抽取工具Transfonter,如下图所示操作

小程序上文字很多ios显示卡顿 小程序加载字体_小程序上文字很多ios显示卡顿

抽取后字体文件就从原来的6.9M变成了9k,然后就可以采用本地文件引入的方式加载第三方字体,有比较好的交互体验。

附:

@font-face的format属性

format :字体的格式,主要用于浏览器识别,一般有以下几种——truetype,opentype,truetype-aat,embedded-opentype,avg等。

对于@font-face而言,兼容性问题就是各浏览器所能识别的字体格式不尽相同。

  • TrueType格式(.ttf)

Windows和Mac上常见的字体格式,是一种原始格式,因此它并没有为网页进行优化处理。

浏览器支持:IE9+,FireFox3.5+,Chrome4.0+,Safari3+,Opera10+,IOS Mobile Safari4.2+

  • OpenType格式(.otf)

以TrueType为基础,也是一种原始格式,但提供更多的功能。

浏览器支持:FireFox3.5+,Chrome4.0+,Safari3.1+,Opera10.0+,IOS Mobile Safari4.2+

  • Web Open Font格式(.woff)

针对网页进行特殊优化,因此是Web字体中最佳格式,它是一个开放的TrueType/OpenType的压缩版,同时支持元数据包的分离。

浏览器支持:IE9+, FireFox3.5+, Chrome6+, Safari3.6+,Opera11.1+

  • Embedded Open Type格式(.eot)

IE专用字体格式,可以从TrueType格式创建此格式字体。

浏览器支持:IE4+

  • SVG格式(.svg)

基于SVG字体渲染的格式。

浏览器支持:Chrome4+, Safari3.1+, Opera10.0+, IOS Mobile Safari3.2+

为解决兼容性问题,一般引入字体如下代码片段所示:

@font-face {
    font-family: 'YourWebFontName';
    src: url('YourWebFontName.eot'); /* IE9 Compat Modes */
    src: url('YourWebFontName.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
         url('YourWebFontName.woff') format('woff'), /* Modern Browsers */
         url('YourWebFontName.ttf') format('truetype'), /* Safari, Android, iOS */
         url('YourWebFontName.svg#YourWebFontName') format('svg'); /* Legacy iOS */
}