Fabric.js 使用自定义字体

本文简介

点赞 + 关注 + 收藏 = 学会了


如果你使用 Fabric.js 做编辑类的产品,有可能需要给用户配置字体。

这次就讲讲在 Fabric.js 中创建文本时怎么使用自定义字体、在项目运行时怎么修改字体、以及推荐一个精简字体库的工具


学习本文前,你必须有一点 Fabric.js 的基础,如果没了解过 Fabric.js 可以阅读一下 《Fabric.js 从入门到膨胀》



创建文本时设置字体

Fabric.js 中使用自定义字体库时,需要用到 fontfaceobserver.js 这个工具,至于为什么稍后会说到。

在创建文本时就设置字体,需要做以下几步:

  1. CSS 里引入字体。
  2. 使用 Fabric.js 创建画布。
  3. 等字体加载完成后再设置文本字体。
  4. 将文本添加到画布中。

在本例中,我使用 IText 创建文本,在创建时通过它的 fontFamily 属性就可以设置自定义字体。


先看看本例效果

file

我使用斗鱼的字体,听说是可以免费使用,希望没骗我~

按照前面说到的步骤去实现:

<style>
  /* 引入斗鱼字体 */
  /* 我把字体放到本地了,字体路径你们需要根据自己的项目去修改 */
  @font-face {
    font-family: douyu;
    src: url('../../fonts/douyu.ttf');
  }
</style>

<!-- 画布元素 -->
<canvas id="c" width="300" height="300" style="border: 1px solid #ccc"></canvas>

<!-- 引入 fontfaceobserver.js 和 fabric.js -->
<script src="../../script/fontfaceobserver.js"></script>
<script src="../../script/fabric.js"></script>

<script>
    // 创建画布
    const canvas = new fabric.Canvas('c')

  // 监听斗鱼字体加载
  const douyuFont = new FontFaceObserver('douyu')

  // 等字体加载完成或者失败后再执行设置字体的
  douyuFont.load()
      // 加载成功
    .then(() => {
        // 创建文本
        const iText = new fabric.IText('雷猴', {
          fontFamily: 'douyu' // 设置字体
        })
      // 将文本添加到画布中
      canvas.add(iText)
      })
      // 加载失败
      .catch(() => {
        console.error('字体加载失败')
      })
</script>

因为字体是一种资源文件,引用资源文件就需要时间去加载。

创建画布渲染文本的速度可能会比加载字体资源快很多,所以需要用到 fontfaceobserver.js 去监听字体加载结果。

  • fontfaceobserver.js 官网
  • fontfaceobserver.js github地址

fontfaceobserver.js 的详细用法可以点击上面的官网查阅。

简单的用法如下:

<style>
  @font-face {
    font-family: 自定义字体名;
    src: url('字体包路径');
  }
</style>

<script>
const font = new FontFaceObserver('自定义字体名')

font.load()
  .then()
  .catch()
</script>

load() 方法的作用是监听字体加载结果,加载成功就执行 then 的代码,加载失败就执行 catch 代码。



动态修改字体

如果需要在项目运行时动态修改字体,需要做以下几步:

  1. 提前加载好要用的字体库。
  2. 创建画布。
  3. 等字体加载完成后再设置文本字体。
  4. 将文本添加到画布中。
  5. 修改字体前,先获取要修改的文本元素。
  6. 使用 set 方法设置文本的 fontFamily 属性。
  7. 刷新画布。

本例用到斗鱼和阿里的字体,我查过了,说是免费使用。

file

根据上面提到的几步动手编码

<style>
  /* 我把字体放到本地了,字体路径你们需要根据自己的项目去修改 */
  /* 引入斗鱼字体 */
  @font-face {
    font-family: douyu;
    src: url('../../fonts/douyu.ttf');
  }
  /* 引入阿里字体 */
  @font-face {
    font-family: ali;
    src: url('../../fonts/AlibabaPuHuiTi-2-35-Thin.ttf');
  }
</style>

<!-- 设置字体的按钮 -->
<button οnclick="setFont('douyu')">斗鱼</button>
<button οnclick="setFont('ali')">阿里</button>

<!-- 画布元素 -->
<canvas id="c" width="300" height="300" style="border: 1px solid #ccc"></canvas>

<!-- 引入 fontfaceobserver.js 和 fabric.js -->
<script src="../../script/fontfaceobserver.js"></script>
<script src="../../script/fabric.js"></script>

