SVG是DOM元素,Canvas是像素画布:SVG图形可交互、缩放无损、支持SEO和矢量导出,适合静态或需单元素操作的场景;Canvas帧率稳定、适合高频重绘与大数据量动态渲染,但需手动处理交互与响应式。
这是最根本的区别:SVG 中每个 、 都是真实存在的 DOM 节点,能被 document.querySelector 拿到,能绑 click 事件,能用 CSS 控制 fill 或 transform;Canvas 里画完就“消失”了——ctx.fillRect(10, 10, 100, 100) 只是在画布上填了一块像素,之后它不再有身份,也不能单独选中或响应鼠标悬停。
onclick?不行,得自己算坐标、做碰撞检测font-size 缩放还保持清晰?选 SVG,Canvas 需手动监听 window.devicePixelRatio 并重设 canvas.width/height
),Canvas 得自己管理整个渲染生命周期SVG 是靠数学公式描述图形的(比如一个圆是 “圆心在 (50,50),半径为 30”),所以放大 10 倍还是光滑曲线;Canvas 是把图形“拍成照片”,存成一串像素值,放大后就是马赛克。
resize,重新设置 canvas.width 和 canvas.height,再重绘全部内容outerHTML 保存为 .svg 文件,或转成 PDF;Canvas 得调 toDataURL('image/png'),但分辨率受限于当前画布尺寸SVG 性能拐点在 DOM 节点数:画 200 个 没问题,画 5000 个就会卡顿(浏览器要维护 5000 个对象);Canvas 帧率稳定,哪怕每秒重绘 60 次,只要逻辑不卡 CPU,画面就流畅。
d3fc 或自定义 context 绘制)不用纠结理论,直接问自己:
包裹 + addEventListener 直接可用)aria-label 和降级图片真正复杂的项目往往不是二选一,而是 SVG 画 UI 层(按钮、图例、文字),Canvas 画数据层(散点、热力、轨迹)
——关键不是“哪个更好”,而是“哪部分该用哪个”。