使用 Iconfont

简介

为什么使用 iconfont? 兼容性好、种类多、多色等。在此不做过多介绍,请直接移步阿里巴巴-iconfont平台

效果

result

下载字体图标

直接去到阿里巴巴字体图标库搜索下载即可,简要操作流程是:搜索图标(例如篮球) -> 选择自己喜欢的图标添加入库 -> 点击页面右上角的购物车可以看到我们加入的图标 -> 添加至项目,如果没有项目到话可以新建一个 -> 在我到项目里面点击下载至本地 -> 解压。如果一切操作正常的话可以得到如下解压文件:download

选中红色区域的所有文件(这里面很多文件是不需要的,为了方便起见,我们全部复制即可,不需要的也不会被打包),复制到项目里面,一般放在目录 'static/icons' 或者 'assets/icons' 下面,如果没有的话可以新建目录,当然你也可以放到任意你喜欢的位置,只要引入的时候路径对即可,到此 iconfont 引入完毕。

PS: 本案文件目录为 '/static/icons'

引入G6

多种引入方式,请移步快速上手。PS: 本案例简单粗暴,通过CDN的方式引入。

  1. <script src="https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-3.2.0/build/g6.js"></script>

添加字体图标

引入方式可自行选择,下面为在 HTML 中引入的例子:

  1. <style>
  2. @import "/static/icons/iconfont.css";
  3. </style>

使用字体

  1. G6.registerNode('iconfont', {
  2. draw(cfg, group) {
  3. const {
  4. backgroundConfig: backgroundStyle,
  5. style,
  6. labelCfg: labelStyle,
  7. } = cfg;
  8. if (backgroundStyle) {
  9. group.addShape('circle', {
  10. attrs: {
  11. x: 0,
  12. y: 0,
  13. r: cfg.size,
  14. ...backgroundStyle,
  15. },
  16. });
  17. }
  18. const keyShape = group.addShape('text', {
  19. attrs: {
  20. x: 0,
  21. y: 0,
  22. fontFamily: 'iconfont', // 对应css里面的font-family: "iconfont";
  23. textAlign: 'center',
  24. textBaseline: 'middle',
  25. text: cfg.text,
  26. fontSize: cfg.size,
  27. ...style,
  28. },
  29. });
  30. const labelY = backgroundStyle ? cfg.size * 2 : cfg.size;
  31. group.addShape('text', {
  32. attrs: {
  33. x: 0,
  34. y: labelY,
  35. textAlign: 'center',
  36. text: cfg.label,
  37. ...labelStyle.style,
  38. },
  39. });
  40. return keyShape;
  41. },
  42. });
  43. const COLOR = '#40a9ff';
  44. const graph = new G6.TreeGraph({
  45. container: 'mountNode',
  46. width: 800,
  47. height: 600,
  48. modes: {
  49. default: ['collapse-expand', 'drag-canvas', 'drag-node'],
  50. },
  51. defaultNode: {
  52. backgroundConfig: {
  53. backgroundType: 'circle',
  54. fill: COLOR,
  55. stroke: 'LightSkyBlue',
  56. },
  57. shape: 'iconfont',
  58. size: 12,
  59. style: {
  60. fill: '#fff',
  61. },
  62. labelCfg: {
  63. style: {
  64. fill: COLOR,
  65. fontSize: 12,
  66. },
  67. },
  68. },
  69. // 布局相关
  70. layout: {
  71. type: 'compactBox',
  72. direction: 'LR',
  73. getId(d) {
  74. return d.id;
  75. },
  76. getHeight() {
  77. return 16;
  78. },
  79. getWidth() {
  80. return 16;
  81. },
  82. getVGap() {
  83. return 20;
  84. },
  85. getHGap() {
  86. return 60;
  87. },
  88. },
  89. });
  90. graph.edge(({ target }) => {
  91. const fill =
  92. target.get('model').backgroundConfig &&
  93. target.get('model').backgroundConfig.fill;
  94. return {
  95. shape: 'cubic-horizontal',
  96. color: fill || COLOR,
  97. label: target.get('model').relation || '',
  98. labelCfg: {
  99. style: {
  100. fill: fill || COLOR,
  101. fontSize: 12,
  102. },
  103. },
  104. };
  105. });
  106. const data = {
  107. isRoot: true,
  108. id: 'Root',
  109. label: '可疑人员王**',
  110. text: '&#xe622;', // 对应字体图标的Unicode码,
  111. style: {
  112. fill: 'red',
  113. },
  114. labelCfg: {
  115. style: {
  116. fill: 'red',
  117. },
  118. },
  119. backgroundConfig: null, // 自定义项,用于判读是否需要圆背景
  120. size: 30,
  121. children: [
  122. {
  123. id: 'SubTreeNode1',
  124. label: '**网咖',
  125. text: '&#xe605;',
  126. relation: '上网',
  127. children: [
  128. {
  129. id: 'SubTreeNode2',
  130. label: '多伦多',
  131. text: '&#xe64b;',
  132. },
  133. {
  134. id: 'id1',
  135. label: '小王',
  136. text: '&#xe622;',
  137. children: [
  138. {
  139. id: 'SubTreeNode1.2.1',
  140. label: '182****2123',
  141. text: '&#xe60d;',
  142. },
  143. {
  144. id: 'SubTreeNode4',
  145. label: '今晚在吗',
  146. text: '&#xe629;',
  147. },
  148. ],
  149. },
  150. ],
  151. },
  152. {
  153. id: 'SubTreeNode3',
  154. label: 'subway',
  155. text: '&#xe653;',
  156. children: [
  157. {
  158. id: 'SubTreeNode3.1',
  159. label: '王五',
  160. text: '&#xe622;',
  161. },
  162. {
  163. id: 'SubTreeNode3.2',
  164. label: '张三',
  165. text: '&#xe622;',
  166. },
  167. ],
  168. },
  169. {
  170. id: 'SubTreeNode5',
  171. label: '小花',
  172. relation: '老婆',
  173. text: '&#xe74b;',
  174. backgroundConfig: {
  175. fill: 'Coral',
  176. },
  177. style: {
  178. fill: '#fff',
  179. },
  180. labelCfg: {
  181. style: {
  182. fill: 'Coral',
  183. },
  184. },
  185. children: [
  186. {
  187. id: 'SubTreeNode1.2.1',
  188. label: '182****2123',
  189. text: '&#xe60d;',
  190. relation: '通话',
  191. backgroundConfig: {
  192. fill: 'Coral',
  193. },
  194. style: {
  195. fill: '#fff',
  196. },
  197. labelCfg: {
  198. style: {
  199. fill: 'Coral',
  200. },
  201. },
  202. },
  203. {
  204. id: 'SubTreeNode3.3',
  205. label: '凶器',
  206. text: '&#xe673;',
  207. relation: '指纹',
  208. backgroundConfig: {
  209. fill: 'Coral',
  210. },
  211. style: {
  212. fill: '#fff',
  213. },
  214. labelCfg: {
  215. style: {
  216. fill: 'Coral',
  217. },
  218. },
  219. },
  220. ],
  221. },
  222. {
  223. id: 'SubTreeNode6',
  224. label: '马航37*',
  225. relation: '乘坐',
  226. text: '&#xe610;',
  227. },
  228. ],
  229. };
  230. graph.data(data);
  231. graph.render();

注意事项

看了代码大家应该很清楚了,实质就是用了 text 图形,但有几个需要注意的地方:1、text的fontFamily必须和iconfont.css里面的font-family保持一致:download download 2、data 里面的 text 使用的是 Unicode,需要自行复制。 downloaddownload