JavaScript轻量图表库核心是数据映射+图形渲染:Canvas适合高频重绘(如实时折线图),需手动坐标转换和clearRect重绘;SVG适合交互丰富图表,基于DOM节点,支持事件、viewBox缩放和无障碍属性。
用 JavaScript 实现一个轻量图表库,核心在于抽象数据映射逻辑 + 图形渲染能力。Canvas 和 SVG 各有适用场景:Canvas 适合高频重绘(如实时折线图、动画),SVG 更适合交互丰富、需缩放/语义化/可访问性的静态或中低频图表(如柱状图、饼图)。不需要从零造轮子,但理解底层原理能帮你灵活定制或调试。
图表的关键步骤Canvas 是位图绘制,靠 getContext('2d') 获取绘图上下文,所有图形都通过命令式 API 画上去:
canvas.width/height,不是 CSS 样式),否则会模糊或拉伸beginPath() → 绘图命令(moveTo, lineTo, arc 等)→ stroke() 或 fill() 完成单个图形pixelY = height - (value - min) / (max - min) * height)fillText(),注意 textAlign 和 textBaseline 对齐方式,否则标签容易错位clearRect(0, 0, width, height),不要依赖 canvas.width = canvas.width(会重置所有上下文状态)SVG 是基于 XML 的矢量标记语言,每个图形都是 DOM 节点,天然支持事件、CSS 样式、缩放和无障碍属性:
document.createElementNS('http://www.w3.org/2000/svg', 'line'),设置 x1/y1 等属性即可dataset 属性(如 el.dataset.value = "42"),方便后续交互取值viewBox(如 viewBox="0 0 600 400")替代固定宽高,配合 CSS 宽度实现等比缩放 加 cursor: pointer 和 addEventListener('click', ...) 即可响应点击;用 子元素提供 tooltip 文字(悬停显示)transition: fill 0.2s)不追求功能完整,只体现核心抽象:输入数据数组,输出可视化结果。
ctx, data, opts = {x:0,y:0,width:300,height:200,padding:20},内部算柱宽、映射高度、循环绘制 fillRect
元素,内部按数据生成多个 ,设置 y 和 height(注意 SVG y 轴向下,柱子要从顶部往下画,即 y = opts.y,height = valueScale * value)scale(data, outputMin, outputMax) 返回值域映射器,autoTicks(min, max, count=5) 生成坐标轴刻度基本上就这些。真正实用的图表库还会处理坐标轴、图例、动画缓动、移动端适配、导出 PNG/SVG 等,但起步时聚焦「数据 → 图形」这一条主线,Canvas 练手感,SVG 练结构,很快就能搭出可用的定制图表。