经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » Echarts » 查看文章
echarts X轴类目名太长时隐藏,hover时显示全部
来源:cnblogs  作者:南风晚来晚相识  时间:2024/4/11 10:46:07  对本文有异议

echarts图表X轴

  1. 在柱状图中,X轴类目名如果数据太长;
  2. echarts会默认进行隐藏部分字段;
  3. 如果我们想让每一个类目名都显示出来,需要进行额外的处理

X轴类目名太长时,默认只显示一部分类目名

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>4.9.0</title>
  8. <script src="https://cdn.staticfile.net/echarts/4.9.0-rc.1/echarts-en.common.js"></script>
  9. </head>
  10. <body>
  11. <div style="width: 400px;height: 300px;"></div>
  12. <script>
  13. let myChart = echarts.init(document.querySelector('div'))
  14. let colors = ['#4C98FB', '#83CCE7', '#26C7C8', '#73DEBD'];
  15. let option = {
  16. xAxis: {
  17. type: 'category',
  18. data: ['我是字段1cccccccc', '我是字段2', '我是字段3', '我是字段4', '我是字段5', '我是字段6', '我是字段7']
  19. },
  20. yAxis: {
  21. type: 'value'
  22. },
  23. series: [
  24. {
  25. data: [120, 200, 150, 80, 70, 110, 130],
  26. type: 'bar'
  27. }
  28. ]
  29. };
  30. myChart.setOption(option);
  31. </script>
  32. </body>
  33. </html>

分析原因

  1. 通过上面的现象,我们发现:
  2. 展示不出来的原因是水平标签过多导致;
  3. 我们如果可以让它倾斜的话,说不定可以全部展示出来;
  4. 我们可以使用 xAxis下的 axisLabel中的 rotate属性来解决;
  5. rotate:刻度标签旋转角度;这个值在 90,-90】的范围类
  6. 在类目轴的类目标签显示不下的时候可以通过旋转防止标签之间重叠。

使用倾斜角度让每一个类目名显示出来

  1. xAxis: {
  2. type: 'category',
  3. data: ['我是字段1cccccccc2', '我是字段2', '段3', '我是字段4', '我是字段5', '我', '我是字段7'],
  4. axisLabel: {
  5. interval:0,
  6. rotate:-20 // 表示倾斜的角度
  7. }
  8. },

interval这个属性的简单介绍

  1. interval:坐标轴刻度标签的显示间隔,在类目轴中有效。
  2. 默认会采用标签不重叠的策略显示标签。
  3. 可以设置成0表示强制显示所有标签。
  4. 如果设置为 1,表示『隔一个标签』
  5. 可以用数值表示间隔的数据,也可以通过回调函数控制。
  6. 回调函数格式如下:
  7. interval:(index:number, value: string) => {
  8. // index表示该类目名的下标
  9. // string表示该类目名
  10. console.log(index,string)
  11. return 1
  12. },
  13. 如果返回的是true,表示显示该类目名;
  14. 也就是说:可以返回数字或者布尔值
  1. let option = {
  2. xAxis: {
  3. type: 'category',
  4. axisLabel: {
  5. interval:2, // x轴间隔2个类目名
  6. },
  7. data: ['我是1', '我是2', '我是3', '我是4', '我是5', '我是6', '我是7']
  8. },
  9. }

换行\n来处理这个问题

  1. 我们通过倾斜可以完全的把这个问题处理了;
  2. 可是有些时候,我们ui不想倾斜;那还有其他办法吗?可以换行
  3. 换行的话我们有两种方式;
  4. 1种:直接在data中通过\n换行
  5. 不推荐第1种这样的方式去做;是因为如果图表还有tooltip的话,会影响。
  6. 2种:在formatter函数中去处理
  1. xAxis: {
  2. type: 'category',
  3. data: ['我是\n字段1', '我是\n字段2', '段3', '我是\n字段4',
  4. '我是\n字段5', '我是\n字段6', '我是\n字段7'
  5. ],
  6. },

在data中通过\n换行会在 tooltip 会产生一个空格【不推荐有有副作用】

  1. tooltip: {
  2. // 使用formatter回调函数自定义显示内容
  3. formatter: function (params) {
  4. // params是包含数据信息的对象
  5. return params.name + ': ' + params.value;
  6. }
  7. },
  8. xAxis: {
  9. type: 'category',
  10. data: ['我是\n字段1', '我是\n字段2', '段3', '我是\n字段4',
  11. '我是\n字段5', '我是\n字段6', '我是\n字段7'
  12. ],
  13. },

