You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

弧形进度条(Arc progress bar)Bug求助 - CSS/HTML/JS

弧形进度条超出刻度圈的问题解决

你的问题出在strokeDashoffset的计算逻辑和初始配置上,另外刻度圈的硬编码值也容易导致不一致,以下是具体修复方案:

核心问题分析

  1. strokeDashoffset的计算方向错误:你原来的写法是让进度条反向延伸,导致超出刻度圈范围;
  2. 刻度圈的strokeDasharray硬编码数值,无法和进度条的动态计算周长保持一致;
  3. 进度条初始状态未正确隐藏,导致默认显示部分超出区域。

修复后的代码

JS代码

let speedCircle = document.querySelector(".speed");
let meterCircle = document.querySelector(".meter");

let radius = speedCircle.r.baseVal.value;
// 计算75%圆周的长度
let circumference = 2 * radius * Math.PI * 0.75;

// 统一设置进度条和刻度圈的strokeDasharray,保证两者周长一致
speedCircle.style.strokeDasharray = circumference;
meterCircle.style.strokeDasharray = circumference;

// 初始状态让进度条完全隐藏
speedCircle.style.strokeDashoffset = circumference;

const progress = percent => {
    // 改为:总周长 - 进度占比对应的长度,实现正向填充
    speedCircle.style.strokeDashoffset = circumference - (percent / 100) * circumference;
}

progress(30);

CSS代码

.speed, .meter {
    fill: none;
    stroke-width: 10;
    transform-origin: center;
    transform: rotate(135deg);
}

.speed {
    stroke: green;
}

.meter {
    stroke: black;
    /* 移除硬编码值,由JS动态设置 */
}

HTML代码(无需修改)

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <link rel="stylesheet" href="style.css">
    <title>Document</title>
</head>
<body>
<svg width="250" height="250">
    <circle r="100" cx="125" cy="125" class="meter"></circle>
    <circle r="100" cx="125" cy="125" class="speed"></circle>
</svg>
<script src="script.js"></script>
</body>
</html>

修复说明

修改后进度条会从刻度圈的起始位置(旋转135度后的端点)开始,按照传入的百分比正向填充,完全贴合刻度圈的75%弧形范围,同时避免了硬编码数值带来的适配问题。

内容的提问来源于stack exchange,提问作者programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:48:25