CSS甜甜圈图表仅在顶部添加边框

4
我有一个CSS和HTML的fiddle https://jsfiddle.net/kywetbeL/19/。我想制作一个有5个块、边框和每个部分之间有小间隙的甜甜圈图表。

* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

.donut-chart {
  position: relative;
  width: 200px;
  height: 200px;
  margin: 0 auto 2rem;
  border-radius: 100%
}

p.center {
  background: #ffffff;
  position: absolute;
  text-align: center;
  font-size: 28px;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  width: 130px;
  height: 130px;
  margin: auto;
  border-radius: 50%;
  line-height: 35px;
  padding: 15% 0 0;
}

.portion-block {
  border-radius: 50%;
  clip: rect(0px, 200px, 200px, 100px);
  height: 100%;
  position: absolute;
  width: 100%;
}

.circle {
  border-radius: 50%;
  clip: rect(0px, 100px, 200px, 0px);
  height: 100%;
  position: absolute;
  width: 100%;
  font-family: monospace;
  font-size: 1.5rem;
}

#part1 {
  transform: rotate(326deg);
}

#part1 .circle {
  background-color: #E64C65;
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  animation: first 1s 1 forwards;
}

#part2 {
  transform: rotate(38deg);
}

#part2 .circle {
  background-color: #11A8AB;
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  animation: second 1s 1 forwards 1s;
}

#part3 {
  transform: rotate(110deg);
}

#part3 .circle {
  background-color: #4FC4F6;
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  animation: third 0.5s 1 forwards 2s;
}

#part4 {
  transform: rotate(182deg);
}

#part4 .circle {
  background-color: #4FC433;
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  animation: fourth 0.5s 1 forwards 3s;
}

#part5 {
  transform: rotate(254deg);
}

#part5 .circle {
  background-color: #4FC888;
  border-top: 1px solid black;
  border-left: 1px solid black;
  border-right: 1px solid black;
  border-bottom: 1px solid black;
  animation: fifth 0.5s 1 forwards 4s;
}


/* Animation */

@keyframes first {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(68deg);
  }
}

@keyframes second {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(68deg);
  }
}

@keyframes third {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(68deg);
  }
}

@keyframes fourth {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(68deg);
  }
}

@keyframes fifth {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(68deg);
  }
}
<div class="container">
  <div class="donut-chart-block block">
    <div class="donut-chart">
      <div id="part1" class="portion-block">
        <div class="circle"></div>
      </div>
      <div id="part2" class="portion-block">
        <div class="circle"></div>
      </div>
      <div id="part3" class="portion-block">
        <div class="circle"></div>
      </div>
      <div id="part4" class="portion-block">
        <div class="circle"></div>
      </div>
      <div id="part5" class="portion-block">
        <div class="circle"></div>
      </div>
      <p class="center"></p>
    </div>
  </div>
</div>

我似乎无法将边框围绕整个元素,只有顶部。

我确实看到整个图表周围有一个边框 - 1像素的黑色边框,对吧?您能否提供有关您未看到的任何其他详细信息或浏览器版本? - Andrew
我希望每个 div(每个不同颜色的部分)都有自己的边框,而不是整个圆形。 - jshill103
黑色边框在技术上位于圆形的外部周围。剪辑属性只是将它们裁剪掉了。 - Suavocado
这是我在想的。有人有关于如何让它显示的想法吗? - jshill103
我不确定只用CSS怎么做。你可能需要使用SVG来完成这个任务。 - Suavocado
是你块内的.circle元素有边框,所以给每个元素不同的边框颜色有什么问题呢?https://jsfiddle.net/kywetbeL/27/ - CBroe
1个回答

1

首先,根据我的之前的回答更新您的代码,然后考虑使用过滤器创建边框:

.palette {
  --g: 10px; /* The gap between shapes*/
  --s: 50px; /* the size*/

  width: 250px;
  aspect-ratio: 1;
  display: inline-grid;
  filter: drop-shadow(0 0 1px #000) drop-shadow(0 0 0 #000) drop-shadow(0 0 0 #000) drop-shadow(0 0 0 #000)
}
.palette > * {
  grid-area: 1/1;
  position: relative;
  clip-path:polygon(
    calc(50% + var(--g)/2) 50%, 
    calc(50% + var(--g)/2) 0%, 
    100% 0%,
    100% calc(33.745% - var(--g)/2),
    50% calc(50% - var(--g)/2)); 
}
.palette > *:before {
  content:"";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: var(--s) solid #0000;
  border-left-color: var(--c);
  animation:m 1s linear both var(--d,0s);
}
@keyframes m {
  from{transform:rotate(45deg)}
  to  {transform:rotate(135deg)}
}

.color1 {
  transform: rotate(0deg);
  --c: red;
}
.color2 {
  transform: rotate(72deg);
  --c:blue;
  --d:1s;
}
.color3 {
  transform: rotate(144deg);
  --c:orange;
  --d:2s;
}
.color4 {
  transform: rotate(216deg);
  --c:green;
  --d:3s;
}
.color5 {
  transform: rotate(288deg);
  --c:purple;
  --d:4s;
}
<div class="palette">
  <div class="color1"></div>
  <div class="color2"></div>
  <div class="color3"></div>
  <div class="color4"></div>
  <div class="color5"></div>
</div>


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