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

ChartJS堆叠柱状图点击高亮实现 选中列添加彩色边框方法

堆叠柱状图选中列添加彩色边框实现方案

可以通过监听图表点击事件,动态修改对应列的边框配置后重绘图表实现需求,具体修改步骤如下:

  • 先给每个数据集补充边框基础配置,初始状态下隐藏边框,同时关闭默认的边框跳过逻辑,确保四个边都能正常渲染:
    在每个dataset对象中新增以下三个属性:
borderWidth: 0,
borderColor: 'transparent',
borderSkipped: false
  • 图表初始化完成后绑定点击事件,实现选中状态的切换:
bar_ctx.addEventListener('click', function (evt) {
  // 获取点击位置对应的列索引
  const activePoints = bar_chart.getElementsAtEventForMode(evt, 'index', { intersect: true }, false);
  // 重置所有列的边框配置
  bar_chart.data.datasets.forEach(dataset => {
    dataset.borderWidth = new Array(dates.length).fill(0);
    dataset.borderColor = new Array(dates.length).fill('transparent');
  });
  // 点击到有效列时添加彩色边框
  if (activePoints.length) {
    const selectedColIndex = activePoints[0].index;
    bar_chart.data.datasets.forEach(dataset => {
      dataset.borderWidth[selectedColIndex] = 3; // 可自定义边框宽度
      dataset.borderColor[selectedColIndex] = '#2196F3'; // 可自定义边框颜色
    });
  }
  // 重绘图表让配置生效
  bar_chart.update();
});

如果需要hover状态不覆盖选中的边框效果,同步修改每个dataset的hoverBorderWidth和hoverBorderColor配置即可。

修改后的完整代码

// 返回带千分位逗号分隔的数值
var numberWithCommas = function(x) {
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
var dataPack1 = [40, 47, 44, 38, 27, 31, 25];
var dataPack2 = [10, 12, 7, 5, 4, 6, 8];
var dataPack3 = [17, 11, 22, 18, 12, 7, 5];
var dates = ["SN 1.0.1", "SN 1.0.2", "SN 1.0.3", "SN 1.0.4", "SN 1.0.5", "SN 2.0.0", "SN 2.0.1"];
var bar_ctx = document.getElementById('bar-chart');
var bar_chart = new Chart(bar_ctx, {
      type: 'bar',
      data: {
        labels: dates,
        datasets: [{
          label: 'Bad Style',
          data: dataPack1,
          backgroundColor: "#512DA8",
          hoverBackgroundColor: "#7E57C2",
          hoverBorderWidth: 0,
          borderWidth: 0,
          borderColor: 'transparent',
          borderSkipped: false
        }, {
          label: 'Warning',
          data: dataPack2,
          backgroundColor: "#FFA000",
          hoverBackgroundColor: "#FFCA28",
          hoverBorderWidth: 0,
          borderWidth: 0,
          borderColor: 'transparent',
          borderSkipped: false
        }, {
          label: 'Error',
          data: dataPack3,
          backgroundColor: "#D32F2F",
          hoverBackgroundColor: "#EF5350",
          hoverBorderWidth: 0,
          borderWidth: 0,
          borderColor: 'transparent',
          borderSkipped: false
        }]
      },
      options: {
        animation: {
          duration: 10,
        },
        tooltips: {
          mode: 'label',
          callbacks: {
            label: function(tooltipItem, data) {
              return data.datasets[tooltipItem.datasetIndex].label + ": " + numberWithCommas(tooltipItem.yLabel);
            }
          }
        },
        scales: {
          xAxes: [{
            stacked: true,
            gridLines: {
              display: false
            },
          }],
          yAxes: [{
            stacked: true,
            ticks: {
              callback: function(value) {
                return numberWithCommas(value);
              },
            },
          }],
        },
        legend: {display: true}
      }
});

// 点击事件绑定
bar_ctx.addEventListener('click', function (evt) {
  const activePoints = bar_chart.getElementsAtEventForMode(evt, 'index', { intersect: true }, false);
  bar_chart.data.datasets.forEach(dataset => {
    dataset.borderWidth = new Array(dates.length).fill(0);
    dataset.borderColor = new Array(dates.length).fill('transparent');
  });
  if (activePoints.length) {
    const selectedColIndex = activePoints[0].index;
    bar_chart.data.datasets.forEach(dataset => {
      dataset.borderWidth[selectedColIndex] = 3;
      dataset.borderColor[selectedColIndex] = '#2196F3';
    });
  }
  bar_chart.update();
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:39:03