# 响应式图表

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

以下示例**不起作用**

  • <canvas height="40vh" width="80vw">: **无效** 值,画布不会调整大小 (示例 (在新窗口中打开))
  • <canvas style="height:40vh; width:80vw">: **无效** 行为,画布被调整大小,但变得模糊 (示例 (在新窗口中打开))
  • <canvas style="margin: 0 auto;">: **无效** 行为,画布持续缩小。Chart.js 需要为每个画布指定一个容器,并且应在该容器上应用此样式。

Chart.js 提供了一些选项来启用响应能力并控制图表的调整大小行为,方法是检测画布显示尺寸何时更改并相应地更新渲染尺寸。

# 配置选项

命名空间: options

名称 类型 默认值 描述
responsive 布尔值 true 当容器调整大小 ( 重要提示... ) 时,调整图表画布大小。
maintainAspectRatio 布尔值 true 在调整大小期间保持原始画布纵横比 (width / height)
aspectRatio 数字 1|2 画布纵横比(即 width / height,值为 1 表示方形画布)。请注意,如果高度以属性或样式方式明确定义,则此选项将被忽略。默认值因图表类型而异;径向图 (圆环图、饼图、极坐标图、雷达图) 默认值为 1,其他图表默认值为 2
onResize 函数 null 当发生调整大小事件时调用。传递两个参数:图表实例和新尺寸。
resizeDelay 数字 0 将调整大小更新延迟给定的毫秒数。这可以通过对元素的更新进行防抖来简化调整大小过程。

# 重要提示

无法直接从 canvas 元素检测画布尺寸何时更改。Chart.js 使用其父容器来更新画布渲染和显示尺寸。但是,此方法要求容器为**相对定位**并且**仅专用于图表画布**。然后可以通过为容器尺寸设置相对值来实现响应能力 (示例 (在新窗口中打开))

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

也可以通过修改容器尺寸来以编程方式调整图表大小

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

请注意,为了使上述代码正确地调整图表高度,maintainAspectRatio 选项也必须设置为 false

# 打印可调整大小的图表

CSS 媒体查询允许在打印页面时更改样式。从这些媒体查询应用的 CSS 可能会导致图表需要调整大小。但是,调整大小不会自动发生。为了支持在打印时调整图表大小,您需要连接onbeforeprint (在新窗口中打开) 事件并手动触发每个图表的调整大小操作。

function beforePrintHandler () {
    for (let id in Chart.instances) {
        Chart.instances[id].resize();
    }
}

您可能还会发现,由于浏览器在打印页面布局和触发调整大小事件时存在复杂性,Chart.js 无法正确调整打印布局的大小。为了解决这个问题,您可以将显式尺寸传递给 .resize(),然后使用onafterprint (在新窗口中打开) 事件,在完成后恢复自动尺寸。

window.addEventListener('beforeprint', () => {
  myChart.resize(600, 600);
});
window.addEventListener('afterprint', () => {
  myChart.resize();
});
最后更新时间: 2024年5月17日 下午12:33:38