<script>
    // 创建画布
    const canvas = new fabric.Canvas('c')
  // 创建文本
  const iText = new fabric.IText('雷猴')
  // 将文本添加到画布中
  canvas.add(iText)

  // 设置字体
  function setFont(font) {
    // 监听当前要设置的字体加载情况
    let fontFamily = new FontFaceObserver(font)

    // 加载完成后执行
    fontFamily.load()
        // 加载成功
      .then(() => {
        let target = canvas.getActiveObject()
        if (target) {
          target.set("fontFamily", font)
          canvas.requestRenderAll()
        }
      })
        // 加载失败
      .catch(() => {
        console.error('字体加载失败')
      })
  }
</script>


精简字体库

关于 Fabric.js 如何使用自定义字体库的内容说完了,但日常工作中我还遇到一个问题:某些特定地方会使用一些特殊字体,比如数字、项目名等地方。

通常字体库会包含大量字体,但实际项目中可能只有几个字会用到特殊字体。

经过我长时间的审问,一位不愿透露姓名的网友终于透露出他用到精简字体库的工具

file

file

Fontmin 有客户端,也可以直接使用终端操作。

客户端也提供了mac和windows两个版本,操作起来非常简单。有需要的工友可以打开链接获取。

  • Fontmin官网
  • Fontmin github地址


代码仓库

本文完整代码可通过下方链接获取。

⭐ Fabric.js 使用自定义字体



推荐阅读

👍《Fabric.js 从入门到_ _ _ _ _ _》

👍《Fabric.js 样式不更新怎么办?》

👍《Fabric.js 自定义控件》

👍《Fabric.js 讲解官方demo:Stickman》

👍《Fabric.js 拖拽顶点修改多边形形状》

👍《Fabric.js 复制粘贴元素》


点赞 + 关注 + 收藏 = 学会了 代码仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/106698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二维码智慧门牌管理系统升级解决方案:采集计划精细化管理的艺术

文章目录 前言一、采集计划的定义和配置流程二、多采集计划配置策略三、采集计划的实践应用 前言 在数字化时代&#xff0c;建设智慧城市需要借助各种先进的技术工具。其中&#xff0c;二维码智慧门牌管理系统在城市管理、资源调配和公众服务等方面扮演着举足轻重的角色。关键…

实现寄生组合继承

寄生组合继承是一种继承方式&#xff0c;它通过组合使用构造函数继承和原型继承的方式&#xff0c;实现了高效而且正确的继承方式。 具体实现步骤如下&#xff1a; ① 定义一个父类&#xff0c;实现其属性和方法&#xff1a; function Person(name) {this.name namethis.age…

贝锐花生壳内网穿透推出全新功能,远程业务连接更安全

贝锐旗下内网穿透兼动态域名解析品牌花生壳目前推出了全新的“访问控制”功能&#xff0c;可精确设置访问权限&#xff0c;充分保障信息安全&#xff0c;满足更多用户安全远程访问内网服务的需求。 通过这一功能&#xff0c;可实现指定时间、IP、地区等条件下才能远程访问映射的…

什么是React中的高阶组件(Higher Order Component,HOC)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

PyCharm 安装 cx_Oracle 失败

我在PyCharm的终端用 pip安装cx_Oracle失败&#xff0c;报错情况如下&#xff1a; ERROR: Could not build wheels for cx_Oracle, which is required to install pyproject.toml-based projects 出错原因&#xff1a; python 的版本太高了&#xff0c;我的是3.11版本的&…

百度迁徒数据爬虫方法

百度迁徙数据是由百度公司提供的免费开放数据集&#xff0c;主要包含了全国范围内各大城市的每日人口流入流出情况。这些数据来源于百度地图上的用户位置信息&#xff0c;通过计算得到每个小时的流入流出人数&#xff0c;并且可以按照省级、市级等多种维度进行分析。 百度迁徙 …

缓解光纤激光切割机老化之如何保养光纤激光切割机的光学镜片

激光切割头具备极高的精密度和昂贵的价格&#xff0c;是光纤激光切割机最关键的运行部分之一。在日常的光纤激光切割机维修过程中频繁出现的关于切割头使用寿命的问题就是内部光学镜片的污染及损坏。 部分导致光纤激光切割机激光切割头光学镜片污染的原因主要包括&#xff1a;对…

c++ qt连接操作sqlite

qt客户端编程,用到数据库的场景不多,但是部分项目还是需要数据库来保存同步数据,客户端用到的数据库,一般是sqlite。 Qt提供了数据库模块,但是qt本身的数据库模块并不好用,会有各种问题, 建议大家不要,可以自己封装数据库的操作。本篇博客介绍qt连接操作sqlite。 sqlit…

如何使用react-router v6快速搭建路由?

