You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在页面加载时让ApexCharts无需悬停显示所有Tooltip?

问题描述

我从ApexCharts演示中复制了一段JavaScript示例代码,想要实现页面加载完成后立即显示所有Tooltip,方便用Browsershot进行打印。

示例代码如下:

var options = {
      series: [{
      name: "sales",
      data: [{
        x: '2019/01/01',
        y: 400
      }, {
        x: '2019/04/01',
        y: 430
      }, {
        x: '2019/07/01',
        y: 448
      }, {
        x: '2019/10/01',
        y: 470
      }, {
        x: '2020/01/01',
        y: 540
      }, {
        x: '2020/04/01',
        y: 580
      }, {
        x: '2020/07/01',
        y: 690
      }, {
        x: '2020/10/01',
        y: 690
      }]
    }],
      chart: {
      type: 'bar',
      height: 380
    },
    xaxis: {
      type: 'category',
      labels: {
        formatter: function(val) {
          return "Q" + dayjs(val).quarter()
        }
      },
      group: {
        style: {
          fontSize: '10px',
          fontWeight: 700
        },
        groups: [
          { title: '2019', cols: 4 },
          { title: '2020', cols: 4 }
        ]
      }
    },
    title: {
        text: 'Grouped Labels on the X-axis',
    },
    tooltip: {
      x: {
        formatter: function(val) {
          return "Q" + dayjs(val).quarter() + " " + dayjs(val).format("YYYY")
        }  
      }
    },
    };

var chart = new ApexCharts(document.querySelector("#chart"), options);
chart.render();

我尝试了以下代码,但只能显示一个Tooltip,而且鼠标悬停到图表上后Tooltip就会消失:

$('.apexcharts-tooltip').css({ opacity: 1 });
$('.apexcharts-tooltip').show();
解决方案

ApexCharts默认采用单例Tooltip模式,只会渲染一个Tooltip实例,没有直接显示所有Tooltip的官方API。要实现页面加载时显示所有数据点的Tooltip,需要手动克隆并定位Tooltip元素,具体实现如下:

var options = {
  series: [{
    name: "sales",
    data: [{
      x: '2019/01/01',
      y: 400
    }, {
      x: '2019/04/01',
      y: 430
    }, {
      x: '2019/07/01',
      y: 448
    }, {
      x: '2019/10/01',
      y: 470
    }, {
      x: '2020/01/01',
      y: 540
    }, {
      x: '2020/04/01',
      y: 580
    }, {
      x: '2020/07/01',
      y: 690
    }, {
      x: '2020/10/01',
      y: 690
    }]
  }],
  chart: {
    type: 'bar',
    height: 380,
    events: {
      rendered: function(chart) {
        const chartEl = chart.el;
        const defaultTooltip = chartEl.querySelector('.apexcharts-tooltip');
        if (!defaultTooltip) return;

        // 隐藏默认Tooltip避免干扰
        defaultTooltip.style.display = 'none';

        // 遍历所有数据点生成对应Tooltip
        chart.series.forEach(series => {
          series.dataPoints.forEach(point => {
            const tooltipClone = defaultTooltip.cloneNode(true);
            tooltipClone.style.display = 'block';
            tooltipClone.style.opacity = '1';
            tooltipClone.style.position = 'absolute';

            // 设置Tooltip内容,匹配原formatter逻辑
            const xText = `Q${dayjs(point.x).quarter()} ${dayjs(point.x).format("YYYY")}`;
            const yText = point.y;
            tooltipClone.querySelector('.apexcharts-tooltip-title').textContent = xText;
            tooltipClone.querySelector('.apexcharts-tooltip-series-group .apexcharts-tooltip-text').textContent = yText;

            // 基于数据点坐标定位Tooltip
            const pointCoords = point.seriesPoint.config.dataPointXY;
            tooltipClone.style.left = `${pointCoords.x + 10}px`;
            tooltipClone.style.top = `${pointCoords.y - 40}px`;

            chartEl.appendChild(tooltipClone);
          });
        });

        // 阻止鼠标事件冒泡,避免默认逻辑隐藏Tooltip
        chartEl.addEventListener('mousemove', (e) => {
          e.stopPropagation();
        }, true);
      }
    }
  },
  xaxis: {
    type: 'category',
    labels: {
      formatter: function(val) {
        return "Q" + dayjs(val).quarter()
      }
    },
    group: {
      style: {
        fontSize: '10px',
        fontWeight: 700
      },
      groups: [
        { title: '2019', cols: 4 },
        { title: '2020', cols: 4 }
      ]
    }
  },
  title: {
    text: 'Grouped Labels on the X-axis',
  },
  tooltip: {
    x: {
      formatter: function(val) {
        return "Q" + dayjs(val).quarter() + " " + dayjs(val).format("YYYY")
      }  
    }
  },
};

var chart = new ApexCharts(document.querySelector("#chart"), options);
chart.render();

核心说明

  • 借助rendered事件确保图表完全渲染后再创建Tooltip,避免DOM元素未生成的问题
  • 克隆默认Tooltip元素,继承原有样式,无需手动编写复杂CSS
  • 通过dataPointXY获取数据点的精确坐标,实现Tooltip的精准定位
  • 阻止mousemove事件冒泡,禁用默认Tooltip的交互隐藏逻辑,保证Tooltip持续显示
  • 生成的Tooltip都是真实DOM元素,完全兼容Browsershot的打印需求

内容的提问来源于stack exchange,提问作者bbaho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:22:07