Echarts title过长bug解决方案

ECharts 中的标题(title)默认是居中显示在图表顶部,并且如果标题过长超出了图表宽度,会被裁剪掉而不会自动换行或滚动显示。这个功能实现的底层源码主要涉及到 ECharts 渲染引擎和布局算法的实现。

具体来说,ECharts 中的渲染引擎使用了 Canvas 和 SVG 两种技术进行图表绘制。对于标题的绘制,ECharts 会先根据标题文字的长度和字体大小等参数计算出标题所占用的宽度和高度,然后根据图表的宽度和高度以及标题的位置等参数进行布局。如果标题宽度超出了图表宽度,ECharts 会将超出部分直接裁剪掉,不会自动换行或滚动显示。

如果需要让标题自动换行或滚动显示,可以通过修改 ECharts 的源码来实现。可以在 ECharts 的 text.js 文件中的 Text.prototype.drawBackground 方法进行修改,在该方法中添加相应的逻辑来实现标题文本的换行或滚动显示。例如,可以使用 CSS3 的 text-overflow 属性实现标题文本的省略号显示和鼠标悬停提示,或者使用 JavaScript 实现标题文本的滚动显示。

具体情况如下图所示:

解决方案一:设置title超出长度的内容换行展示

设置textStyle属性中overflow为break或breakAll

arduino 复制代码
title: {

    text: 'Temperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming Week',

    textStyle: {

      width: 200,

      overflow: 'breakAll' // 或break

    }

  },

具体展示效果如下:

带来的新问题:如果当title过长时,无论怎么设置标题的展示宽度,换行展示的文本仍要多行才能展示开,给用户的体验很差。

解决方案二:设置title以省略号填充,当鼠标mouseover时,展示全部内容

  1. 省略号填充

设置textStyle属性中overflow为truncate

arduino 复制代码
title: {

    text: 'Temperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming WeekTemperature Change in the Coming Week',

    textStyle: {

      width: 200,

      overflow: 'truncate' // 超出width宽度时,truncate为以省略号填充

    }

  },

效果如下所示:

  1. 当鼠标mouseover时,展示全部内容。

由于title属性无formatter自定义事件,所以只能通过图表实例对象上的getZr函数获取mouseover事件,判断移入标题时,展示完整标题DOM。(对应的鼠标事件大致有mousemove、click、dbclick、mouseover、mousedown、mouseup、globalout等)注:需要开启title的triggerEvent:true,表示支持标题开启事件处理

javascript 复制代码
chart.getZr().on('mouseover', function(params: Object)) {

    // 通过target判断移入的是否为对应的标题,这里可以打印出params.target对象进行自己查阅

    if(params.target && params.target.xxx) {

            // 展示DOM时,可以根据title的坐标点(params.target.offsetX,params.target.offsetY),调整展示DOM的位置
            // 此处不能return,因为该函数是void类型
            控制展示    <div>对应的完整标题的DOM结构</div>  

    }

}
  1. 当鼠标mouseout时,隐藏对应DOM
javascript 复制代码
chart.getZr().on('mouseout', function(params: Object)) {

    // 执行相应的隐藏操作

}

具体效果类似ElementPlus中tooltip组件

解决方案三:将title提出来,单独作为一个DOM

将title提出来,单独作为一个DOM,不放入Echarts的canvas结构中,搭配ElementPlus的tooltip组件实现超出长度悬浮展示,也可以单独用div标签实现。以下是单独用div标签实现逻辑。

css 复制代码
<div class="text">

    超出宽度的内容默认是用省略号填充,鼠标悬浮时,展示全部的内容

</div>

.text {

    width: 100px;

    overflow: hidden;

    white-space: nowrap;

    text-overflow: ellipsis;

}

.text:hover::after {

    position: absolute;

    content: '超出宽度的内容默认是用省略号填充,鼠标悬浮时,展示全部的内容';

    left: 0px;

    top: 0px;

}

效果如下:

如果还有其他实现方案,欢迎大家补充!

相关推荐
程序软件分享4 小时前
多语言DAPP综合盘交易所系统源码搭建剖析
vue.js·金融·开源
路光.8 小时前
Vue2升级Vue3处理原 UMD/CommonJS 打包文件,不是标准 ESM
前端·javascript·vue.js·vue3
shmily麻瓜小菜鸡12 小时前
前端“伪防盗链”方案
前端·javascript·vue.js·bootstrap·echarts
MrDJun14 小时前
分享一款免费实用的网页变动监控工具:PageWatch.tech
前端·javascript·vue.js
浅水壁虎1 天前
vue基础(第二章 )
前端·javascript·vue.js
腻害兔1 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:CRM 客户关系模块深度解析——从线索到回款,一套完整的 B2B 销售闭环是怎么搭的?
java·前端·javascript·vue.js·产品经理·ai编程
m0_547486661 天前
《Vue.js + uni-app全栈开发从入门到实践 》全套PPT课件2026版
vue.js·uni-app
达子6661 天前
第10章_HarmonyOs开发图解 用JS开发UI
vue.js
奶糖 肥晨1 天前
想return数据 返回的确是函数问题处理
vue.js
无巧不成书02181 天前
Vue+Vue-CLI全平台零基础搭建教程
前端·javascript·vue.js·vue·前端开发·vue-cli·前端环境搭建