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

React+Tailwind CSS环形进度条:百分比计算及属性疑问

SVG环形进度条:stroke-dasharray与stroke-dashoffset详解

一、stroke-dasharray 是什么?

stroke-dasharray 是SVG核心属性,用于定义描边的虚线样式,语法为逗号分隔的长度值列表,依次代表线段长度和线段间距。

以你提供的代码为例:

.progress-ring__circle { stroke-dasharray: 400, 400; ... }

这里的400是预先计算好的环形周长(公式:周长C=2×π×半径r,比如半径≈63.66时,C≈400)。设置400,400意味着:描边是一段400px的实线,紧接着一段400px的空白。因为环形总长度刚好是400px,空白部分超出了环形范围,所以初始状态下会显示完整的环形实线。

二、stroke-dashoffset 是什么?

stroke-dashoffset 是SVG属性,用于设置虚线的起始偏移量:数值为正时,虚线沿路径反方向(默认顺时针,偏移为正则逆时针移动)偏移对应长度;数值为负则向正方向偏移。

它的核心作用是通过偏移虚线,控制环形实线的显示长度,以此实现进度条的动态效果。

三、如何用这两个属性设置进度百分比?

核心逻辑是通过偏移量隐藏环形中未完成的部分,只保留对应百分比的实线长度。

以你代码中的stroke-dashoffset="calc(400 - (400 * 45) / 100)"为例:

  1. 基础值明确:400是环形总周长C,45是目标进度百分比
  2. 计算已完成长度:(C × 百分比) / 100 = (400×45)/100 = 180px
  3. 计算偏移量:C - 已完成长度 = 400 - 180 = 220px

当设置stroke-dashoffset=220时,原本的400px实线向左偏移220px,此时环形上可见的实线长度为400-220=180px,刚好对应总长度的45%,即45%的进度。

通用设置步骤:

    1. 计算环形周长:C = 2 × π × r(r是SVG中circle元素的r属性值,即环形半径)
    1. 给进度环的circle元素设置stroke-dasharray: C, C,确保初始显示完整环形
    1. 根据目标进度百分比P,计算偏移量:offset = C - (C × P) / 100
    1. 将offset赋值给stroke-dashoffset属性,即可显示对应百分比的进度

额外提示:通常会给circle元素添加transform: rotate(-90deg),让进度从环形顶部开始(默认SVG环形起点在右侧),这是优化视觉体验的辅助设置,不影响核心进度计算逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:53:09