前言 之前一直使用react-router V5&#xff0c;上次搭建一个小项目&#xff0c;下载的react-router V6&#xff0c; 本以为没什么区别&#xff0c;就按照v5的那一套用了&#xff0c;区区小功能&#xff0c;奈何不了我的。然后自信满满的运行&#xff0c;哦豁&#xff0c;不生效…

c语言从入门到实战——数组

数组 前言1. 数组的概念2. 一维数组的创建和初始化2.1 数组创建2.2 数组的初始化2.3 数组的类型 3. 一维数组的使用3.1 数组下标3.2 数组元素的打印3.3 数组的输入 4. 一维数组在内存中的存储5. sizeof计算数组元素个数6. 二维数组的创建6.1 二维数组得概念6.2 二维数组的创建 …

DAY36 738.单调递增的数字 + 968.监控二叉树

738.单调递增的数字 题目要求&#xff1a;给定一个非负整数 N&#xff0c;找出小于或等于 N 的最大的整数&#xff0c;同时这个整数需要满足其各个位数上的数字是单调递增。 &#xff08;当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单…

vue3 源码解析(2)— ref、toRef、toRefs、shallowRef 响应式的实现

前言 vue3 源码解析&#xff08;1&#xff09;— reactive 响应式实现 介绍完 reactive 之后还有另一个很重要的响应式API&#xff0c;其中包括 ref、toRef、toRefs 和 shallowRef。这些API在vue3中起着至关重要的作用&#xff0c;它们帮助我们更好地管理和跟踪响应式数据的变…

一文搞懂 MineCraft 服务器启动操作和常见问题 2023年10月

文章目录 前言1. 新建文件夹2. 创建 bat 文件3. 编辑 bat 文件4. 启动服务器5. 恭喜完成 文章持续更新中&#xff0c;如果你有问题可以通过 qq 1317699264 获取免费协助&#xff0c;解决的问题将会被更新到本文章中 前言 无论你是使用服务端整合包&#xff0c;还是从上一篇我的…

基本选择器

目录 1 标签选择器 2 类选择器 3 id选择器 作用&#xff1a;选择页面上的某一个或某一类元素 1 标签选择器 标签选择器会选择页面上所有的标签 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>…

Spigot 通过 BuildTools 构建 MineCraft Spigot 官方服务端文件

文章目录 从 Spigot 官方下载 BuildTools spigotmc / buildtools确保你有正确版本的 Java&#xff08;例如构建 1.20.2 的服务端一般需要有 Java17&#xff09;在 BuildTools.jar 同名文件夹打开 cmd 命令行&#xff08;点击红色圈圈区域输入 cmd 按 enter 即可&#xff09; …

【黑产攻防道03】利用JS参数更新检测黑产的协议破解

任何业务在运营一段时间之后都会面临黑产大量的破解。验证码和各种爬虫的关系就像猫和老鼠一样, 会永远持续地进行博弈。极验根据十一年和黑产博弈对抗的经验&#xff0c;将黑产的破解方式分为三类&#xff1a; 1.通过识别出验证码图片答案实现批量破解验证&#xff0c;即图片…

区块链技术的未来:去中心化应用和NFT的崛起

区块链技术正在以前所未有的速度改变着金融和数字资产领域。它的演进为去中心化应用和非替代性代币&#xff08;NFT&#xff09;的崛起提供了坚实的基础。在本文中&#xff0c;我们将深入探讨这一数字革命的关键方面&#xff0c;从区块链的基本原理到它如何改变金融领域&#x…

使用Jetpack Compose构建Flappy Musketeer街机游戏

使用Jetpack Compose构建Flappy Musketeer街机游戏 一步一步创建沉浸式移动游戏的指南 引言 Flappy Musketeer不仅是又一个移动游戏&#xff1b;它将令人上瘾的“轻点飞行”游戏玩法和引人入胜的视觉效果融合在一起&#xff0c;吸引玩家进入埃隆马斯克&#xff08;Elon Musk…

Transformer英语-法语机器翻译实例

依照Transformer结构来实例化编码器&#xff0d;解码器模型。在这里&#xff0c;指定Transformer编码器和解码器都是2层&#xff0c;都使用4头注意力。为了进行序列到序列的学习&#xff0c;我们在英语-法语机器翻译数据集上训练Transformer模型&#xff0c;如图11.2所示。 da…

网络协议--DNS:域名系统

14.1 引言 域名系统&#xff08;DNS&#xff09;是一种用于TCP/IP应用程序的分布式数据库&#xff0c;它提供主机名字和IP地址之间的转换及有关电子邮件的选路信息。这里提到的分布式是指在Internet上的单个站点不能拥有所有的信息。每个站点&#xff08;如大学中的系、校园、…