Chart.js - Mouseover导致图形闪烁并调整大小

时间:2017-08-16 06:50:22

标签: javascript jquery chart.js2

首先,I have made a short video to show exactly what I'm running into

总结视频:使用Chart.js(2.6.0)时,我可以毫无问题地创建我的图表;但当我将鼠标悬停在条形/点上时,图表将调整其元素的大小并闪烁。奇怪的是,它完全不一致。有时当我刷新时,它根本就没有这种行为;但如果我将鼠标悬停在某个东西上并开始这样做,它就会停止,直到我再次刷新或关闭标签(这也与此不一致)。

,当发生这种情况时,我不会改变代码中的任何内容。

为了解决这个问题,我在SO上引用了许多其他线程,以及Chart.js文档。在我的解决方案中:我已经指出了为Divs&添加指定的高度/宽度。画布创建图形;将“动画”持续时间设置为0,将“悬停动画”持续时间设置为0,将“响应动画”持续时间设置为0;我已经确保将响应设置为真,并保持纵横比保持为真,改变了工具提示模式...我已经尝试了所有这些,以及其他似乎没有什么的小事情。 - 没效果。

我很难过!

这是我的一张图表'代码(没有我如何抓取JSON数据等,只是图表):

new Chart($("#runwayChart"), {
    type: "horizontalBar",
    data: {
        labels: runwayLabels,
        datasets: [{
            label: "Months Left", fill: true,
            backgroundColor: "#3333ff",
            borderColor: "#3333ff",
            data: score
        }, {
            label: "Expenses",
            fill: true,
            backgroundColor: "#aa2222",
            borderColor: "#aa2222",
            data: expenses
        }, {
            label: "Revenue",
            fill: true,
            backgroundColor: "#2222aa",
            borderColor: "#2222aa",
            data: revenues
        }]
    },
    options: {
        tooltips: {
            mode: 'index'
        },
        responsive: true,
        maintainAspectRatio: true,
        animation: {
            duration: 0,
        },
        hover: {
            animationDuration: 0,
        },
        responsiveAnimationDuration: 0
    }
});

我很感激你们所有人的帮助!

谢谢=)

4 个答案:

答案 0 :(得分:5)

我看到已经有一段时间了,因为有人写了这篇文章的答案。我通过应用两件事解决了我的闪烁问题。

第一个 当我声明我使用的图表时:

var ctx = document.getElementById('chart').getContext('2d'); window.chart = new Chart(ctx, {}) ...

而不是var chart = new Chart(ctx, {})..

通过这种方式,我们确保图表已附加到窗口。对象

<强>其次

在绘制新图表之前(例如,对于数据更新),我们需要确保先前的画布已被销毁。我们可以使用以下代码检查:

if(window.chart && window.chart !== null){ window.chart.destroy(); }

答案 1 :(得分:2)

这实际上是一个非常简单而奇怪的解决方案。

当数据点靠近图表顶部时,图表会尝试根据div调整大小。由于图表存在于更大的画布中,因此放入自己的div可以解决这个问题。

<div>
    <canvas id="chart"></canvas>
</div>

将其格式化为解决方案=)

答案 2 :(得分:0)

试试这个:

   var myLineChart = null;

           function createChart() {
               var ctx1 = document.getElementById("barcanvas").getContext("2d");
               myLineChart = new Chart(ctx1, {
                   type: 'horizontalBar',
                  data: {
                        labels: runwayLabels
                        , datasets: [{
                            label: "Months Left"
                            , fill: true
                            , backgroundColor : "#3333ff" 
                            , borderColor: "#3333ff"
                            , data: score
                            }, {
                            label: "Expenses"
                            , fill: true
                            , backgroundColor : "#aa2222"
                            , borderColor: "#aa2222"
                            , data: expenses
                            }, {
                            label: "Revenue"
                            , fill: true
                            , backgroundColor : "#2222aa"
                            , borderColor: "#2222aa"
                            , data: revenues
                            }]
                    }
                   options:
                       {
                           scales: {
                               xAxes: [{
                                   ticks: {
                                       callback: function (tick) {
                                           var characterLimit = 20;
                                           if (tick.length >= characterLimit) {
                                               return tick.slice(0, tick.length).substring(0, characterLimit - 1).trim() + '...';
                                           }
                                           return tick;
                                       }
                                   }
                               }]
                           },

                           tooltips: {
                               callbacks: {
                                   // We'll edit the `title` string
                                   title: function (tooltipItem) {
                                       // `tooltipItem` is an object containing properties such as
                                       // the dataset and the index of the current item

                                       // Here, `this` is the char instance

                                       // The following returns the full string
                                       return this._data.labels[tooltipItem[0].index];
                                   }
                               }
                           },

                           title:
                           {
                               display: true,
                               text: "Your Chart Title"
                           },
                           responsive: true,
                           maintainAspectRatio: true
                       }
               });
           }

答案 3 :(得分:0)

我的 angular 应用程序(angular v6 和 chartjs 2.9.4)也遇到了同样的问题。 在重新绘制图表之前添加延迟并销毁图表实例解决了我的问题。

public redraw() {
    setTimeout(() => {
      if (this.chart && this.chart != null) {
        this.chart.destroy()
      }
      this.chart = new Chart(this.chartId, this.chartConfig);
    }, 500);
  }