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;

}

效果如下:

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

相关推荐
FungLeo11 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
ruanno_top15 小时前
选中一项后,焦点掉回了页面顶部:三个弹层的焦点还原
vue.js
tryCbest17 小时前
Vue3——第 17 篇:模板引用(ref)与组件实例——操作 DOM 的正确姿势
vue.js·前端搭建
头发还在的女程序员18 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_201018 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计
梯度下降者1 天前
Nuxt框架
vue.js·服务端渲染·全栈开发·混合渲染·nuxt框架
yuyuxun11 天前
协同过滤的校园二手物品智能推荐系统的设计与实现 毕业设计-附源码40082
javascript·vue.js·spring boot·python·数据分析·django·课程设计
FungLeo2 天前
成为全栈·Vue 管理后台篇·编辑器图片上传:从文件选择到文章附件关联
前端·vue.js·编辑器·markdown·文件上传·formdata·附件管理
码云社区2 天前
智慧物业系统选型指南:房屋档案、账单管理与报修协作
前端·javascript·vue.js·智慧物业
ruanno_top2 天前
表单重置后,验证码还显示已通过:Vue 受控组件的 3 种假同步
vue.js