首页 > 其他分享 >Fabric.js 使用自定义字体

Fabric.js 使用自定义字体

时间:2023-10-27 17:33:34浏览次数:37  
标签:文本 Fabric 自定义 js 字体 font 加载

本文简介

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


如果你使用 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 的详细用法可以点击上面的官网查阅。

简单的用法如下:

<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 onclick="setFont('douyu')">斗鱼</button>
<button onclick="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两个版本,操作起来非常简单。有需要的工友可以打开链接获取。



代码仓库

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

Fabric.js 使用自定义字体



推荐阅读

标签:文本,Fabric,自定义,js,字体,font,加载
From: https://www.cnblogs.com/k21vin/p/17792848.html

相关文章

  • 我与Vue.js 2.x 的七年之痒
    ——过去日子的回顾(这是个副标题)——其实这是篇广告软文(这是个副副标题) 以下是一些牢骚和感悟,不感兴趣的可以滑倒最下面,嘻嘻。每每回忆起从前,就感觉时间飞逝,真切的感受到了那种课本中描述的白驹过隙。和很多人发生的,经历的很多事情,就好像昨天一样,但是仔细的思......
  • Springboot+Mybatis+Mybatisplus 框架中增加自定义分页插件和sql 占位符修改插件
    一、Springboot简介springboot是当下最流行的web框架,SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,让这些框架集成在一起变得更加简单,简化了我......
  • Django和Vue.js是两种不同的框架,它们各自有自己的特点和用途¹。 **Django**¹: - Dja
    Django和Vue.js是两种不同的框架,它们各自有自己的特点和用途¹。**Django**¹:-Django是一个开放源代码的PythonWeb应用框架¹。-它采用了MTV(模型,视图,模板)的软件设计模式¹。-Django可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序¹。-Django还包含许多功能......
  • js rsa
    $0=undefined;varpy="0123456789abcdefghijklmnopqrstuvwxyz";functionv0(t){returnpy.charAt(t)}functionhy(t,e){returnt&e}functionvs(t,e){returnt|e}functionxc(t,e){returnt^e}functionwc(t,......
  • Toast自定义颜色抛出空指针异常
    首页沸点课程直播活动竞赛商城APP插件 创作者中心 会员登录 注册  实战Android升级目标版本到30过程中遇到的问题及解决办法开发者如是说2021-11-162,006阅读5分钟 专栏: Android开发文章合集 ......
  • 移动端H5使用pdf.js预览
    1.下载pdf.js文件GettingStarted(mozilla.github.io) 2.将下载的文件放进uniapp项目中 3.创建预览页面 代码:<template>   <view>      <web-view:src="allUrl"></web-view>   </view></template><script>   importrequestfro......
  • ?Mybatis多表查询(1:1、1:N、N:N),MP多表查询(自定义SQL)
    Mybatis多表关联查询Gitee地址:https://gitee.com/zhang-zhixi/mybatis-tables-query.git数据表:oracleCREATETABLE"T_ORDER"("ID"NUMBERNOTNULL,"F_ORDER_TIME"DATE,"F_TOTAL"VARCHAR2(255BYTE),"F_USER_ID"NU......
  • graalvm 23.1.0 独立nodejs docker 镜像&简单试用
    graaljsdocker镜像很简单就是下载官方包,集成下,然后进行一些简单的配置DockerfileFROMdebian:bullseye-backportsLABELauthor="rongfengliang"LABELemail="[email protected]"WORKDIR/opt/RUN/bin/cp/usr/share/zoneinfo/Asia/Shanghai/etc/localtime\&&am......
  • Revit 自定义事务进行自动管理事务DBTrans实现
    第一步:自定义事务对象自定义事务对象///<summary>///自定义事务///</summary>publicclassDBTrans:IDisposable{#region私有字段privatebooldisposedValue;privatebool_commit;///<summary>......
  • FastAPI学习-14. JSONResponse 返回JSON内容
    当你创建一个 FastAPI 路径操作 时,你可以正常返回以下任意一种数据:dict,list,Pydantic模型,数据库模型等等。FastAPI 默认会使用 jsonable_encoder 将这些类型的返回值转换成JSON格式,默认情况下会以content-type:application/json格式返回在有些情况下,我们需要在路径操作......