在 echarts 的 rich 中使用 iconfont 图标库图标作为 backgroundColor.image 值的方法

8 篇文章 0 订阅
1 篇文章 0 订阅

实现步骤

1、引入 iconfont.js。该脚本执行时,会在 body 下插入一个 svg 标签,标签下包含了图标库中的 svg 图标 path。

<script src="your/iconfont/path/iconfont.js"></script>

或者

import 'your/iconfont/path/iconfont.js'

2、获取 svg 的 dom 节点。注意,iconfont 的 svg 是插入到 body 下的。

cosnt svgDom = document.querySelector('body > svg')

3、 获取图标的描边路径,即 path 的 d 属性;以及 symbol 中的 viewBox 属性(注意:如果没有viewBox,最终可能显示的是空白图标)

const icon = 'icon-namexxx' // icon 是图标的名称,也就是iconfont中对应图标的名称
const svgViewBox = svgDom.querySelector(`#${icon}`)?.getAttribute('viewBox')
const svgPath = svgDom.querySelector(`#${item.icon} > path`)?.getAttribute('d')

4、拼接 svg 字符串,可动态设置颜色值 color

const color = '#ffffff'
const svgStr = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="${svgViewBox}" ><g><path d="${svgPath}" fill="${color}"/></g></svg>`

5、将svg字符串转换成 blob 流,并赋值给 HTMLImageElement 对象

img.src = URL.createObjectURL(new Blob([svgStr], {type: 'image/svg+xml'}))

6、使用 HTMLImageElement 对象显示图标
在这里插入图片描述

const chartOption = {
	// ...
	yAxis: {
		axisLabel: {
			rich: {
				styleName: {
					backgroundColor: { image: img }
				}
			}
		}
	}
	// ...
}

到这里大功告成,完成代码:

cosnt svgDom = document.querySelector('body > svg')

const icon = 'icon-namexxx' // icon 是图标的名称,也就是iconfont中对应图标的名称
const svgViewBox = svgDom.querySelector(`#${icon}`)?.getAttribute('viewBox') 
const svgPath = svgDom.querySelector(`#${item.icon} > path`)?.getAttribute('d')

const color = '#ffffff'
const svgStr = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="${svgViewBox}" ><g><path d="${svgPath}" fill="${color}"/></g></svg>`

img = new Image()
img.src = URL.createObjectURL(new Blob([svgStr], {type: 'image/svg+xml'}))

const chartOption = {
	// ...
	yAxis: {
		axisLabel: {
			rich: {
				styleName: {
					backgroundColor: { image: img }
				}
			}
		}
	}
	// ...
}

问题拓展

有时一个项目中,不止使用一个图标库,因此在body下不止一个svg,仍然用上面的方法可能无法获取到对应图标,因此需要将所有svg都获取下来,然后遍历。

const svgDomList = document.querySelectorAll('body > svg')
let img = null
const icon = 'icon-namexxx'
if(svgDomList && svgDomList.length > 0) {
	for(let i = 0; i < svgDomList.length; i++) {
		const svgDom = svgDomList[i]
	    const svgSymbol = svgDom.querySelector(`#${icon}`)
    	if(svgSymbol) {
        	const svgViewBox = svgDom.querySelector(`#${icon}`)?.getAttribute('viewBox')
            const svgPath = svgDom.querySelector(`#${icon} > path`)?.getAttribute('d')
            const svgStr = `<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="${svgViewBox}" >
                    <g><path d="${svgPath}" fill="${color}"/></g>
                </svg>`
            img = new Image()
            img.src = URL.createObjectURL(new Blob([svgStr], {type: 'image/svg+xml'}))
            break;
        }
	}
}

const chartOption = {
	// ...
	yAxis: {
		axisLabel: {
			rich: {
				styleName: {
					backgroundColor: { image: img }
				}
			}
		}
	}
	// ...
}
  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EChartsrich 特性可以实现在标签添加更多的样式,比如图标、颜色、字体等。而要给 rich 的元素添加点击事件,可以通过 `rich` 的 `events` 属性来实现。 具体来说,在 `rich` 添加一个元素时,可以在该元素的样式设置加入 `events` 属性,该属性的为一个对象,其可以定义 `click` 方法作为点击事件的回调函数。如下所示: ```javascript option = { xAxis: { type: 'category', data: ['A', 'B', 'C'] }, yAxis: { type: 'value' }, series: [{ name: 'series1', type: 'bar', data: [10, 20, 30], label: { show: true, position: 'top', distance: 10, formatter: '{a|{c}}{a|{unit}}\n{name|{b}}', rich: { a: { color: 'red' }, name: { color: '#999' }, unit: { color: '#999' }, icon: { backgroundColor: '#3399CC', width: 20, height: 20, borderRadius: 10, align: 'center', verticalAlign: 'middle', lineHeight: 20, fontSize: 14, text: '\ue602', color: '#fff', events: { click: function(params) { console.log('icon clicked:', params); } } } } } }] }; ``` 在上面的代码,我们在 `rich` 定义了一个名为 `icon` 的元素,并在其样式设置加入了 `events` 属性,该属性的为一个对象,其定义了一个 `click` 方法作为点击事件的回调函数。当用户点击该元素时,就会触发该回调函数,并输出参数 `params`,我们可以从该参数获取事件的信息。 需要注意的一点是,如果要在 `rich` 元素添加点击事件,那么需要在 `label` 设置 `formatter` 属性,并在该属性的引用 `rich` 的元素。这是因为 `rich` 的元素是作为标签的一部分来使用的。在上面的示例代码,我们在 `formatter` 引用了 `rich` 的 `a`、`name`、`unit` 和 `icon` 元素,以设置标签的样式和布局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值