Bootstrap 标签和 C3 图表不合

Bootstrap tabs and C3 charts not getting along

我正在使用 Bootstrap 导航选项卡,每个选项卡中都有一个图表。无论在导航到主页时加载哪个选项卡,它都显示得非常好。但是,其他图表都与这些页面上的其他内容重叠,例如:

我不知道如何让它始终正确显示,无论哪个 bootstrap 选项卡处于活动状态。

我查看了这篇文章 - C3 chart sizing is too big when initially loaded - 它提到有时使用 Bootstrap 选项卡等时 c3 图表显示不正确。建议的修复是使用 jQuery(window).trigger('resize');。但是,我尝试在控制台中执行此操作,但它没有为我修复选项卡。

知道如何解决这个问题吗?如果我只是点击里面的 开发人员控制台,然后返回网页,图表会正确调整自身大小并调整其 widthx 值以适应它应该显示的 div。

这是用于生成图表的脚本:

var chart = c3.generate({
    bindto: '#opened-ports-chart',
    data: {
        columns: <%= @data %>,
        type : 'pie',
        onclick: function (d, i) { console.log("onclick", d, i); },
        onmouseover: function (d, i) { console.log("onmouseover", d, i); },
        onmouseout: function (d, i) { console.log("onmouseout", d, i); }
    },
    legend: {
        position: "right"
    }
});

通过在 Bootstrap 选项卡更改时调整图表大小解决了这个问题:

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
  chart.resize();
});

对我来说,只有调整大小事件是不够的,我不得不从 window 调用调整大小事件。

首先css,因为我使用display:grid来划分行,与使用col-x

相同
.c3 svg {
    width: 100%;
    height: 100%;
 }

然后:

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {
    setTimeout(() => {
        window.dispatchEvent(new Event('resize'));
    }, 100);
});