用实现六维雷达图最可控,因其基于极坐标精确计算顶点、自动处理dpr适配与文字定位,而div+css因坐标抽象层级不匹配易导致错位、偏移和响应式失效。

直接用 <canvas></canvas> 实现六维能力模型图(雷达图)最可控,div+css 会因坐标计算错位、旋转偏移、响应式失效而频繁返工。
为什么不用 div+css 做六维图
六维图本质是极坐标系下的多边形填充,每个顶点需精确落在圆周上,且连线角度必须严格对应 60° 间隔。用 div 模拟时:节点位置靠 top/left 手动算,加一个维度就得重调全部;连线用 ::after + transform: rotate(),但 transform-origin 默认居中,导致箭头起点偏移;文字标签贴在顶点外侧时,偶数边(如六边)会出现上下对称冲突,下方文字被裁或重叠——这不是“微调能解决”的问题,是坐标抽象层级不匹配的硬伤。
canvas 绘制六维图的关键三步
核心逻辑:先画同心多边形网格 → 再连顶点形成骨架 → 最后按数据填充区域并描边。所有坐标由 JS 实时计算,无需手动维护像素值。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 用
Math.cos()和Math.sin()算出六个顶点坐标,角度步进为2 * Math.PI / 6 - 每层网格(如 0.2、0.4、0.6、0.8、1.0 归一化半径)循环绘制正六边形,用
ctx.beginPath()+ctx.lineTo()连线 - 填充能力值时,把输入数组(如
[0.7, 0.9, 0.5, 0.8, 0.6, 0.4])映射到对应顶点,ctx.fill()前确保ctx.closePath() - 文字标签用
ctx.fillText(),配合ctx.save()/ctx.restore()单独旋转画布避免全局干扰
移动端适配和文字截断问题
Canvas 在高 DPR 设备(如 iPhone)下默认模糊,必须显式设置 canvas.width 和 canvas.height 为 clientWidth * window.devicePixelRatio,再用 CSS 缩放回原始尺寸;否则图标、文字边缘发虚。文字截断常见于顶点正下方(180° 方向),因为 fillText 的 textAlign 和 textBaseline 默认基准点不统一——解决方法是:对角度在 150°–210° 区间的标签,手动把 y 坐标上提 12px,并设 textBaseline = 'bottom'。
要不要引入 chart.js 或 echarts
如果只要静态展示、无交互、不导出,纯 <canvas></canvas> 50 行内搞定,零依赖;一旦需要 hover 提示、动画过渡、点击钻取或响应式重绘,立刻换 chart.js 并配置 type: 'radar' ——它内部已处理好 DPR、文字避让、坐标系缩放,你只需传入数据数组和 label 数组。硬套 div+css 或自己封装 canvas 动画,反而在 scale 变化时触发重绘抖动。
真正卡住人的从来不是“怎么画出来”,而是“改一个数值后,哪几处坐标/旋转/文字偏移要同步动”。canvas 把这些全收进一个函数里,改数据就重绘;div+css 把逻辑撕成六份散落在不同 class 里,改完必漏。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










