响应式图表

当根据窗口大小更改图表大小时,主要的限制是画布渲染大小(canvas.width.height)不能用相对值表示,与显示大小相反(canvas.style.width.height)。此外,这些尺寸彼此独立,因此画布渲染尺寸不会根据显示尺寸自动调整,从而使渲染不准确。

以下示例不起作用:

  • <canvas height="40vh" width="80vw">: 无效值,画布不调整大小 (示例)
  • <canvas style="height:40vh; width:80vw">: 无效的行为,画布调整大小但变得模糊(example)
    Chart.js提供了几个选项,通过检测画布显示大小何时更改并相应地更新渲染大小来启用响应并控制图表的大小调整行为。

配置选项

名称类型默认值描述
responsiveBooleantrue调整图表画布的容器大小 (重要提示).
responsiveAnimationDurationNumber0调整大小后执行动画时间(以毫秒为单位))
maintainAspectRatioBooleantrue保持原有的宽高比
onResizeFunctionnull调整大小时调用,获取传递两个参数:图表实例和新大小

重要提示

不能直接从CANVAS元素检测画布尺寸何时改变。Chart.js使用其父容器来更新canvas渲染和显示大小。然而,该方法要求容器相对定位。强烈建议将此容器专用于图表canvas,然后可以通过设置容器大小的相对值来实现响应:例子

  1. <div class="chart-container" style="position: relative; height:40vh; width:80vw">
  2. <canvas id="chart"></canvas>
  3. </div>

也可以通过修改容器大小来改变图表大小:

  1. chart.canvas.parentNode.style.height = '128px';

打印可调整大小的图表

打印页面时,允许CSS媒体查询更改样式。从这些媒体查询中应用的CSS可能会导致图表需要调整大小。但是,调整大小不会自动发生。 要在打印时支持调整图表大小,您需要使用onbeforeprint事件钩子并手动触发每个图表的大小调整。

  1. function beforePrintHandler () {
  2. for (var id in Chart.instances) {
  3. Chart.instances[id].resize()
  4. }
  5. }