Y轴刻度标签太长显示省略号,鼠标经过显示完整内容
? 效果:
如图因业务需求Y轴显示数值变化,且小数位要求比较高导致Y轴刻度会很长,而造成界面很丑。
在网上找到一些方式跟自己想要的效果不太一样,最后自己琢磨了一下实现上面的效果。
实现此功能分为两个步骤
- 将超出长度部分文字使用省略号隐藏
- 使用省略号隐藏比较简单,只需要在echarts的option内,将yAxis中的axisLabel配置即可,主要在formatter
-
triggerEvent: true, axisLabel: { margin: 25, interval: 1, fontFamily: ' Microsoft YaHei', fontWeight: 400, color: '#E5E5E5', align: 'center', formatter: function(params: number | string) { //标签输出形式 let val = params + ''; let newVal = ''; if (val.length > 5) { newVal = val.substring(0, 5) + '...'; } else { newVal = val + ' '; } return newVal; } },
- 鼠标经过Y轴刻度时显示完整刻度
-
- 这里需要主要两个地方,首先Y轴要响应和触发鼠标事件,需要将yAxis中的triggerEvent: true,
- 然后在初始化echart之后,创建mouseover和mouseout事件,并调用即可
-
drawChart(): void { let oldCharts: any = echarts.getInstanceByDom( document.getElementById('myChart') as HTMLElement ); if (oldCharts !== undefined) { oldCharts.dispose(); //销毁旧图表 } const chartDom: HTMLElement = document.getElementById( 'myChart' ) as HTMLElement; let initChart: any = echarts.init(chartDom); // params.initChart.clear(); //清空数据缓存(清空画布内容,实例还在) initChart.setOption(option); this.extension(initChart, domid); } /** * @description: echartsY轴鼠标经过显示完整刻度,离开隐藏 * @param {*} chart 需要触发的图表 * @param {*} domid 图表ID * @return {*} */ extension(chart: any, domid: string): void { //该div用来盛放文本显示内容的,方便对其悬浮位置进行处理 let chartDom = (document.getElementById(domid) as HTMLElement) .childNodes[1] as HTMLElement; chart.on("mouseover", function (param: any) { //注意这里,我是以Y轴显示内容过长为例,如果是x轴的话,需要改为xAxis if ( param.componentType == "yAxis" && param.targetType === "axisLabel" && param.value.length > 5 ) { //设置悬浮文本的位置以及样式 let offsetX = param.event.event.offsetX; let offsetY = param.event.event.offsetY; chartDom.innerText = param.value; chartDom.style.position = "absolute"; chartDom.style.left = offsetX + "px"; chartDom.style.top = offsetY - 30 + "px"; // chartDom.style.display = "block"; chartDom.style.padding = "5px"; chartDom.style.visibility = "visible"; chartDom.style.opacity = "1"; chartDom.style.boxShadow = " rgb(0 0 0 / 20%) 1px 2px "; chartDom.style.backgroundColor = "rgba(50, 50, 50, 0.7) "; chartDom.style.transition = `opacity 0.2s cubic-bezier(0.23, 1, 0.32, 1) 0s, visibility 0.2s cubic-bezier(0.23, 1, 0.32, 1) 0s, left 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0s, top 0.4s cubic-bezier(0.23, 1, 0.32, 1) 0s`; } }); chart.on("mouseout", function (params: any) { //注意这里,我是以Y轴显示内容过长为例,如果是x轴的话,需要改为xAxis if (params.componentType == "yAxis") { // chartDom.style.display = "none"; chartDom.style.visibility = "hidden"; chartDom.style.opacity = "0"; } }); }
PS:echarts插入canvas后会同时插入一个div作为tooltip提示框,我将Y轴的完整值通过此div显示,并设置样式,鼠标移入Y轴就会显示刻度和你设置的样式,但是可能会存在一些问题:
1.最开始我通过display控制dom显隐,在没有第一次触发tooltip的时候显示正常,但触发之后,div的样式就会被tooltip样式覆盖,它设置了透明度和visibility控制显隐,所以即使display:block也无法显示刻度,最后跟tooltip一样设置这两个属性。
2.因为上面说的样式覆盖问题,刚开始我设置的刻度样式比较简单,没有第一次触发tooltip的时候,刻度样式只有自己设置的那些,但鼠标移入tooltip之后就变成tooltip的样式,所以为了统一,我将刻度样式设置成跟tooltip类似,也可以通过option的调整tooltip样式
最后,肯定还有其它方式可以更好显示,根据需求修改即可