ECharts 饼图鼠标悬浮后标签 title 消失的问题

解决 ECharts 饼图鼠标悬浮后标签 title 消失的问题

TL;DR

饼图扇区外侧的文字标签,鼠标悬浮(hover)时,标签里的 title 那一行(甚至整块标签 + 引导线)会突然消失,移开鼠标又恢复。

这不是样式 bug,而是 ECharts 的标签防重叠布局emphasis(强调)状态交互导致的。修复只有一句话:

emphasis 里显式声明 label.show: truelabelLine.show: true


一、问题现象

一张常见的占比饼图,每个扇区外侧带文字标签,标签通常是两行结构:第一行是数值/百分比,第二行是标题(title)。

scss 复制代码
        ┌──────────────┐
        │  85% (17)    │  ← 数值行
   ╲    │  自动模式    │  ← 标题行(title)
    ╲   └──────────────┘
     ╱─────
    ╱  扇区

Bug 表现:

鼠标悬浮到某个扇区上时,该扇区标签里的 title 那一行(连同引导线)突然消失,只剩数值行,或整块标签都不见了;移开鼠标恢复。

排查时第一反应往往是「hover 触发了什么动画把标签顶出去」------其实不是,动效根本没动标签的位置。真正的根因在状态机里。


二、根因:emphasis 态「沿用隐藏状态」

ECharts 5 的饼图,当扇区标签显示在外侧时,引擎会自动做标签防重叠布局(labelLayout) :空间不够或标签互相遮挡时,它会隐藏部分标签、引导线,或其中某几行。

关键点来了:

一旦某段内容(比如 title 那一行)在普通态被防重叠布局标记为「隐藏」,当鼠标悬浮、扇区进入 emphasis 态时,ECharts 默认会「沿用这个隐藏状态」,而不会因为扇区被高亮就把它重新显示出来。

于是表现为:悬浮一下,title 就没了。不是 emphasis 把 title 藏起来的,而是 title 早就被防重叠布局判了「隐藏」,emphasis 只是没有把它捞回来。

这也解释了为什么「移开鼠标又恢复」------离开 emphasis 态后,回到了普通态的布局结果。


三、解法:emphasis 显式 show: true

既然问题是「emphasis 沿用隐藏状态」,那就在 emphasis 里显式声明依旧显示:

js 复制代码
series: [
  {
    type: 'pie',
    radius: ['40%', '65%'],
    label: { show: true, /* formatter / rich 等 */ },
    labelLine: { show: true },
    emphasis: {
      // 关键:显式声明强调态仍展示标签和引导线,
      // 既保留扇区默认的放大动画,又避免标签被 emphasis 态隐藏。
      label: { show: true },
      labelLine: { show: true }
    }
  }
]

加上这两行后:

  • 扇区 hover 时默认的放大动画照常(没有禁用 emphasis);
  • 标签和引导线不再因为「沿用隐藏状态」而消失,title 行稳定可见。

为什么不能指望默认值?

因为 emphasis 态不会自动继承普通态的全部显示设置 。普通态写了 label.show: true,不代表 emphasis 态也是 true------一旦普通态里这个标签被防重叠布局动态隐藏过,emphasis 态就会以「隐藏」为准。涉及 label / labelLine 可见性时,显式写 emphasis.label.show: true 比依赖默认值稳妥得多

这也是这个 Bug 最容易踩坑的地方:配置看起来「我明明设置了 label.show: true 啊」,却忽略了它只对普通态生效。


四、最小复现代码

html 复制代码
<!DOCTYPE html>
<html>
<head><meta charset="utf-8" /></head>
<body>
  <div id="chart" style="width: 600px; height: 400px;"></div>
  <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
  <script>
    const chart = echarts.init(document.getElementById('chart'));
    chart.setOption({
      series: [{
        type: 'pie',
        radius: ['40%', '65%'],
        center: ['50%', '55%'],
        data: [
          { value: 17, name: '自动模式' },
          { value: 3,  name: '手动模式' }
        ],
        label: {
          show: true,
          formatter: (p) => `{a|${p.value} (${p.percent}%)}\n{a|${p.name}}`,
          rich: { a: { fontSize: 12, lineHeight: 20 } }
        },
        labelLine: { show: true },
        emphasis: {                         // ✅ 关键修复:强调态强制显示
          label: { show: true },
          labelLine: { show: true }
        }
      }]
    });
  </script>
</body>
</html>

想复现 Bug:把 emphasis 那段去掉,然后用更长的标签文案 + 更小的容器,制造出标签互相遮挡的场景,悬浮时就能看到 title 行消失。


五、小结

「饼图标签 hover 后 title 消失」看似玄学,本质是 ECharts 标签防重叠布局 + emphasis 状态机的一个交互陷阱:

  1. 防重叠布局在普通态把某些标签(行)判为「隐藏」;
  2. emphasis 态默认沿用这个隐藏状态,而不是因高亮而恢复;
  3. 表现为「悬浮即消失,移开即恢复」。

修复只有一步:emphasis.label.show: true + emphasis.labelLine.show: true ,把显示权从「沿用隐藏」手里夺回来。记住「emphasis 不自动继承普通态的显示设置」,这个坑就不会再踩。

相关推荐
Canace1 小时前
用 AI 写了一天代码,为什么反而更累了?
前端·人工智能·ai编程
Vhen1 小时前
Taro 封装小程序toast提示组件
前端
用户250694921611 小时前
React项目打包为.next文件部署
前端
tryCbest1 小时前
Html设置网站图标
前端·html
半个落月1 小时前
从页面跳转到前端路由:手写一个简单的 HashRouter
前端
做前端的娜娜子1 小时前
移动端上拉加载与下拉刷新实现方案
前端·面试·掘金·金石计划
叱咤月海鱼鱼猫1 小时前
iframe 弹窗取消按钮触发父页面弹窗接口
前端
勾勾圈圈蛋蛋1 小时前
黑马Vue_day12(一):getters,怎么看 Apifox 文档,工程化等工具介绍;
前端
参宿71 小时前
像素vs条数级虚拟列表
前端