通过 axisLabel中的formatter函数来换行 【推荐】没有副作用

  1. 我们可以通过xAxis下的axisLabel下的formatter函数来进行换行,
  2. 这样做不会改变原始数组,tooltip也不会出现任何问题;
  3. 如果像上面那样做;改变原始数据;
  1. tooltip: {
  2. // 使用formatter回调函数自定义显示内容
  3. formatter: function (params) {
  4. // params是包含数据信息的对象
  5. return params.name + ': ' + params.value;
  6. }
  7. },
  8. xAxis: {
  9. interval: 0,
  10. type: 'category',
  11. data: ['我是字段1', '我是字段2', '我是字段3',
  12. '我是字段4', '我是字段5', '我是字段6', '我是字段7'],
  13. axisLabel: {
  14. formatter: function (params) {
  15. console.log('x',params)
  16. return params.substring(0,2) + '\n' + params.substring(2)
  17. }
  18. }
  19. },

超出进行隐藏部分名称,hover显示全部

  1. 现在我们要做这样一个效果,
  2. X轴中的类目名默认显示2个字,超出部分隐藏,hover的时候显示全部;
  3. 我们需要使用到echarts中的 mouseover 事件;
  4. 同时设置xAxis中的triggerEventtrue
  5. xAxis: {
  6. triggerEvent: true,
  7. interval: 0,
  8. type: 'category',
  9. ...其他配置项...
  10. }
  11. 如果我们不设置triggerEvent: true鼠标移入X轴的类名不会被触发
  12. myChart.on('mouseover', (e) => {
  13. console.log('鼠标移入X轴的类名不会被触发',e)
  14. })

实现的思路

  1. 我们需要动态创建一个dom节点,通过createElement来实现
  2. 注册鼠标移入事件 myChart.on('mouseover',(e)=>{ })
  3. 通过e.event可以拿到offsetXoffsetY
  4. 紧接着将这个元素赋值(X轴类的全名称),添加到html页面中
  5. 鼠标的移出事件 myChart.on('mouseout',(e)=>{ })
  1. let option = {
  2. xAxis: {
  3. // X轴的类目名必须设置这个属性,移入事件才会被触发
  4. triggerEvent: true,
  5. interval: 0,
  6. type: 'category',
  7. data: ['我是字段111111', '我是字段222222', '我是字段33333', '我是字段4', '我是字段5', '我是字段6', '我是字段7'],
  8. axisLabel: {
  9. formatter: function (params) {
  10. return params.substring(0,2) + '...'
  11. }
  12. }
  13. },
  14. ... 其他配置项
  15. }
  16. myChart.setOption(option);
  17. myChart.on('mouseover', (e) => {
  18. console.log('鼠标移入',e)
  19. if(e.componentType === "xAxis"){
  20. // 我们这里先判断一个创建的dom节点是否存在
  21. let tipNameDom = document.getElementById('tipNameDom')
  22. console.log(1, tipNameDom)
  23. // 如果不存在我们创建一个dom节点
  24. if(!tipNameDom){
  25. // 创建一个元素
  26. var createDivElement = document.createElement('div')
  27. // 给这个元素设置属性
  28. createDivElement.setAttribute('id', 'tipNameDom')
  29. // // 设置元素的位置
  30. createDivElement.style.display = 'block'
  31. createDivElement.style.position = 'absolute'
  32. // 获取当前位置
  33. createDivElement.style.top = e.event.offsetY + 15 + 'px'
  34. createDivElement.style.left = e.event.offsetX - 10 + 'px'
  35. // 这里需要使用 innerHTML,因为我们设置了一样html的属性
  36. createDivElement.innerHTML = e.value
  37. // document.querySelector('body').appendChild(createDivElement)
  38. document.querySelector('body').appendChild(createDivElement)
  39. }else {
  40. tipNameDom.style.display = 'block'
  41. tipNameDom.style.position = 'absolute'
  42. // 获取当前位置
  43. tipNameDom.style.top = e.event.offsetY + 15 + 'px'
  44. tipNameDom.style.left = e.event.offsetX - 10 + 'px'
  45. // 这里需要使用 innerHTML,因为我们设置了一样html的属性
  46. tipNameDom.innerHTML = e.value
  47. }
  48. }
  49. })
  50. // 移入事件如果被多次触发,则hover的时候无法显示全部
  51. myChart.on('mouseout', function(params) {
  52. console.log('移除元素',params )
  53. if (params.componentType === 'xAxis') {
  54. let elementDiv = document.querySelector('#tipNameDom')
  55. console.log('elementDiv', elementDiv)
  56. elementDiv.style.display = 'none'
  57. }
  58. })

