【问题标题】:CSS Only Pie Chart - How to add spacing/padding between slices?仅 CSS 饼图 - 如何在切片之间添加间距/填充?
【发布时间】:2019-11-09 19:56:54
【问题描述】:

我已经构建了一个仅 CSS 的饼图,但我需要在每个切片之间添加空间,几乎就像它是一个边框一样。我尝试为每个切片添加边框,但这实际上不起作用。

关于如何使这个 CSS 饼图看起来更像下图的任何想法?

这是我的代码:

.palette {
  height: 48px;
  width: 48px;
}
.palette .colorOuter1,
.palette .colorOuter2,
.palette .colorOuter3,
.palette .colorOuter4,
.palette .colorOuter5 {
  height: 200px;
  width: 200px;
  border-radius: 50%;
  position: absolute;
  top: 0;
  left: 0;
  clip: rect(0px, 200px, 200px, 100px);
}
.palette .colorOuter1 {
  clip: auto;
  background: #eee;
}
.palette .colorOuter2 {
  transform: rotate(0deg);
}
.palette .colorOuter2 {
  transform: rotate(72deg);
}
.palette .colorOuter3 {
  transform: rotate(144deg);
}
.palette .colorOuter4 {
  transform: rotate(216deg);
}
.palette .colorOuter5 {
  transform: rotate(288deg);
}
.palette .colorInner1,
.palette .colorInner2,
.palette .colorInner3,
.palette .colorInner4,
.palette .colorInner5 {
  position: absolute;
  top: 0;
  left: 0;
  width: 200px;
  height: 200px;
  border-radius: 50%;
  transform: rotate(72deg);
}
.palette .colorInner1 {
  background: #5D5E63;
  clip: rect(0px, 100px, 200px, 0px);
}
.palette .colorInner2 {
  background-color: #AEADA9;
  clip: rect(0px, 100px, 100px, 0px);
}
.palette .colorInner3 {
  background-color: #D5C4A8;
  clip: rect(0px, 100px, 100px, 0px);
}
.palette .colorInner4 {
  background-color: #AA875F;
  clip: rect(0px, 100px, 100px, 0px);
}
.palette .colorInner5 {
  background-color: #B7CBC7;
  clip: rect(0px, 100px, 100px, 0px);
}
.palette .centerOverlay {
  position: absolute;
  border-radius: 50%;
  top: 60px;
  left: 60px;
  background: #fff;
  width: 80px;
  height: 80px;
  display: block;
  clip: auto;
}
<div class="palette">
  <div class="colorOuter1">
    <div class="colorInner1"></div>
  </div>
  <div class="colorOuter2">
    <div class="colorInner2"></div>
  </div>
  <div class="colorOuter3">
    <div class="colorInner3"></div>
  </div>
  <div class="colorOuter4">
    <div class="colorInner4"></div>
  </div>
  <div class="colorOuter5">
    <div class="colorInner5"></div>
  </div>
  <div class="centerOverlay"></div>
</div>

