css 构建循环百分比图表

pbpqsu0x  于 2023-11-19  发布在  其他
关注(0)|答案(4)|浏览(113)

我想建立一个响应SVG圆形图,我已经成功了一定程度。
HTML

<div>
            <p class="Project_Analytics_Heading text-center">
                Time per Application
            </p>
            <svg viewBox="0 0 36 36" class="circular-chart">

                <path class="that-circle" stroke="#ffba00" stroke-dasharray="50" d="M18 2.0845
                                a 15.9155 15.9155 0 0 1 0 31.831
                                a 15.9155 15.9155 0 0 1 0 -31.831" />

                <path class="that-circle" stroke="#ff4858" stroke-dasharray="25" d="M18 2.0845
                                a 15.9155 15.9155 0 0 1 0 31.831
                                a 15.9155 15.9155 0 0 1 0 -31.831" />

                <path class="that-circle" stroke="#845cee" stroke-dasharray="25" d="M18 2.0845
                                a 15.9155 15.9155 0 0 1 0 31.831
                                a 15.9155 15.9155 0 0 1 0 -31.831" />

                <text x="18" y="20.35" class="percentage">50%</text>
                <text x="13" y="25" class="percentage_done">iOS</text>

            </svg>
        </div>

字符串
CSS

.circular-chart {
  display: block;
  margin: 5% auto;
  max-width: 80%;
  max-height: 240px;
  margin-bottom: 15%;
}
.that-circle {
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  animation: progress 1s ease-out forwards;
  box-shadow: 0 8px 25px 0 #e5e5e5;
}
@keyframes progress {
  0% {
    stroke-dasharray: 0 100;
  }
}

.percentage {
  fill: #4285f4;
  font-size: 0.375em;
  text-anchor: middle;
  font-family: AvenirNext;
  font-weight: bold;
  font-style: normal;
  font-stretch: normal;
  line-height: 1;
  letter-spacing: normal;
}
.percentage_done {
  fill: #9b9b9b;
  font-size: 0.2em;
  font-family: AvenirNext;
  font-weight: 500;
  font-style: normal;
  font-stretch: normal;
  line-height: normal;
  letter-spacing: 0.1px;
}


获取输出
x1c 0d1x的数据
期望输出



我认为笔画-破折号数组有问题。
非常感谢您的评论。
我提到
https://medium.com/@pppped/how-to-code-a-responsive-circular-percentage-chart-with-svg-and-css-3632f8cd7705

vptzau2j

vptzau2j2#

我已经找到了一种方法与我自己的逻辑尝试

.circular-chart {
  display: block;
  margin: 5% auto;
  max-width: 80%;
  max-height: 240px;
  margin-bottom: 15%;
}
.that-circle {
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  animation: progress 1s ease-out forwards;
  box-shadow: 0 8px 25px 0 #e5e5e5;
}
@keyframes progress {
  0% {
    stroke-dasharray: 0 100;
  }
}

.percentage {
  fill: #4285f4;
  font-size: 0.375em;
  text-anchor: middle;
  font-family: AvenirNext;
  font-weight: bold;
  font-style: normal;
  font-stretch: normal;
  line-height: 1;
  letter-spacing: normal;
}
.percentage_done {
  fill: #9b9b9b;
  font-size: 0.2em;
  font-family: AvenirNext;
  font-weight: 500;
  font-style: normal;
  font-stretch: normal;
  line-height: normal;
  letter-spacing: 0.1px;
}

个字符

示例1:===>如果i有3个元素50,25,25,我们必须编写函数,使得从最后一个元素

第三元素
我们必须将行程设置为25 100
->其中25是第一次尝试时的值,满分为100
第二元素
我们必须设置行程dasharray 50 75
-->第一个值是50,因为(2nd元素+ 3rd元素)==> 25 + 25 ==> 50
-->第二个值是75,因为(100 -第三个元素值)==> 100-25 ==> 75
第一元素
我们必须设置冲程-dasharray 100 50
-->第一个值是100,因为(1st元素+ 2nd元素+ 3rd元素)==> 50 + 25 + 25 ==> 100
-->第二个值是50,因为(100 -(第二个元素+第三个元素值))==> 100-(25 + 25)==> 50