是不是这样就OK了?

  1. 其实,并不是的;
  2. 如果小伙伴们多次移入移出;
  3. 偶尔会出现光标明明是移入的状态,但是类目名并没有全部显示出来;
  4. 此时已发现了移入事件被多次触发;
  5. 怎么解决这个问题呢?
  6. 目前的我,并不知道如何去解决。我感觉是echartsbug;
  7. 如果知道的大佬;可以解答一下,万分感激;


全部代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>4.9.0</title>
  8. <!-- <script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script> -->
  9. <script src="https://cdn.staticfile.net/echarts/4.9.0-rc.1/echarts-en.common.js"></script>
  10. <script>
  11. window.onload =function (){
  12. let myChart = echarts.init(document.querySelector('.echars'))
  13. let colors = ['#4C98FB', '#83CCE7', '#26C7C8', '#73DEBD'];
  14. let option = {
  15. tooltip: {
  16. // 使用formatter回调函数自定义显示内容
  17. formatter: function (params) {
  18. // params是包含数据信息的对象
  19. return params.name + ': ' + params.value;
  20. }
  21. },
  22. xAxis: {
  23. // X轴的类目名必须设置这个属性,移入事件才会被触发
  24. triggerEvent: true,
  25. interval: 0,
  26. type: 'category',
  27. data: ['我是字段111111', '我是字段222222', '我是字段33333', '我是字段4', '我是字段5', '我是字段6', '我是字段7'],
  28. axisLabel: {
  29. formatter: function (params) {
  30. return params.substring(0,2) + '...'
  31. }
  32. }
  33. },
  34. yAxis: {
  35. type: 'value'
  36. },
  37. series: [
  38. {
  39. data: [120, 200, 150, 80, 70, 110, 130],
  40. type: 'bar'
  41. }
  42. ]
  43. };
  44. myChart.setOption(option);
  45. myChart.on('mouseover', (e) => {
  46. console.log('鼠标移入',e)
  47. if(e.componentType === "xAxis"){
  48. // 我们这里先判断一个创建的dom节点是否存在
  49. let tipNameDom = document.getElementById('tipNameDom')
  50. console.log(1, tipNameDom)
  51. // 如果不存在我们创建一个dom节点
  52. if(!tipNameDom){
  53. // 创建一个元素
  54. var createDivElement = document.createElement('div')
  55. // 给这个元素设置属性
  56. createDivElement.setAttribute('id', 'tipNameDom')
  57. // // 设置元素的位置
  58. createDivElement.style.display = 'block'
  59. createDivElement.style.position = 'absolute'
  60. // 获取当前位置
  61. createDivElement.style.top = e.event.offsetY + 15 + 'px'
  62. createDivElement.style.left = e.event.offsetX - 10 + 'px'
  63. // 这里需要使用 innerHTML,因为我们设置了一样html的属性
  64. createDivElement.innerHTML = e.value
  65. // document.querySelector('body').appendChild(createDivElement)
  66. document.querySelector('body').appendChild(createDivElement)
  67. }else {
  68. tipNameDom.style.display = 'block'
  69. tipNameDom.style.position = 'absolute'
  70. // 获取当前位置
  71. tipNameDom.style.top = e.event.offsetY + 15 + 'px'
  72. tipNameDom.style.left = e.event.offsetX - 10 + 'px'
  73. // 这里需要使用 innerHTML,因为我们设置了一样html的属性
  74. tipNameDom.innerHTML = e.value
  75. }
  76. }
  77. })
  78. // 移入事件如果被多次触发,则hover的时候无法显示全部
  79. myChart.on('mouseout', function(params) {
  80. console.log('移除元素',params )
  81. if (params.componentType === 'xAxis') {
  82. let elementDiv = document.querySelector('#tipNameDom')
  83. console.log('elementDiv', elementDiv)
  84. elementDiv.style.display = 'none'
  85. }
  86. })
  87. }
  88. </script>
  89. </head>
  90. <body>
  91. <div style="width: 400px;height: 300px;" class="echars"></div>
  92. </body>
  93. </html>

尾声

  1. 如果你觉得我写的不错的话,点一下推荐。感谢了
  2. 我已经几个月没有人给我推荐了。
  3. 听说打赏的小哥哥都追到女朋友了,
  4. 咦!你不信,不信你给我打赏看一下!
  5. 保准你追到到喜欢的Ta

原文链接:https://www.cnblogs.com/IwishIcould/p/18127965

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号