刻度密度由SVG或Canvas中循环的步长决定,而非CSS或HTML属性;SVG通过for循环step值控制主次刻度数量与位置,Canvas需手动计算弧度并注意高DPI适配;标签不渲染任何刻度线。

刻度密度由 SVG 或 Canvas 中的循环步长决定,不是 CSS 属性
HTML 本身没有“刻度密度”配置项,<meter></meter> 标签不渲染刻度线,transform 或 clip-path 也控制不了密度。真正起作用的是你在 SVG 的 <line></line> 循环里写的步长,或 Canvas 中 for 循环的 step 值。
SVG 刻度密度:控制 for 循环的 step 和角度映射范围
假设量程是 minVal = 0、maxVal = 100,物理角度区间是 startAngle = -30、endAngle = 210(共 240°),那每 5 个单位画一条主刻度,就写:
for (let val = 0; val <= 100; val += 5) {
const angle = -30 + (val / 100) * 240;
// 生成 <line x2="..." y2="..."> 和 <text x="..." y="...">
}关键点:
- 步长
5直接决定主刻度数量(21 条);若改+= 10就只剩 11 条 - 别用
rotate()批量转一组<line></line>——每条线单独算x2/y2才能保证端点落在圆弧上 - 次刻度(比如每 1 单位一道短线)要另起一个循环,且设更短的
stroke-width和不同stroke - 如果用 CSS 自定义属性驱动(如
--tick-step: 5),JS 必须监听变化并重绘,不能靠 CSS 自动响应
Canvas 刻度密度:在 arc() 或 lineTo() 循环中硬编码步长
Canvas 没有“刻度组件”,密度完全由你手写的循环控制。例如画 36 条等分刻度(每 10° 一道):
把任意文章或文档内容转换成精美的全屏翻页 HTML 演示文件(幻灯片风格)。当用户发来一篇文章、文档链接、Markdown 内容、或粘贴的文本,并且希望生成演示用的 HTML 时触发。支持任意内容来源:iWiki 链接、KM 链接、本地文件路径、直接粘贴的文本。生成的 HTML 文件保存到本地工作区,并通过企微直接发送给用户。触发词示例:帮我把这篇文章做成PPT、转成演示文档、生成HTML幻灯片、做个演示、转成可以演示的格式、article to deck、make a slide。
立即学习“前端免费学习笔记(深入)”;
const totalTicks = 36;
const angleStep = (endAngle - startAngle) / totalTicks;
for (let i = 0; i < totalTicks; i++) {
const angle = startAngle + i * angleStep;
const x1 = cx + Math.cos(angle) * radius;
const y1 = cy + Math.sin(angle) * radius;
const x2 = cx + Math.cos(angle) * (radius - tickLength);
const y2 = cy + Math.sin(angle) * (radius - tickLength);
ctx.moveTo(x1, y1);
ctx.lineTo(x2, y2);
}常见陷阱:
-
angleStep单位是**度数**,但Math.cos()要**弧度**,必须先转:const rad = (angle * Math.PI) / 180 - 刻度线长度不一致?检查是否漏了
ctx.beginPath(),否则所有线连成折线 - 高 DPI 屏幕下刻度变虚?加
ctx.imageSmoothingEnabled = false并按window.devicePixelRatio缩放 canvas 尺寸 - 想让密度随屏幕宽度自适应?别用固定
totalTicks,改用Math.round(radius * 0.1)这类动态值
别碰 <meter></meter> 的“密度”幻想
<meter value="75" min="0" max="100"></meter> 渲染出来永远只有一条色块,没有任何刻度线、数字或分段标识。浏览器不会根据 min/max 自动插 101 个 DOM 节点,CSS 也无法用 ::before 在它内部定位到 “50% 位置”。真要刻度,就得自己画 —— 这就是为什么所有生产级仪表盘都绕开 <meter></meter>,用 SVG 或 Canvas 从零搭。
最易被忽略的一点:刻度密度和指针动画必须共享同一套角度映射公式,否则哪怕密度调对了,指针也会指着两道刻度中间发呆。


















