CSS 圆形进度条

3
我想在https://bootsnipp.com/snippets/featured/circle-progress-bar使用进度条,但当网站上有2、3或更多类型时(每种类型有不同的百分比),我不知道如何设置少于50%,因为此代码会将右侧的进度条设置为每种类型。当我只想在第三个进度条显示少于50%时,我不知道该怎么办。

进度条类型:

 .progress .progress-right .progress-bar{
    left: -100%;
    border-top-left-radius: 80px;
    border-bottom-left-radius: 80px;
    border-right: 0;
    -webkit-transform-origin: center right;
    transform-origin: center right;
    animation: loading-1 1.8s linear forwards;
}

+

    @keyframes loading-1{
    0%{
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    100%{
        -webkit-transform: rotate(180deg);
        transform: rotate(180deg);
    }

“有人能帮帮我吗?”
2个回答

27

使用 SVG

svg {
  transform: rotate(-90deg);
  stroke-dasharray: 251; /* (2PI * 40px) */
  stroke-dashoffset: 251;
  animation: offsettozero 5s linear forwards;
}

@keyframes offsettozero {
  to {
    stroke-dashoffset: 0;
  }
}
<svg height="100" width="100">
 <circle cx="50" cy="50" r="40" stroke="#428bca" stroke-width="6" fill="#333" />
</svg> 

<!-- VV Click "Run code snippet" for demo -->


2
哇,这太棒了。 - OverCoder
1
应该是被接受的答案。在找到这个简单、轻量、高效的解决方案之前搜索了很多!谢谢。 - Jordan Breton

5

由于右侧动画是在所有进度圆圈之间共享的,如果你想制作一个小于50%的圆圈,你需要覆盖通用样式。这样你就不需要左侧动画。

因此,你的CSS可能如下:

.progress.yourDiv .progress-right .progress-bar {
  animation: yourAnimation 1.8s linear forwards;
}
.progress.yourDiv .progress-left .progress-bar{
  animation: none;
}

其中yourAnimation与Bootstrap示例中的.progress .progress-right .progress-bar共享右侧规则一样,只是名称不同。

要将动画设置为37.5%,yourAnimation应如下所示:

@keyframes yourAnimation{
    0%{
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
    }
    100%{
        -webkit-transform: rotate(135deg);
        transform: rotate(135deg);
    }
}

这是一个例子,其中.yourDiv.yellow,而yourAnimationloading-3

.progress {
  width: 150px;
  height: 150px !important;
  float: left;
  line-height: 150px;
  background: none;
  margin: 20px;
  box-shadow: none;
  position: relative;
}
.progress:after {
  content: "";
  width: 100%;
  height: 100%;
  border-radius: 50%;
  border: 12px solid #fff;
  position: absolute;
  top: 0;
  left: 0;
}
.progress>span {
  width: 50%;
  height: 100%;
  overflow: hidden;
  position: absolute;
  top: 0;
  z-index: 1;
}
.progress .progress-left {
  left: 0;
}
.progress .progress-bar {
  width: 100%;
  height: 100%;
  background: none;
  border-width: 12px;
  border-style: solid;
  position: absolute;
  top: 0;
}
.progress .progress-left .progress-bar {
  left: 100%;
  border-top-right-radius: 80px;
  border-bottom-right-radius: 80px;
  border-left: 0;
  -webkit-transform-origin: center left;
  transform-origin: center left;
}
.progress .progress-right {
  right: 0;
}
.progress .progress-right .progress-bar {
  left: -100%;
  border-top-left-radius: 80px;
  border-bottom-left-radius: 80px;
  border-right: 0;
  -webkit-transform-origin: center right;
  transform-origin: center right;
  animation: loading-1 1.8s linear forwards;
}
.progress .progress-value {
  width: 90%;
  height: 90%;
  border-radius: 50%;
  background: #44484b;
  font-size: 24px;
  color: #fff;
  line-height: 135px;
  text-align: center;
  position: absolute;
  top: 5%;
  left: 5%;
}
.progress.blue .progress-bar {
  border-color: #049dff;
}
.progress.blue .progress-left .progress-bar {
  animation: loading-2 1.5s linear forwards 1.8s;
}
.progress.yellow .progress-bar {
  border-color: #fdba04;
}
.progress.yellow .progress-right .progress-bar {
  animation: loading-3 1.8s linear forwards;
}
.progress.yellow .progress-left .progress-bar {
  animation: none;
}
@keyframes loading-1 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(180deg);
    transform: rotate(180deg);
  }
}
@keyframes loading-2 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(144deg);
    transform: rotate(144deg);
  }
}
@keyframes loading-3 {
  0% {
    -webkit-transform: rotate(0deg);
    transform: rotate(0deg);
  }
  100% {
    -webkit-transform: rotate(135deg);
    transform: rotate(135deg);
  }
}
<link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css'>


<div class="progress blue">
  <span class="progress-left">
                    <span class="progress-bar"></span>
  </span>
  <span class="progress-right">
                    <span class="progress-bar"></span>
  </span>
  <div class="progress-value">90%</div>
</div>

<div class="col-md-3 col-sm-6">
  <div class="progress yellow">
    <span class="progress-left">
                    <span class="progress-bar"></span>
    </span>
    <span class="progress-right">
                    <span class="progress-bar"></span>
    </span>
    <div class="progress-value">37.5%</div>
  </div>
</div>


非常感谢您!现在我明白了,并且能够操作这个片段了。 - Marek Cmarko
太棒了!不客气。请考虑接受并点赞此答案,这样其他人也知道您的问题已经解决了。 - cjl750

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接