前端使用自定义字体方案

简介: 工作中我相信大家都遇到过设计要求使用一些奇奇怪怪字体的需求,然后因为字体文件太大,选择切图。我这个需求就厉害了,用户发的文章可以选择字体。这文章中可以出现的字就太多了,显然上个方案就不合适了,那我们是这么做的呢?废话不多说,先上 demo,别问我 demo 是谁。接口地址:https://www.lilnong.top/createfont?txt=%E6%B5%8B%E8%AF%95%E6%96%87%E5%AD%97页面地址: https://www.lilnong.top/static/html/createfont.html

实现方案


分析一下问题


问题只有一个,那就是:字体文件太大了(10MB)。先不说流量贵不贵,这么大个文件,垃圾网时,我文章都看完你字体还没回来。


解决方案


当然是把字体文件缩小,那么有两种方案


  • 提供常用字生成字体文件


  • 动态生成字体文件


提供常用字生成字体文件


英文的话比较简单,比如只提供 26 个字母。


但是中国汉字博大精深,太难了,那么我们可以提供一些常用字。

优点:


  1. 只有一个资源,可以缓存公用。


  1. 实现简单


缺点:


  1. 因为是常用字,所以有可能一些不常用字就会显示默认字体,体验较差。


  1. 因为字体文件较大,所以首次加载会慢一点。但是又因为不是全量,会快一点。


动态生成字体文件


这个方案就是把文章中的所有字提出来,然后生成一个字体文件使用。


其实这个方案常用于静态页面,跑个脚本分析生成一个字体文件。


优点:


  1. 文件小,速度快


  1. 实现稍微复杂,因为需要动态生成字体文件,需要服务端搞一个字体生成的服务。


缺点:


  1. 每次修改文章都要生成新的字体文件,旧资源利用率不高,缓存利用率不高。

当然,我们最后选择了这个动态生成字体文件方案,就了文件小,加载快。


fontmin库


好了上面把方案说了,下面就开始说怎么搞了。

我使用的是 fontmin 库来实现的功能。


安装


npm install --save fontmin


使用


var Fontmin = require('fontmin');
new Fontmin()
    .src('/static/font/font.ttf') // 载入字体
    .use(rename(txtMD5+'.ttf')) // 修改输出的文件名
    .use(Fontmin.glyph({text: txt,hinting: false})) //子集化 text 参数就是输出时要的字体
    .use(Fontmin.ttf2eot())     // eot 转换插件
    .use(Fontmin.ttf2woff())    // woff 转换插件     
    .use(Fontmin.ttf2svg())     // svg 转换插件
    .use(Fontmin.css())         // css 生成插件
    .dest('/static/fontmin'); // 设置字体输出路径
    .run(function (err, files) {
        if (err) throw err;
        console.log('success');
    });

bVbEyOD.webp (1).jpg


修改生成的文件名称


var rename = require('gulp-rename');
.use(rename(txtMD5+'.ttf')) // 修改输出的文件名


修改 CSS 文件中字体的 Font-family


.use(Fontmin.css(
    fontFamily: 'MD5'
))


其他资源


  1. font-spider
    可以自动分析Html文件,可以放入 Gulp 中使用。


  1. font-carrier
    也可以做字体子集化,还可以修改每个字的字形(可以理解为混淆)。
相关文章
|
6月前
|
开发框架 前端开发 JavaScript
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
在Vue&Element前端项目中,使用FastReport + pdf.js生成并展示自定义报表
|
1天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
4月前
|
前端开发
前端引入字体文件
文章介绍了如何在前端项目中引入字体文件,并展示了具体的HTML和CSS代码示例,包括如何使用`@font-face`规则来定义字体和在页面中应用自定义字体。
126 1
前端引入字体文件
|
6月前
|
开发框架 前端开发 JavaScript
在Vue前端项目中,附件展示的自定义组件开发
在Vue前端项目中,附件展示的自定义组件开发
在Vue前端项目中,附件展示的自定义组件开发
|
2月前
|
前端开发 数据安全/隐私保护
.自定义认证前端页面
.自定义认证前端页面
19 1
.自定义认证前端页面
|
2月前
|
前端开发 数据可视化 搜索推荐
深入剖析极态云优雅的前端框架设计方案(上)
最近在体验极态云,这款低代码软件开发产品,发现其前端框架设计方案很优雅很强大! 在接下来的学习过程中,我将持续输出自己对极态云前端框架设计方案的深入理解,包括具体的使用技巧、优势分析以及可能的应用场景等方面的内容,希望能为大家提供有价值的参考。
|
3月前
|
JSON 前端开发 数据格式
前端的全栈之路Meteor篇(五):自定义对象序列化的EJSON介绍 - 跨设备的对象传输
EJSON是Meteor框架中扩展了标准JSON的库,支持更多数据类型如`Date`、`Binary`等。它提供了序列化和反序列化功能,使客户端和服务器之间的复杂数据传输更加便捷高效。EJSON还支持自定义对象的定义和传输,通过`EJSON.addType`注册自定义类型,确保数据在两端无缝传递。
|
4月前
|
前端开发
【前端web入门第三天】02 CSS字体和文本
本文详细介绍了CSS中字体和文本的相关属性。字体部分涵盖字体大小、粗细、样式、行高、字体族及`font`复合属性,通过具体示例展示了如何设置和使用这些属性。文本部分则讲解了文本缩进、对齐方式、修饰线及文字颜色等属性,并提供了实用的代码示例。此外,还简要介绍了调试工具中的一些细节,如错误属性标识和属性生效状态的控制。
83 28
|
3月前
|
缓存 前端开发 UED
前端 8 种图片加载优化方案梳理
本文首发于微信公众号“前端徐徐”,详细探讨了现代网页设计中图片加载速度优化的重要性及方法。内容涵盖图片格式选择(如JPEG、PNG、WebP等)、图片压缩技术、响应式图片、延迟加载、CDN使用、缓存控制、图像裁剪与缩放、Base64编码等前端图片优化策略,旨在帮助开发者提升网页性能和用户体验。
588 0
|
3月前
|
资源调度 前端开发 安全
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
前端实战:基于Verdaccio搭建私有npm仓库,轻松上传与下载自定义npm插件包
209 0

热门文章

最新文章