为什么chart.js画布不尊重容器元素的填充?

时间:2015-01-27 03:35:22

标签: javascript html css canvas chart.js

我正在使用带有简单折线图的Chart.js,但Chart.js计算的宽度和高度属性似乎是基于忽略填充的父元素的总宽度和高度。



var options = {
    maintainAspectRatio: false,
    responsive: true
};

var data = {
    labels: ["", "", "", "", "", "", ""],
    datasets: [
        {
            label: "My First dataset",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data: [65, 59, 80, 81, 56, 55, 40]
        },
        {
            label: "My Second dataset",
            fillColor: "rgba(151,187,205,0.2)",
            strokeColor: "rgba(151,187,205,1)",
            pointColor: "rgba(151,187,205,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(151,187,205,1)",
            data: [28, 48, 40, 19, 86, 27, 90]
        }
    ]
};

var ctx1 = document.getElementById("mychart1").getContext("2d");
var myNewChart = new Chart(ctx1).Line(data, options);

.container {
    padding: 15px 15px 15px 15px;
    width: 300px;
    height: 200px;
    border: 1px solid black;
}

.child {
    display: inline-block;
    border: 1px solid red;
    width:100%;
    height:100%;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.1.1/Chart.js"></script>


<div class='container'>
    <canvas id='mychart1' class='child'></canvas>
</div>
<br>
<div class='container'>
    <div class='child'>test</div>
</div>
&#13;
&#13;
&#13;

JSFiddle

第二个容器和子容器显示了我期望的行为。这是Chart.js如何计算画布的宽度和高度的错误,还是我造成样式错误?

6 个答案:

答案 0 :(得分:51)

我还需要一个响应式画布并且遇到了这个问题。这是我的修复:

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

由于Chart.js将画布缩放到容器的宽度,忽略填充,我只是将画布包裹在div中。 div使用填充扩展到容器,遵循填充,然后响应Chart.js canvas缩放到div

答案 1 :(得分:4)

我也搜索了这个问题并最终找到了一个简单的解决方案。

我添加了height,以便相应地自动调整宽度并以更好的方式显示。如果你真的想要,你也可以添加widthcanvas元素是HTML5的一部分。

它不允许您使用px输入值。所以忽略它,只需键入你需要的数值。

 <canvas id="myChart" height="80"></canvas>

答案 2 :(得分:3)

更好的解决方案是使用 .container {box-sizing: border-box;}

答案 3 :(得分:2)

在您的jsfiddle示例中,将responsive属性更改为false:

var options = {
    maintainAspectRatio: true,
    responsive: false
};

使用Chrome开发工具检查元素时,之前的设置为高度和宽度增加了30px。由于画布的大小,在调整画布大小时应该没有问题。

<强> JSFIDDLE EXAMPLE

答案 4 :(得分:0)

我把它包起来然后用了这个CSS。

.chart-container {
  box-sizing:border-box;
  margin:2%;
  width:96%;
}

这使它从边缘填充并响应。我使用了2%,但你可以使用适合你布局的百分比。

答案 5 :(得分:-1)

&#34;例如,如果您希望创建的所有图表都具有响应性,并在浏览器窗口时调整大小,则可以更改以下设置:&#34;

Chart.defaults.global.responsive = true;

&#34;现在,每次我们创建图表时,options.responsive都将成立。&#34;

来源:http://www.chartjs.org/docs/