为什么 chart.js canvas 不遵守容器元素的填充?

Why is chart.js canvas not respecting the padding of the container element?

我正在使用 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>

JSFiddle

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

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

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

当您使用 Chrome 开发工具检查元素时,之前的设置会在高度和宽度上额外增加 30 像素。由于 canvas 的大小,在调整 canvas.

的大小时应该没有问题

JSFIDDLE EXAMPLE

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

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

由于 Chart.js 将 canvas 缩放到容器的宽度,忽略填充,我只是将 canvas 包裹在 div 中。 div 缩放到带有填充的容器,尊重填充,然后响应式 Chart.js canvas 缩放到 div.

"If for example, you wanted all charts created to be responsive, and resize when the browser window does, the following setting can be changed:"

Chart.defaults.global.responsive = true;

"Now, every time we create a chart, options.responsive will be true."

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

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

我也在谷歌上搜索了这个问题,最后找到了一个简单的解决方案。

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

的一部分

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

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

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

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

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