这些圆形进度条是如何填充的?

How are these circular progress bars filled?

我发现了一些圆形进度条,但我不知道它们是如何填充的。这是一些代码笔的 link:https://codepen.io/anon/pen/aeEEmx

据我所知,当您使用渐变并添加位置(在本例中为 deg)时,它应该从您指定值的位置开始。例如,css 中进度为 20 class 的线性梯度有一个 18 度,然后另一个线性梯度为 90 度,但我不明白这些值如何一起工作 18 度和 90 度或 -18 度那个 90deg 有 30%。

代码如下:

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html,
body {
  background-color: #fff;
  font-family: "Lato", "Arial", "san-serif";
  color: #555;
  font-size: 20px;
  font-weight: 300px;
  text-rendering: optimizeLegibility;
}

.radialProgressBar {
  border-radius: 50%;
  -webkit-transform: translate(50%, 50%);
  transform: translate(50%, 50%);
  width: 100px;
  height: 100px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  background: #ddd;
  margin: 20px;
}

.radialProgressBar .overlay {
  border-radius: 50%;
  width: 80px;
  height: 80px;
  margin: auto;
  background: #fff;
  text-align: center;
  padding-top: 30%;
}

.progress-20 {
  background-image: linear-gradient(18deg, #ddd 50%, transparent 50%), linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}

.progress-30 {
  background-image: linear-gradient(-18deg, #ddd 50%, transparent 50%), linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}

.progress-40 {
  background-image: linear-gradient(-54deg, #ddd 50%, transparent 50%), linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}

.progress-70 {
  background-image: linear-gradient(90deg, #028cd5 50%, transparent 50%), linear-gradient(18deg, #028cd5 50%, #ddd 50%);
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div class="radialProgressBar progress-20">
    <div class="overlay">20</div>
  </div>
  <div class="radialProgressBar progress-30">
    <div class="overlay">30</div>
  </div>
  <div class="radialProgressBar progress-40">
    <div class="overlay">40</div>
  </div>
  <div class="radialProgressBar progress-70">
    <div class="overlay">70</div>
  </div>
</body>

</html>

这是使用多个重叠渐变制作的。如果您对各种渐变使用不同的颜色,您可以更容易地看到该方法。 90 度渐变将图表切成两半,而另一个(在本例中为 18 度)覆盖了其余的蓝色,只留下相关的蓝色部分可见。

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

html,
body {
  background-color: #fff;
  font-family: "Lato", "Arial", "san-serif";
  color: #555;
  font-size: 20px;
  font-weight: 300px;
  text-rendering: optimizeLegibility;
}

.radialProgressBar {
  border-radius: 50%;
  -webkit-transform: translate(50%, 50%);
  transform: translate(50%, 50%);
  width: 100px;
  height: 100px;
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  background: #ddd;
  margin: 20px;
}

.radialProgressBar .overlay {
  border-radius: 50%;
  width: 80px;
  height: 80px;
  margin: auto;
  text-align: center;
  padding-top: 30%;
}

.oneGradient {
  background-image: linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}

.differentColor {
  background-image: linear-gradient(18deg, #aaa 50%, transparent 50%), linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}

.sameColor {
  background-image: linear-gradient(18deg, #ddd 50%, transparent 50%), linear-gradient(90deg, #028cd5 50%, #ddd 50%);
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <div class="radialProgressBar oneGradient">
    <div class="overlay"></div>
  </div>
  <div class="radialProgressBar differentColor">
    <div class="overlay"></div>
  </div>
  <div class="radialProgressBar sameColor">
    <div class="overlay"></div>
  </div>
</body>

</html>

这个是用 SVG 元素 制作的。虽然很简单。如果你想要 stroke-dasharray 属性 运行,就玩玩吧;其中“73”是当前百分比,“100”是总百分比。

.percentage-container {
    width: 280px;
    height: 280px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 100%;
    position: relative;
    overflow: hidden;
}

.progress {
    background-color: rgba(209,218,225,.3);
    position: absolute;
    top: 0;
    left: 0;
    bottom: 0;
    right: 0;
    stroke: #FF4C1D;
    stroke-width: 10px;
    stroke-dasharray: 73, 100;
    transition: stroke-dasharray 280ms cubic-bezier(0.4,0,0.2,1);
    -webkit-transition: stroke-dasharray 280ms cubic-bezier(0.4,0,0.2,1);
}

.percentage-inner-container {
    width: 90%;
    height: 90%;
    border-radius: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
    background-color: #FFF;
    z-index: 1;
}

.percentage-amount {
    font-family: 'Arial', sans-serif;
    font-size: 70px;
    color: #34495E;
}

.percentage-amount::after {
    content: '%';
    font-size: 26px;
    position: relative;
    bottom: 30px;
}
<div class="percentage-container">
     <svg class="progress" viewBox="0 0 36 36"><path 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></svg>
     <div class="percentage-inner-container">
          <span class="percentage-amount">73</span>
     </div>
</div>