示例2:=>如果i有4个元素30,20,40,10,我们必须编写函数,使得从最后一个元素

第四元素
我们必须设置冲程-dasharray 10 100
--->其中10是第一次尝试时的值,满分为100
第三元素
我们必须设置行程-dasharray 50 90
->第一个值是50,因为(第三个元素+第四个元素)==> 40 + 10 ==> 50
-->第二个值是90,因为(100 -第三个元素值)==> 100-10 ==> 90
第二元素
我们必须设置冲程-dasharray 70 50
-->第一个值是70,因为(第二个元素+第三个元素+第四个元素)==> 20 + 40 + 10 ==> 70
-->第二个值是50,因为(100 -(第三个元素值+第四个元素))==> 100 -(40+10)==> 50
第一元素
我们必须设置冲程达沙雷100 30
-->第一个值是100,因为(第一个元素+第二个元素+第三个元素+第四个元素)==> 30+ 20 + 40 + 10 ==> 100
-->第二个值是30,因为(100 -(第二个元素+第三个元素+第四个元素值))==> 100-(20 + 40 + 10)==> 30
我希望你能理解这个逻辑

ht4b089n

ht4b089n3#

这就是我要做的:我会将stroke-dashoffset从50设置为0。
在你的代码中,我改变了笔画-dasharray。在这种情况下,第一个值是笔画的长度,第二个值是差距的长度。差距必须足够大,以便笔画只出现一次。在代码中,我使用100,周长的值。
第一条路径放在最后,因为我希望它在其他两条路径之上。对于这条路径,我使用stroke-dasharray="50,100",笔划的长度为50,差距为100。
对于第一条路径,我使用stroke-dasharray="70,100" Why 75?50+25 = 75。前50个单位位于下一条路径下。只有25个单位将保持可见。
最后一个路径先走,这个路径的stroke-dasharray="100,100".75单元现在在前面的路径下面。
我希望这是你需要的。

svg{border:1px solid}
.circular-chart {
  display: block;
  margin: 5% auto;
  max-width: 80%;
  max-height: 240px;
  margin-bottom: 15%;
}
.that-circle {
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  stroke-dashoffset:50;
  animation: progress 1s ease-out forwards;
  box-shadow: 0 8px 25px 0 #e5e5e5;
}
@keyframes progress {
  100% {
    stroke-dashoffset: 0;
  }

}

.percentage {
  fill: #4285f4;
  font-size: 0.375em;
  text-anchor: middle;
  font-family: AvenirNext;
  font-weight: bold;
  font-style: normal;
  font-stretch: normal;
  line-height: 1;
  letter-spacing: normal;
}
.percentage_done {
  fill: #9b9b9b;
  font-size: 0.2em;
  font-family: AvenirNext;
  font-weight: 500;
  font-style: normal;
  font-stretch: normal;
  line-height: normal;
  letter-spacing: 0.1px;
}

个字符

yqkkidmi

yqkkidmi4#

.circular-chart {
  display: block;
  margin: 5% auto;
  max-width: 80%;
  max-height: 240px;
  margin-bottom: 15%;
}
.that-circle {
  fill: none;
  stroke-width: 2;
  stroke-linecap: round;
  animation: progress 1s ease-out forwards;
  box-shadow: 0 8px 25px 0 #e5e5e5;
}
@keyframes progress {
  0% {
    stroke-dasharray: 0 100;
  }
}

.percentage {
  fill: #4285f4;
  font-size: 0.375em;
  text-anchor: middle;
  font-family: AvenirNext;
  font-weight: bold;
  font-style: normal;
  font-stretch: normal;
  line-height: 1;
  letter-spacing: normal;
}
.percentage_done {
  fill: #9b9b9b;
  font-size: 0.2em;
  font-family: AvenirNext;
  font-weight: 500;
  font-style: normal;
  font-stretch: normal;
  line-height: normal;
  letter-spacing: 0.1px;
}

个字符

相关问题