带有透明中心的CSS径向/圆形进度指示器

3
我想使用CSS制作一个径向进度指示器,并使其中间的圆形部分透明。请参见此处:http://codepen.io/geedmo/pen/InFfd - 这是我想要做的完美示例,但是中间的.overlay有背景颜色,覆盖了更大的圆圈。然而,我希望它是透明的(更大的圆圈也应该是透明的)。如何实现?
<div class="wrap">

<div class="progress-radial progress-25">
  <div class="overlay">25%</div>
</div>

<div class="progress-radial progress-50">
  <div class="overlay">50%</div>
</div>

<div class="progress-radial progress-75">
  <div class="overlay">75%</div>
</div>

<div class="progress-radial progress-90">
  <div class="overlay">90%</div>
</div>

</div>

SASS:

// Colors
$barColor: tomato
$overlayColor: #fffde8
$backColor: #2f3439

@import url(http://fonts.googleapis.com/css?family=Noto+Sans)

body
  padding: 30px 0
  background-color: $backColor
  font-family: 'Noto Sans', sans-serif

.wrap
  width: 600px
  margin: 0 auto

/* -------------------------------------
 * Bar container
 * ------------------------------------- */
.progress-radial
  float: left
  margin-right: 30px
  position: relative
  width: 100px
  height: 100px
  border-radius: 50%
  border: 2px solid $backColor // remove gradient color


/* -------------------------------------
 * Optional centered circle w/text
 * ------------------------------------- */  
.progress-radial .overlay
  position: absolute
  width: 60px
  height: 60px
  background-color: $overlayColor
  border-radius: 50%
  margin-left: 20px
  margin-top: 20px
  text-align: center
  line-height: 60px
  font-size: 16px

/* -------------------------------------
 * Mixin for progress-% class
 * ------------------------------------- */

$step: 5 // step of % for created classes

$loops: round(100 / $step)
$increment: 360 / $loops
$half: round($loops / 2)
@for $i from 0 through $loops
  .progress-#{$i*$step}
    @if $i < $half
      $nextdeg: 90deg + ( $increment * $i )
      border-image: linear-gradient(90deg, $backColor 50%, transparent 50%, transparent), linear-gradient($nextdeg, $barColor 50%, $backColor 50%, $backColor)
    @else
      $nextdeg: -90deg + ( $increment * ( $i - $half ) )
      border-image: linear-gradient($nextdeg, $barColor 50%, transparent 50%, transparent), linear-gradient(270deg, $barColor 50%, $backColor 50%, $backColor)

This is the result I'd like to get:

result


这对我不起作用,当我使用检查器检查代码时,Chrome告诉我"border-image"属性的值无效。 - Eric McWinNEr
2个回答

2

HTML 代码:

<div class="wrapper">
    <div class="pie spinner lightBlue"></div>
    <div class="pie filler lightBlue"></div>
    <div class="mask"></div>               
</div>

CSS 代码:

body {
    background-color: #f3f3f4;
}

.lightBlue {
    border: 10px solid #a8d2d2;
}

.wrapper {
    width: 250px;
    height: 250px;   
    margin: 10px auto;
    position: relative;
    background: white;
    background-color: #f3f3f4;
    -webkit-transition: width 0.5s, height 0.5s;
    transition: width 0.5s, height 0.5s;
    -webkit-animation: finalRota 2s 10s linear forwards;
    animation: finalRota 2s 10s linear forwards;
}

.wrapper .pie {
    width: 50%;
    height: 100%;
    position: absolute;
    background-color: radial-gradient(left center, circle, #00ccff 0px, #000088 100%);
    -webkit-transform-origin: 100% 50%;
    -ms-transform-origin: 100% 50%;
    transform-origin: 100% 50%;
}

.wrapper .spinner {
    border-radius: 100% 0 0 100% / 50% 0 0 50%;
    z-index: 200;
    background-color: radial-gradient(right center, circle, #00ccff 0px, #000088 100%);
    border-right: none;
    -webkit-animation: rota 10s linear forwards;
    animation: rota 10s linear forwards;
}

.wrapper .filler {
    border-radius: 0 100% 100% 0 / 0 50% 50% 0;
    left: 50%;
    border: 10px solid #8dbdbb;
    opacity: 0;
    z-index: 100;
    border-left: none;
    -webkit-animation: fill 10s steps(1, end) forwards;
    animation: fill 10s steps(1, end) forwards;
}

.wrapper .mask {
    width: 50%;
    height: 100%;
    position: absolute;
    background: inherit;
    opacity: 1;
    z-index: 300;
    -webkit-animation: mask 10s steps(1, end) forwards;
    animation: mask 10s steps(1, end) forwards;
}

@-webkit-keyframes opoFinalRota {
    100% {
        -webkit-transform: rotate(30deg);        
        -ms-transform: rotate(30deg);        
        transform: rotate(30deg);
    }
}

@keyframes opoFinalRota {
    100% {
        -webkit-transform: rotate(30deg);        
        -ms-transform: rotate(30deg);        
        transform: rotate(30deg);
    }
}
@-webkit-keyframes rota {
    0% {
        -webkit-transform: rotate(300deg);
        transform: rotate(300deg);
    }
    100% {
        -webkit-transform: rotate(60deg);
        transform: rotate(60deg);
    }
}
@keyframes rota {
    0% {
        -webkit-transform: rotate(300deg);
        transform: rotate(300deg);
    }
    100% {
        -webkit-transform: rotate(60deg);
        transform: rotate(60deg);
    }
}
@-webkit-keyframes mask {
    0% {
        opacity: 1;
    }
    50%, 100% {
        opacity: 0;
    }
}
@keyframes mask {
    0% {
        opacity: 1;
    }
    50%, 100% {
        opacity: 0;
    }
}
@-webkit-keyframes fill {
    0% {
        opacity: 0;
    }
    50%, 100% {
        opacity: 1;
    }
}
@keyframes fill {
    0% {
        opacity: 0;
    }
    50%, 100% {
        opacity: 1;
    }
}

这里有一个演示:http://jsfiddle.net/usrs01ye/2/

enter image description here


1
亲爱的@simPod,我的目标是在图像中央放置一个计数器,作为数字...你能帮我填写吗?谢谢! - Ahmad MOUSSA
我不是@simPod :) 你可以在结账过程中添加一个div,具体操作请查看该存储库:https://github.com/zaabalonso/Instagram_stats_template - fizampou

0

只需将您的$overlayColor变量设置为transparent

$overlayColor: transparent

这里有一个可工作的codepen


我试图表明我不想要在句子“更大的圆圈也会有透明的中间部分”中出现这种情况。但是我的表述可能不够清晰。问题已更新。 - simPod

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