【问题讨论】:

    标签: css pie-chart css-shapes


    【解决方案1】:

    您使用 CSS 旋转和剪辑实现饼图的方式使得您无法真正知道“边框”实际在哪里,我认为您无法使用 borderclip-path 来帮助您(也许clip-path 和多边形,对我来说太难了!)

    您可以在您的.centerOverlay 中放置更多divs 以充当更多剪贴蒙版,然后将它们定位,使它们的中点位于准确的中心、旋转和平移(不是很有趣,但是)。我在这里做了两个例子:

    .palette {
      height: 48px;
      width: 48px;
      position:relative;
    }
    .palette .colorOuter1,
    .palette .colorOuter2,
    .palette .colorOuter3,
    .palette .colorOuter4,
    .palette .colorOuter5 {
      height: 200px;
      width: 200px;
      border-radius: 50%;
      position: absolute;
      top: 0;
      left: 0;
      clip: rect(0px, 200px, 200px, 100px);
    }
    .palette .colorOuter1 {
      clip: auto;
      background: #eee;
    }
    .palette .colorOuter2 {
      transform: rotate(0deg);
    }
    .palette .colorOuter2 {
      transform: rotate(72deg);
    }
    .palette .colorOuter3 {
      transform: rotate(144deg);
    }
    .palette .colorOuter4 {
      transform: rotate(216deg);
    }
    .palette .colorOuter5 {
      transform: rotate(288deg);
    }
    .palette .colorInner1,
    .palette .colorInner2,
    .palette .colorInner3,
    .palette .colorInner4,
    .palette .colorInner5 {
      position: absolute;
      top: 0;
      left: 0;
      width: 200px;
      height: 200px;
      border-radius: 50%;
      transform: rotate(72deg);
    }
    .palette .colorInner1 {
      background: #5D5E63;
      clip: rect(0px, 100px, 200px, 0px);
    }
    .palette .colorInner2 {
      background-color: #AEADA9;
      clip: rect(0px, 100px, 100px, 0px);
    }
    .palette .colorInner3 {
      background-color: #D5C4A8;
      clip: rect(0px, 100px, 100px, 0px);
    }
    .palette .colorInner4 {
      background-color: #AA875F;
      clip: rect(0px, 100px, 100px, 0px);
    }
    .palette .colorInner5 {
      background-color: #B7CBC7;
      clip: rect(0px, 100px, 100px, 0px);
    }
    .palette .centerOverlay {
      position: absolute;
      border-radius: 50%;
      top: 60px;
      left: 60px;
      background: #fff;
      width: 80px;
      height: 80px;
      display: block;
      clip: auto;
    }
    .palette .north {
      position:absolute;
      top: -60px;
      left: 50%;
      background-color:white;
      width:4px;
      height:100px;
    
    }
    .palette .northeast {
      position:absolute;
      top: -10px;
      left: 50%;
      background-color:white;
      width:4px;
      height:100px;
      transform: rotate(72deg) translate(0px, -50px)
    
    }
    <div class="palette">
      <div class="colorOuter1">
        <div class="colorInner1"></div>
      </div>
      <div class="colorOuter2">
        <div class="colorInner2"></div>
      </div>
      <div class="colorOuter3">
        <div class="colorInner3"></div>
      </div>
      <div class="colorOuter4">
        <div class="colorInner4"></div>
      </div>
      <div class="colorOuter5">
        <div class="colorInner5"></div>
      </div>
      <div class="centerOverlay">
         <div class="north"></div>
         <div class="northeast"></div>
      </div>
      
    </div>

    【讨论】:

      【解决方案2】:

      首先,我将使用更少的依赖于clip-path 的代码重新创建它,如下所示:

      .palette {
        height: 200px;
        width: 200px;
        position:relative;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:50px solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(50% 50%, 50% 0%, 100% 0%,100% 33.745%); 
      }
      .color1 {
        transform:rotate(72deg);
        --c:blue;
      }
      .color2 {
        transform:rotate(144deg);
        --c:orange;
      }
      .color3 {
        transform:rotate(-72deg);
        --c:green;
      }
      .color4 {
        transform:rotate(-144deg);
        --c:purple;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>

      然后您可以将翻译应用于您的元素以创建间隙:

      .palette {
        height: 200px;
        width: 200px;
        position:relative;
        margin:20px;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:50px solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(50% 50%, 50% 0%, 100% 0%,100% 33.745%); 
      }
      .color1 {
        transform:rotate(72deg) translate(5px,-5px);
        --c:blue;
      }
      .color2 {
        transform:rotate(144deg) translate(5px,-5px);
        --c:orange;
      }
      .color3 {
        transform:rotate(-72deg) translate(5px,-5px);
        --c:green;
      }
      .color4 {
        transform:rotate(-144deg) translate(5px,-5px);
        --c:purple;
      }
      .color5 {
        transform:rotate(0) translate(5px,-5px);
        --c:red;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>

      或者,如果您想创建缺失部分的效果以保持圆形(如屏幕截图所示),您必须调整剪辑路径

      .palette {
        height: 200px;
        width: 200px;
        position:relative;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:50px solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(
          calc(50% + 5px) 50%, 
          calc(50% + 5px) 0%, 
          100% 0%,
          100% calc(33.745% - 5px),
          50% calc(50% - 5px)); 
      }
      .color1 {
        transform:rotate(72deg);
        --c:blue;
      }
      .color2 {
        transform:rotate(144deg);
        --c:orange;
      }
      .color3 {
        transform:rotate(-72deg);
        --c:green;
      }
      .color4 {
        transform:rotate(-144deg);
        --c:purple;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>

      有了 CSS 变量,我们可以轻松处理所有事情

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:var(--s) solid var(--c,red);
        border-radius:50%;
        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)); 
      }
      .color1 {
        transform:rotate(72deg);
        --c:blue;
      }
      .color2 {
        transform:rotate(144deg);
        --c:orange;
      }
      .color3 {
        transform:rotate(-72deg);
        --c:green;
      }
      .color4 {
        transform:rotate(-144deg);
        --c:purple;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
      </div>

      使用相同的代码,您可以轻松扩展到任意数量的切片:

      8 片:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:var(--s) solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          100% 0%,
          100% calc(0% - var(--g)/2),
          50% calc(50% - var(--g)/2)); 
      }
      .color1 {
        transform:rotate(45deg); /* 360/8 */
        --c:blue;
      }
      .color2 {
        transform:rotate(90deg);
        --c:orange;
      }
      .color3 {
        transform:rotate(135deg);
        --c:green;
      }
      .color4 {
        transform:rotate(180deg);
        --c:purple;
      }
      .color5 {
        transform:rotate(-45deg); /* 360/8 */
        --c:orange;
      }
      .color6 {
        transform:rotate(-90deg);
        --c:lightblue;
      }
      .color7 {
        transform:rotate(-135deg);
        --c:pink;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>

      3 片:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:var(--s) solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          100% 0%,
          100% calc(78.665% - var(--g)/2),
          50% calc(50% - var(--g)/2)); 
      }
      .color1 {
        transform:rotate(120deg);
        --c:blue;
      }
      .color2 {
        transform:rotate(-120deg);
        --c:orange;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
      </div>


      这是clip-path中使用的magic数字背后的公式:

      • 5 片:33.75% = 50% - tan(90deg - 72deg)*50%
      • 8片:0% = 50% - tan(90deg - 45deg)*50%
      • 3 片:78.665% = 50% - tan(90deg - 120deg)*50%

      所以 N 个切片的通用公式是 50%*(1 - tan(90deg - 360deg/N)) with N in [3 8]。如果N &lt; 3 我们有一些不需要复杂代码的琐碎情况。对于N &gt; 8,我们需要不同的clip-path 和不同的公式:50%*(1 + tan(360deg/N))

      以 10 个切片为例:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:var(--s) solid var(--c,red);
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          calc(86.327% - var(--g)/2) 0%,
          50% calc(50% - var(--g)/2)); 
      }
      .color1 {
        transform:rotate(36deg);
        --c:blue;
      }
      .color2 {
        transform:rotate(72deg);
        --c:orange;
      }
      .color3 {
        transform:rotate(108deg);
        --c:green;
      }
      .color4 {
        transform:rotate(144deg);
        --c:purple;
      }
      .color5 {
        transform:rotate(180deg);
        --c:lightblue;
      }
      .color6 {
        transform:rotate(-36deg);
        --c:silver;
      }
      .color7 {
        transform:rotate(-72deg);
        --c:black;
      }
      .color8 {
        transform:rotate(-108deg);
        --c:darkgreen;
      }
      .color9 {
        transform:rotate(-144deg);
        --c:pink;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>


      如果您想实现渐变着色的想法。这依赖于conic-gradient,因此暂时无法在 Firefox 上运行:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        border:var(--s) solid transparent;
        background:
           linear-gradient(#fff,#fff) padding-box,
           conic-gradient(from calc(-1*var(--d,0deg)), red,blue,green) border-box;
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          calc(86.327% - var(--g)/2) 0%,
          50% calc(50% - var(--g)/2)); 
        transform:rotate(var(--d,0deg));
      }
      .color1 {
        --d:36deg;
      }
      .color2 {
        --d:72deg;
      }
      .color3 {
        --d:108deg;
      }
      .color4 {
        --d:144deg;
      }
      .color5 {
        --d:180deg;
      }
      .color6 {
        --d:-36deg;
      }
      .color7 {
        --d:-72deg;
      }
      .color8 {
        --d:-108deg;
      }
      .color9 {
        --d:-144deg;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>

      您可以使用linear-gradient 模拟另一种渐变着色,您将获得更好的支持:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        padding:var(--s);
        background:
           linear-gradient(#fff,#fff)      content-box,
           linear-gradient(red,blue,green) padding-box;
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          100% 0%,
          100% calc(0% - var(--g)/2),
          50% calc(50% - var(--g)/2)); 
        transform:rotate(var(--d,0deg));
      }
      .palette > *:before {
        content:"";
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        padding:inherit;
        background:inherit;
        transform:rotate(calc(-1*var(--d,0deg)));
        border-radius:50%;
      }
      .color1 {
        --d:45deg;
      }
      .color2 {
        --d:90deg;
      }
      .color3 {
        --d:135deg;
      }
      .color4 {
        --d:180deg;
      }
      .color5 {
        --d:-45deg;
      }
      .color6 {
        --d:-90deg;
      }
      .color7 {
        --d:-135deg;
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>

      我们可以为全透明添加遮罩:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        background:linear-gradient(red,blue,green) padding-box;
        -webkit-mask:radial-gradient(farthest-side,transparent calc(99% - var(--s)),#fff calc(100% - var(--s))); 
        mask:radial-gradient(farthest-side,transparent calc(99% - var(--s)),#fff calc(100% - var(--s))); 
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          100% 0%,
          100% calc(0% - var(--g)/2),
          50% calc(50% - var(--g)/2)); 
        transform:rotate(var(--d,0deg));
      }
      .palette > *:before {
        content:"";
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        background:inherit;
        transform:rotate(calc(-1*var(--d,0deg)));
        border-radius:50%;
      }
      .color1 {
        --d:45deg;
      }
      .color2 {
        --d:90deg;
      }
      .color3 {
        --d:135deg;
      }
      .color4 {
        --d:180deg;
      }
      .color5 {
        --d:-45deg;
      }
      .color6 {
        --d:-90deg;
      }
      .color7 {
        --d:-135deg;
      }
      
      body {
        background:linear-gradient(to left,grey,#fff);
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
      </div>

      与圆锥梯度相同:

      .palette {
        --g:10px; /* The gap between shapes*/
        --s:50px; /* the size*/
      
        height: 200px;
        width: 200px;
        position:relative;
        display:inline-block;
        overflow:hidden;
      }
      .palette > * {
        position:absolute;
        top:0;
        left:0;
        right:0;
        bottom:0;
        background: conic-gradient(from calc(-1*var(--d,0deg)), red,blue,green);
        -webkit-mask:radial-gradient(farthest-side,transparent calc(99% - var(--s)),#fff calc(100% - var(--s))); 
        mask:radial-gradient(farthest-side,transparent calc(99% - var(--s)),#fff calc(100% - var(--s))); 
        
        border-radius:50%;
        clip-path:polygon(
          calc(50% + var(--g)/2) 50%, 
          calc(50% + var(--g)/2) 0%, 
          calc(86.327% - var(--g)/2) 0%,
          50% calc(50% - var(--g)/2)); 
        transform:rotate(var(--d,0deg));
      }
      .color1 {
        --d:36deg;
      }
      .color2 {
        --d:72deg;
      }
      .color3 {
        --d:108deg;
      }
      .color4 {
        --d:144deg;
      }
      .color5 {
        --d:180deg;
      }
      .color6 {
        --d:-36deg;
      }
      .color7 {
        --d:-72deg;
      }
      .color8 {
        --d:-108deg;
      }
      .color9 {
        --d:-144deg;
      }
      
      body {
        background:linear-gradient(to left,grey,white);
      }
      <div class="palette">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:40px;--g:20px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>
      
      <div class="palette" style="--s:60px;--g:0px">
        <div class="color1"></div>
        <div class="color2"></div>
        <div class="color3"></div>
        <div class="color4"></div>
        <div class="color5"></div>
        <div class="color6"></div>
        <div class="color7"></div>
        <div class="color8"></div>
        <div class="color9"></div>
        <div class="color10"></div>
      </div>

      对于 IE 支持

      这是另一个适用于旧浏览器的具有更多支持的想法:

      #colorWheel {
        width: 300px;
        height: 300px;
        position: relative;
        border-radius: 100%;
        overflow: hidden;
      }
      
      #colorWheel:after {
        content: "";
        position: absolute;
        border-radius: inherit;
        /* adjust the value to control the thickness*/
        top: 30px;
        left: 30px;
        right: 30px;
        bottom: 30px;
        /**/
        background: #fff;
      }
      
      #colorWheel span {
        position: absolute;
        border-style: solid;
        border-width: 150px 36px; /*adjust the 36px to control the distance*/
        left: 50%;
        top: 50%;
        color: transparent;
      }
      
      span:nth-child(1) {
        border-top-color: #bf6040;
        transform: translate(-50%, -50%) rotate(36deg);
      }
      
      span:nth-child(2) {
        border-top-color: #bf8040;
        transform: translate(-50%, -50%) rotate(72deg);
      }
      
      span:nth-child(3) {
        border-top-color: #bf9f40;
        transform: translate(-50%, -50%) rotate(108deg);
      }
      
      span:nth-child(4) {
        border-top-color: #bfbf40;
        transform: translate(-50%, -50%) rotate(144deg);
      }
      
      span:nth-child(5) {
        border-top-color: #9fbf40;
        transform: translate(-50%, -50%) rotate(180deg);
      }
      
      span:nth-child(6) {
        border-top-color: #80bf40;
        transform: translate(-50%, -50%) rotate(216deg);
      }
      
      span:nth-child(7) {
        border-top-color: #60bf40;
        transform: translate(-50%, -50%) rotate(252deg);
      }
      
      span:nth-child(8) {
        border-top-color: #40bf40;
        transform: translate(-50%, -50%) rotate(288deg);
      }
      
      span:nth-child(9) {
        border-top-color: #40bf60;
        transform: translate(-50%, -50%) rotate(324deg);
      }
      
      span:nth-child(10) {
        border-top-color: #40bf80;
        transform: translate(-50%, -50%) rotate(360deg);
      }
      <div id="colorWheel">
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
          <span></span>
        </div>

      这是一个轻松生成形状的 SASS 代码:

      $num:10;
      
      @for $i from 1 through $num {
        span:nth-child(#{$i}) {
          border-top-color: hsl($i * 15, 50%, 50%);
          transform: translate(-50%,-50%) rotate($i * (360deg/$num));
        }
      }
      
      #colorWheel {
        width: 300px;
        height: 300px;
        position: relative;
        border-radius: 100%;
        overflow: hidden;
      }
      #colorWheel:after {
        content:"";
        position:absolute;
        border-radius:50%;
        /* adjust the value to control the thickness*/
        top:30px;
        left:30px;
        right:30px;
        bottom:30px;
        /**/
        background:#fff;
      }
      
      
      #colorWheel span {
        position: absolute;
        border-style: solid;
        border-width: 150px 36px; /*adjust the 36px to control the distance*/
        left: 50%;
        top: 50%;
        color:transparent;
      }
      

      相关:Sass/CSS color wheel

      【讨论】:

      • 很棒的答案!我在这里看到的唯一潜在问题是 IE 11 似乎不支持 clip-path...caniuse.com/#feat=css-clip-path
      • @stwhite 是的 IE 对我不走运 :) 我可能会找到另一个技巧 ;)
      • 您是否偶然发现了另一种解决 IE 问题的方法?
      • @stwhite 我尝试了一些,但它变得很难维护。如果你想处理 IE11,我想你最好的方法是考虑 SVG,纯 CSS 会很痛苦。
      • @stwhite 如果您仍然感兴趣,我找到了 IE 支持的方法 ;) 检查最后的代码