纯HTML无法直接绘制雷达图,必须依赖或;CSS缺乏极坐标系统,硬凑会导致误差累积、响应式错位、填充受限及事件定位不准。

纯 HTML 无法直接绘制雷达图—— CSS 缺乏原生极坐标系统,所有“CSS 雷达图”本质上是用 核心是把极坐标 示例片段(省略样式设置): 实际项目中最常卡住的不是绘图逻辑,而是这三点: 真正麻烦的从来不是画出一个静态图形,而是让角度对齐、半径比例合理、交互反馈明确——这些细节没有通用解,得根据你的数据分布和 UI 容器反复调。 或 是必需的载体,浏览器不支持用 为什么不能只用 HTML + CSS 做雷达图
transform: rotate() + position: absolute 硬凑角度和半径,导致:
• 数据点位置随角度增加累积误差(尤其 >6 个维度时)
• 无法动态计算多边形顶点坐标,缩放/响应式会错位
• 填充区域只能靠伪元素或遮罩模拟,不支持透明度叠加与交集裁剪
• 没有事件坐标映射,点击某个轴或区域无法准确定位数据维度用
(r, θ) 转为直角坐标 (x, y): x = centerX + r * cos(θ),y = centerY + r * sin(θ)。注意:Math.cos/Math.sin 的参数单位是弧度,不是角度。
angleStep = (Math.PI * 2) / data.length
value / maxValue)乘以最大半径,再套公式转坐标ctx.beginPath() → ctx.moveTo() → 多次 ctx.lineTo() → ctx.closePath() 绘制填充多边形;再单独描边轴线和网格圆const ctx = canvas.getContext('2d');
const centerX = canvas.width / 2;
const centerY = canvas.height / 2;
const maxRadius = Math.min(centerX, centerY) * 0.8;
const angleStep = (Math.PI * 2) / data.length;
<p>ctx.beginPath();
for (let i = 0; i angleStep;
const r = (data[i] / maxValue) maxRadius;
const x = centerX + r <em> Math.cos(angle);
const y = centerY + r </em> Math.sin(angle);
if (i === 0) ctx.moveTo(x, y);
else ctx.lineTo(x, y);
}
ctx.closePath();
ctx.fill();</p>
用
优势在于路径可声明、可动画、可绑定事件,且坐标系天然适合极坐标转换。关键不是用 ,而是用 的 d 属性拼接 M(move)和 L(line)指令。
x/y,但结果直接注入 d 字符串,无需 canvas 上下文状态管理(同心圆) + (从中心出发的射线)组合,比 canvas 更易复用和修改 加 data-index="2" 这类自定义属性,配合 addEventListener('click') 即可精准捕获点击的是第几个维度viewBox 或 transform="translate()" 把中心移到画布中点别踩这些坑:坐标、归一化与响应式
Math.sin/Math.cos 传了角度值(如 60),必须先转弧度:angleInRad = angleInDeg * Math.PI / 180
maxValue,得先做 min-max 或 z-score 标准化canvas.width/canvas.height(仅改 CSS 尺寸会导致图像模糊);SVG 则要监听 resize 并更新 viewBox 和 transform
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











