必须等待DOM就绪后再初始化图表,即用DOMContentLoaded事件或把script置于</body>前,确保document.getElementById能获取到容器;多图表需ID唯一;容器父级须设明确宽高,否则响应式模式下渲染区域为0;初始化后窗口变化需手动调用resize()。
不能靠写死 HTML 标签或手动拼 innerHTML,否则数据一变就得改代码。真正可靠的做法是:用 JavaScript 拿到 DOM 容器(比如 <div id="chart"></div>),再交给可视化库初始化——Chart.js 用 getContext('2d'),ECharts 用 echarts.init(),D3 则直接选中容器挂 SVG。
常见错误是 DOM 还没加载完就执行初始化,结果 document.getElementById 返回 null。必须等 DOMContentLoaded 或把 script 放在 </body> 前。
<head> 里直接调用 echarts.init(document.getElementById('main'))
setTimeout 猜 DOM 加载时间,不可靠id 必须唯一,重复会导致只渲染第一个两者都接受 JSON 结构数据,但字段名和嵌套层级不同,硬套会报错。Chart.js 要求 data.labels 和 data.datasets 平级;ECharts 的 series 是顶层字段,xAxis/yAxis 单独配置,且支持更细粒度的坐标轴类型(如 value、category、time)。
参数差异直接影响数据清洗方向:
立即学习“前端免费学习笔记(深入)”;
labels 当字符串数组,若后端返回数字 ID,得先 .map(String) 否则坐标轴错位series.data 可以是二维数组 [[x, y], [x, y]] 或对象数组 {name: 'A', value: 10},但类型必须统一,混用会静默失败NaN(Chart.js)或 -(ECharts)innerHTML 注入原始数据容易踩的坑有人图省事,在 HTML 里写 <script>const rawData = <%= JSON.stringify(data) %></script>(服务端模板),或用 innerHTML 把 JSON 字符串塞进隐藏 <div> 再解析。这看似简单,实际埋雷:
<、&)会导致 JS 解析失败或 XSSinnerHTML 插入后需额外 JSON.parse(),多一层出错可能;而直接通过 fetch 或模块导入的数据天然是 JS 对象更稳的做法:前端用 fetch('/api/chart-data') 拉数据,再传给图表实例;或用 data-* 属性存轻量元信息(如 data-chart-type="line"),数据仍走 API。
很多模板里图表“突然消失”,不是 JS 报错,而是容器宽高为 0。原因很直接:<canvas> 或 <div id="main"> 的父级没设尺寸,CSS 里又没写 width: 100%,导致可视化库计算渲染区域时得到 0×0。
Chart.js 默认开启 responsive: true,但它只监听父容器尺寸变化,不负责撑开容器本身;ECharts 的 resize() 方法也依赖容器有真实尺寸。
width 和 height 的 <div>,比如 <div style="width: 100%; height: 400px"><div id="chart"></div></div>
flex 或 grid 子项自身设 flex: 1,父容器必须有可计算的高度(如 min-height 或固定 height)最常被忽略的是:图表初始化之后,窗口 resize 或 tab 切换回来时,必须手动调用 myChart.resize() 或 myEcharts.resize(),否则图表不会自适应新尺寸。