【element-tiptap】如何引进系统中的字体?

news2024/11/25 22:40:56

源码地址:
https://github.com/Leecason/element-tiptap
源码中给出的字体如下
在这里插入图片描述
可以看到,咱们日常需要的黑体、微软雅黑等都没有,所以这篇文章来探索一下怎么加字体。
另外呢,肯定有小伙伴发现,这个按钮点击的时候,没有下拉框。我们先看一下这个组件的代码,对应的扩展地址为:
src/extensions/font-family.ts
组件是这个 src/components/MenuCommands/FontFamilyDropdown.vue
我摘录一下最关键的代码

<template>
  <el-dropdown placement="bottom" trigger="click" @command="toggleFontType">
    <command-button
      :enable-tooltip="enableTooltip"
      :tooltip="t('editor.extensions.FontType.tooltip')"
      :readonly="isCodeViewMode"
      icon="font-family"
    />[添加链接描述](https://element-plus.org/zh-CN/component/dropdown.html)
    <template #dropdown>
      <el-dropdown-menu class="el-tiptap-dropdown-menu">
      </el-dropdown-menu>
    </template>
  </el-dropdown>
</template>

可以看到,下拉框使用的是 element-plusdropdown 组件
我们去到官网看一看这个组件是怎么用的
dropdown

可以看到,.el-dropdown 里面要套一个 .el-dropdown-link 才行
在这里插入图片描述
command-button 是自定义的组件,并且是多个地方公用的组件,所以我们直接在这个组件里面增加一个父元素 div.el-dropdown-link
src/components/MenuCommands/CommandButton.vue

<template>
  <div class="el-dropdown-link">
    <el-tooltip
      :content="tooltip"
      :show-after="350"
      :disabled="!enableTooltip || readonly"
      effect="dark"
      placement="top"
    >
      <div :class="commandButtonClass" @mousedown.prevent @click="onClick">
        <v-icon :name="icon"/>
      </div>
    </el-tooltip>
  </div>
</template>

酱紫下拉框就阔以正常使用啦!!
下面这几个扩展其实都有这个问题,咱们在公共组件中修改,就可以一次性一网打尽!
在这里插入图片描述
你肯定会发现咱俩的菜单项怎么不一样,其实是因为我把所有的扩展都放到 Simple.vue 页面中了,并且有的不需要的也稍微删了一下,这个也不重要啦。

我们还是看一下字体列表的数据是怎么来的
还是在 src/components/MenuCommands/FontFamilyDropdown.vue 中的计算属性

fontFamilies() {
  const fontFamilyOptions = this.editor.extensionManager.extensions.find(
    (e) => e.name === 'fontFamily'
  )!.options;
  console.log("fontFamilyOptions")
  console.log(fontFamilyOptions)
  return fontFamilyOptions.fontFamilyMap;
},

看一下输出是什么样子的
在这里插入图片描述

我们回到 fontFamily 这个扩展的定义 src/extensions/font-family.ts

可以看到 fontFamilyMap 是引用的 src/utils/font-type.ts 文件中定义的数据

const DEFAULT_FONT_FAMILY_NAMES = [
  'Arial',
  'Arial Black',
  'Georgia',
  'Impact',
  'Tahoma',
  'Times New Roman',
  'Verdana',
  'Courier New',
  'Lucida Console',
  'Monaco',
  'monospace',
];

export const DEFAULT_FONT_FAMILY_MAP = DEFAULT_FONT_FAMILY_NAMES.reduce(
  (obj: { [key: string]: string }, type: string) => {
    obj[type] = type;
    return obj;
  },
  {}
);

那么,是不是在这里加上我们想要的字体名称就可以呢…
经过我的实验呢,发现加 宋体、黑体 这样的汉字是木有用的,但是但是,我们使用中文字体的英文表示法就好啦!
Mac OS的一些:
华文细黑:STHeiti Light [STXihei]
华文黑体:STHeiti
华文楷体:STKaiti
华文宋体:STSong
华文仿宋:STFangsong
儷黑 Pro:LiHei Pro Medium
儷宋 Pro:LiSong Pro Light
標楷體:BiauKai
蘋果儷中黑:Apple LiGothic Medium
蘋果儷細宋:Apple LiSung Light
Windows的一些:
新細明體:PMingLiU
細明體:MingLiU
標楷體:DFKai-SB
黑体:SimHei
宋体:SimSun
新宋体:NSimSun
仿宋:FangSong
楷体:KaiTi
仿宋_GB2312:FangSong_GB2312
楷体_GB2312:KaiTi_GB2312
微軟正黑體:Microsoft JhengHei
微软雅黑体:Microsoft YaHei
装Office会生出来的一些:
隶书:LiSu
幼圆:YouYuan
华文细黑:STXihei
华文楷体:STKaiti
华文宋体:STSong
华文中宋:STZhongsong
华文仿宋:STFangsong
方正舒体:FZShuTi
方正姚体:FZYaoti
华文彩云:STCaiyun
华文琥珀:STHupo
华文隶书:STLiti
华文行楷:STXingkai
华文新魏:STXinwei

由于我的电脑是mac,我就先实验一下 STFangsong 这个字体,直接加到数组中
在这里插入图片描述
确实,这样子是好使的,但是呢,能不能显示成中文呢?
改造一下 src/utils/font-type.ts 这个文件的代码,把中文的字体的中文名和英文名的对应关系定义好,然后也加到 默认字体 中

const DEFAULT_FONT_FAMILY_NAMES = [
  'Arial',
  'Arial Black',
  'Georgia',
  'Impact',
  'Tahoma',
  'Times New Roman',
  'Verdana',
  'Courier New',
  'Lucida Console',
  'Monaco',
  'monospace',
];

const ZH_FONT_FAMILY_MAPS = {
  华文细黑: 'STHeiti Light',
  华文黑体: 'STHeiti',
  华文楷体: 'STKaiti',
  华文宋体: 'STSong',
  华文仿宋: 'STFangsong',
  '丽黑 Pro': 'LiHei Pro Medium',
  '丽宋 Pro': 'LiSong Pro Light',
  標楷体: 'BiauKai',
  苹果丽中黑: 'Apple LiGothic Medium',
  苹果丽细宋: 'Apple LiSung Light'
};

const DEFAULT_FONT_FAMILY_MAP = DEFAULT_FONT_FAMILY_NAMES.reduce(
  (obj: { [key: string]: string }, type: string) => {
    obj[type] = type;
    return obj;
  },
  {}
);
// 将ZH_FONT_FAMILY_MAPS 加入到默认字体中
Object.assign(DEFAULT_FONT_FAMILY_MAP, ZH_FONT_FAMILY_MAPS);
export default DEFAULT_FONT_FAMILY_MAP;

📢📢📢 此时会报错
在这里插入图片描述
原因是咱们导出的方式由之前的命名导出改为了默认导出,那么咱们在导入的时候,就不能再使用花括号进行导入
src/extensions/font-family.ts

import DEFAULT_FONT_FAMILY_MAP from '@/utils/font-type';

输出一下此时的字体数据
在这里插入图片描述
但是列表中还是都是英文,原因是模版中遍历的时候并没有使用数据 fontFamilies 中的 key ,咱们修改一下模版就可以了
v-for在遍历对象的时候,顺序是 value, key
src/components/MenuCommands/FontFamilyDropdown.vue
在这里插入图片描述

这样就成功了!!
在这里插入图片描述
此时可以看到这个菜单太长了,可以加个样式限制一下最大高度
可以在这里加一个文件,写自定义的样式
在这里插入图片描述

.el-tiptap-dropdown-menu {
  max-height: 400px;
  overflow-y: auto;
}

然后我们需要看一下其他的样式文件是怎么被引入的
在这里插入图片描述
原来是在这里,模仿!

@import '../styles/custom.scss';

成功!
在这里插入图片描述
但是其中有几个是没效果的,可能是因为我电脑上没有这种字体,有需要的同学可以搜一下怎么下载。
我是mac电脑,其实是可以通过字体册查看所有支持的字体
在这里插入图片描述

然后我们可以加一些比较好看的字体,比如下面这个卡哇伊的娃娃体
在这里插入图片描述
标出来的地方,就是该字体对应的英文标识符,有的字体没有,就写汉字就行。然后从这里我发现,上面的字体不起作用,是因为英文标识符不正确!所以大家以自己电脑上给出的标识符为准。
在这里插入图片描述

const ZH_FONT_FAMILY_MAPS = {
  华文黑体: 'STHeiti',
  华文楷体: 'STKaiti',
  华文宋体: 'STSong',
  华文仿宋: 'STFangsong',
  标楷体: 'BiauKai',
  '娃娃体-繁': 'DFWaWaTC-W5',
  '娃娃体-简': 'DFWaWaSC-W5',
  '行楷-简': '行楷-简',
  '翩翩体-简': '翩翩体-简',
  蘋果儷中黑: 'LiGothicMed'
};

参考文章:css设置中文字体后样式无效解决方法

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ssm资产管理信息系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码请私聊我 需要定制请私聊 目录 摘要 I Abstract II 1 绪论 - 1 - 1.1 研究背景与意义 - 1 - 1.1.1 研究背景 - 1 - 1.1.2 研究意义 …

jQuery——区别onload和ready

区别&#xff1a;window.onload 与 $&#xff08;document&#xff09;. ready&#xff08;&#xff09; window.onload 包括页面的图片加载完后才会回调&#xff08;晚&#xff09;只能有一个监听回调 $&#xff08;document&#xff09;. ready&#xff08;&#xff09; 等同…

echarts图例右侧竖向排列

实操链接戳这里哈 left代表图例在水平放置的位置&#xff0c;有left、center、right top代表图例在垂直方向的位置&#xff0c;有top、middle、bottom width是最主要的&#xff0c;当设置的宽度比较小时&#xff0c;才会迫使图例换行&#xff0c;从而形成竖直排列的现像。 lege…

MySQL:小练习

安装MySQL并且创建库和表 一&#xff0c; windows采用zip安装MySQL1. 卸载已有的MySQL2. 下载zip格式3. 解压缩4. 配置环境变量5. 创建配置文件6. 初始化mysql服务 二&#xff0c; 新建产品库mydb6_product&#xff0c;新建三张表 一&#xff0c; windows采用zip安装MySQL 1. …

【conda】创建、激活、删除虚拟环境

前言一、创建虚拟环境二、删除虚拟环境总结 前言 主要是记录一下步骤 一、创建虚拟环境 地址栏输入cmd&#xff0c;唤起命令符栏目&#xff0c;就可以在指定目录下创建虚拟环境了。 这样方便日后在pycharm直接配置虚拟环境。 conda create -n yolo5-lite python3.9 -y简单来说…

书店仓库管理系统 (论文+源码)-kaic

摘 要 仓库是储存货物的核心&#xff0c;是现代社会物质生产的必要条件。为了保障货物的 质量和准备货物进入市场的工作&#xff0c;一个良好的仓库布局环境尤为重要。例如书店仓库管理中的功能分区不够清晰、书本摆放混乱、通道设计不合理等。因此&#xff0c;我们需要对这些…

3D医学影像开发入门<二>:VS2019+Qt5.15.2+VTK9.3.1编译及环境配置

VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的、跨平台的三维可视化开发库&#xff0c;用于处理和可视化三维数据。它提供了一系列算法和工具&#xff0c;用于创建、操作和渲染复杂的三维图形&#xff0c;并支持多种数据表示方式&#xff0c;包括点、线、面、…

传值与传址

目录 前言1.基础2.实际计算 前言 这是在软考中软件设计师有关的考点&#xff0c;关于程序设计基础——传值与传址 1.基础 传值和传址是两种不同的参数传递方式。 传值&#xff08;传递值&#xff09;是指将参数的副本传递给函数或方法。在函数或方法中对参数的任何修改不会影…

WebGL 入门学习

1. WebGL是什么&#xff1f; WebGL&#xff08;Web Graphics Library&#xff09;是一种JavaScript API&#xff0c;它允许你在不需要安装任何额外插件的情况下&#xff0c;直接在浏览器中渲染高性能的2D和3D图形。WebGL利用了用户的图形处理单元&#xff08;GPU&#xff09;来…

竹壳天气时钟(二)第二阶段任务已完成

一、简介 准备用基于esp8266的nodemcu开发板做一个天气时钟。 一步一步记录代码编写过程。 竹壳天气时钟 Bamboo shell weather clock 使用基于esp8266的NodeMCU制作。 计划用竹子做最后成品的外壳&#xff0c;所以才有了这个名称。 第一阶段任务&#xff1a; 1.开启混合模式&…

【吊打面试官系列-微服务面试题】单片,SOA 和微服务架构有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【单片&#xff0c;SOA 和微服务架构有什么区别&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 单片&#xff0c;SOA 和微服务架构有什么区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 …

基于SSM框架学籍管理系统的设计与实现

我 | 在这里 ⭐ 全栈开发攻城狮、全网10W粉丝、2022博客之星后端领域Top1、专家博主。 &#x1f393;擅长 指导毕设 | 论文指导 | 系统开发 | 毕业答辩 | 系统讲解等。已指导60位同学顺利毕业 ✈️个人公众号&#xff1a;乡下小哥编程。回复 Java全套视频教程 或 前端全套视频教…

DataStore存储数据+加上加密

如果没有使用SP来存储数据&#xff0c;而是用datastore的话 但是datastore存储是个文件&#xff0c;所以我们需要再加密。 先展示没有加密的存储方式&#xff0c;然后再结合上一节的加密&#xff0c;再将存储的数据进行加密 使用datastore存储数据 添加依赖库 implementat…

心血之作!独家原创改进班翠鸟优化算法IPKO!2024年新算法!效果极佳!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ ​历经数月&#xff0c;今天又给小伙伴们带了一期独…

IRP学习理解

IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时&#xff0c;应用程序会发出I/O请求&#xff0c;操作系统将相应的I/O请求转换成相应的IRP&#xff0c;不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息&#xff0c…

【文档智能】文本文字识别、公式识别、表格文字识别核心算法及思路及实践-DBNet、CRNN、TrOCR

前言 OCR技术作为文档智能解析链路中的核心组件之一&#xff0c;贯穿整个技术链路&#xff0c;包括&#xff1a;文字识别、表格文字识别、公式识别&#xff0c;参看下面这张架构图&#xff1a; 前期介绍了很多关于文档智能解析相关核心技术及思路&#xff0c;本着连载的目的&a…

特斯拉“We, Robot“发布会:Robotaxi亮相,马斯克兑现承诺

在加利福尼亚州伯班克的华纳兄弟电影制片厂&#xff0c;特斯拉举办了以"We&#xff0c; Robot"为主题的发布会&#xff0c;这场活动吸引了全球科技爱好者的目光。特斯拉在此次发布会上展示了其在自动驾驶领域的最新突破&#xff0c;特别是公司CEO埃隆马斯克多年来承诺…

麒麟桌面版v10 SP1以docker方式安装达梦数据库

安装docker 0.切换root用户&#xff08;可以不切换&#xff0c;但要注意权限问题&#xff0c;我是用root&#xff09; ymym-pc:~/桌面$ whoami ym ymym-pc:~/桌面$ sudo -i rootym-pc:~# whoami root rootym-pc:~# 1.查看系统版本 [rootlocalhost opt]# cat /etc/os-release…

AI知识库如何提升服装电商的运营效率

随着人工智能技术的飞速发展&#xff0c;AI知识库在服装电商领域的应用日益广泛。AI知识库作为一个集成了海量数据、通过高级算法进行智能分析和处理的信息系统&#xff0c;正在深刻改变服装电商的运营模式和效率。本文将详细阐述AI知识库在商品信息管理、库存管理、订单处理等…

C语言题目练习4

这一篇博客继续在算法题的海洋里面遨游~ 链表的中间结点 链表的中间结点&#xff1a; https://leetcode.cn/problems/middle-of-the-linked-list/description/ 这个题我们可以怎么办呢&#xff1f;这里依然提供两个思路 思路1 既然是中间结点我们是不是可以直接第一次循环求…