当前位置: 首页 > article >正文

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

源码地址:
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.kler.cn/news/342388.html

相关文章:

  • FreeRTOS和Systemview联合调试——M0内核
  • 使用Pytorch+Numpy+Matplotlib实现手写字体分类和图像显示
  • 【分布式微服务云原生】战胜Redis脑裂:深入解析与解决方案
  • Python中的Socket魔法:如何利用socket模块构建强大的网络通信
  • “国货户外TOP1”凯乐石签约实在智能,RPA助力全域电商运营自动化提效
  • 企业如何借力AI,提升人力资源管理的效率完成组织提效变革
  • processing像素画教程
  • 高防服务器为何有时难以防御CC攻击及其对策
  • 手机控车系统是一种高科技的汽车智能控制系统?
  • VR科技云展如何以沉浸式体验引领科技成果新展示
  • Linux使用Docker部署Paperless-ngx结合内网穿透打造无纸化远程办公
  • tcpdump深入浅出
  • Java | Leetcode Java题解之第470题用Rand7()实现Rand10()
  • 最新golang语言面试题总结(四)
  • RabbitMQ消息接收类Receiver
  • 细说QT各种线程锁的特点和用法
  • JAVA学习-练习试用Java实现“反转链表 II”
  • C#中,重载(overload) 重写(override)的应用说明
  • Ubuntu安装nvidia显卡驱动
  • [云] DockerCoins 练习笔记