使用背景颜色的多色圆形div?

时间:2017-12-13 09:13:05

标签: html css css3 background background-color

我试图在CSS中创建一个多色圈来模拟一个幸运之轮,我尝试过使用线性渐变但它只是应用垂直穿过圆形div的颜色条而不是有色区域,好像你正在切割披萨,如果这是有道理的吗?

这是我尝试过的代码:

background: -moz-linear-gradient(left, red, red 20%, blue 20%, blue);

导致:

Wheel-attempt

但我希望它看起来更像这样?:

Coloured wheel

这在CSS中是否可行,或者我将不得不使用背景图像(我宁愿避免这种情况,因为它不像页面调整大小那样容易扩展等等。)?

7 个答案:

答案 0 :(得分:37)

有一些解决方案是使用多个背景图层,考虑旋转线性渐变。我们也可以依靠伪元素和一些透明的颜色。

然后只需调整颜色的度数,颜色,不透明度和伪元素的位置即可获得所需的任何图表:

.circle {
  margin: 20px;
  width: 200px;
  height: 200px;
  border-radius: 50%;
  background: 
    linear-gradient(to right, rgba(255,0,0,0.5) 50%, yellow 0%), 
    linear-gradient(-110deg, black 50%, pink 0%);
  position: relative;
  overflow: hidden;
}

.circle:after,
.circle:before{
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
}
.circle:after {
  background: linear-gradient(-45deg, rgba(255, 180, 180, 0.5) 50%, transparent 0%);
    bottom: 50%;
    left: 50%;
}

.circle:before {
  background: 
    linear-gradient(0deg, rgba(128, 169, 170, 0.5) 50%, transparent 0%), 
    linear-gradient(50deg, rgba(0, 169, 170, 1) 50%, transparent 0%);
}
<div class="circle"></div>

以下是考虑不同配置的更多示例

  1. 仅使用一个元素和多个渐变:
  2. .circle {
      margin: 20px;
      width: 200px;
      height: 200px;
      border-radius: 50%;
      background: linear-gradient(0deg, rgba(0, 255, 217, 0.4) 50%, transparent 0%), 
                  linear-gradient(45deg, rgba(0, 128, 0, 0.4) 50%, transparent 0%), 
                  linear-gradient(90deg, rgba(11, 255, 0, 0.4) 50%, transparent 0%), 
                  linear-gradient(135deg, pink 50%, transparent 0%), 
                  linear-gradient(180deg, brown 50%, transparent 0%),
                  linear-gradient(225deg, yellow 50%, transparent 0%),
                  linear-gradient(270deg, red 50%, transparent 0%);
      position: relative;
      overflow: hidden;
    }
    <div class="circle"></div>

    1. 每个元素使用多个元素和一个渐变:
    2. .circle {
        margin: 20px;
        width: 200px;
        height: 200px;
        border-radius: 50%;
        background: linear-gradient(to right, red 50%, yellow 0%);
        position: relative;
        overflow: hidden;
      }
      
      .circle:after {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        background: linear-gradient(45deg, rgba(255, 180, 180, 0.5) 50%, transparent 0%);
      }
      
      .circle:before {
        content: "";
        position: absolute;
        top: 0;
        left: 0;
        bottom: 0;
        right: 0;
        background: linear-gradient(125deg, rgba(128, 169, 170, 0.5) 50%, transparent 0%);
      }
      
      .circle-alt {
        width: 200px;
        height: 200px;
        border-radius: 50%;
        background: linear-gradient(to bottom, rgba(0, 250, 0, 0.5) 50%, rgba(0, 250, 255, 0.5) 0%);
        position: absolute;
        overflow: hidden;
      }
      <div class="circle">
        <div class="circle-alt"></div>
      </div>

      1. 每个元素使用多个元素和多个渐变,并且仅使用实体颜色(不更改background-position,如@vals的答案):
      2. .circle {
          margin: 20px;
          width: 200px;
          height: 200px;
          border-radius: 50%;
          background: linear-gradient(to right, red 50%, transparent 0%), 
                      linear-gradient(225deg, transparent 50%, blue 0%),
                      linear-gradient(0deg, green 50%, transparent 0%),
                      linear-gradient(-45deg, black 50%, transparent 0%),
                      linear-gradient(-90deg, yellow 50%, transparent 0%);
          position: relative;
          overflow: hidden;
        }
        
        .circle:before {
          content: "";
          position: absolute;
          top: 0;
          left: 0;
          bottom: 50%;
          right: 50%;
          background:linear-gradient(45deg,lightblue 50%, transparent 0%)
        }
        .circle:after {
          content: "";
          position: absolute;
          top: 50%;
          left: 0;
          bottom: 0;
          right: 50%;
          background:linear-gradient(135deg, brown 50%, pink 0%);
        }
        <div class="circle"></div>

        1. 财富之轮(随着轮换!):
        2. .circle {
            margin: 20px;
            width: 200px;
            height: 200px;
            border-radius: 50%;
            background: linear-gradient(to right, #06b51d 50%, transparent 0%), 
                        linear-gradient(60deg, #7e00ff 50%, transparent 0%), 
                        linear-gradient(30deg, #ff00bd 50%, transparent 0%), 
                        linear-gradient(0deg, #ff0000 50%, transparent 0%), 
                        linear-gradient(-30deg, #ff4700 50%, transparent 0%), 
                        linear-gradient(-60deg, #ffa500 50%, transparent 0%), 
                        linear-gradient(-90deg, #ffff00 50%, transparent 0%);
            position: relative;
            overflow: hidden;
            animation: rotate 6s linear infinite;
          }
          .circle:before {
            content: "";
            position: absolute;
            top: 0;
            left: 0;
            bottom: 50%;
            right: 50%;
            background: linear-gradient(210deg, transparent 64%, #09ffa5 0%),
                        linear-gradient(240deg, transparent 37%, #34ff00 0%);
          }
          
          .circle:after {
            content: "";
            position: absolute;
            top: 50%;
            left: 0;
            bottom: 0;
            right: 50%;
            background:linear-gradient(150deg, #00acff 37%, transparent 0%),
                       linear-gradient(120deg, #0075ff 63%, #1200ff 0%);
          }
          @keyframes rotate {
            from {
              transform: rotate(0deg);
            }
            to {
              transform: rotate(360deg);
            }
          }
          <div class="circle"></div>

答案 1 :(得分:19)

您可以使用边框进行此操作:

&#13;
&#13;
.chart {
  position: absolute;
  width: 0;
  height: 0;
  border-radius: 60px;
  -moz-border-radius: 60px;
  -webkit-border-radius: 60px;
}

#chart1 {
  border-right: 60px solid red;
  border-top: 60px solid transparent;
  border-left: 60px solid transparent;
  border-bottom: 60px solid transparent;
}

#chart2 {
  border-right: 60px solid transparent;
  border-top: 60px solid green;
  border-left: 60px solid transparent;
  border-bottom: 60px solid transparent;
}

#chart3 {
  border-right: 60px solid transparent;
  border-top: 60px solid transparent;
  border-left: 60px solid blue;
  border-bottom: 60px solid transparent;
}

#chart4 {
  border-right: 60px solid transparent;
  border-top: 60px solid transparent;
  border-left: 60px solid transparent;
  border-bottom: 60px solid yellow;
}
&#13;
<div id="chart1" class="chart"></div>
<div id="chart2" class="chart"></div>
<div id="chart3" class="chart"></div>
<div id="chart4" class="chart"></div>
&#13;
&#13;
&#13;

更新1

&#13;
&#13;
.pizza {
width: 300px;
height: 300px;
border-radius: 100%;
background: linear-gradient(45deg, lightblue 50%, blue 0%), linear-gradient(-45deg, green 50%, darkgreen 0%), linear-gradient(-45deg, #E5E500 50%, yellow 0%), linear-gradient(45deg, tomato 50%, red 0%);
background-size: 50% 50%;
background-position: 0% 0%, 100% 0%, 0 100%, 100% 100%;
background-repeat: no-repeat;
}
&#13;
<div class="pizza"></div>
&#13;
&#13;
&#13;

答案 2 :(得分:16)

可以使用称为圆锥渐变的东西来完成。不幸的是,他们现在还没有得到许多浏览器的支持。 Lea Verou创建了一个轻量级的JS插件,但可以使用它们:

https://leaverou.github.io/conic-gradient/

这可用于创建:

&#13;
&#13;
.elem {
width: 200px;
height: 200px;
background: conic-gradient(yellow 8.3%, greenyellow 0 16.6%, green 0 24.9%, darkgreen 0 33.2%, blue 0 41.5%, violet 0 49.8%, purple 0 58.1%, pink 0 66.4%, red 0 74.7%, orangered 0 83%, orange 0 91.3%, gold 0 100%);
border-radius: 50%
}
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
<script src="//cdn.rawgit.com/LeaVerou/conic-gradient/gh-pages/conic-gradient.js"></script>

<div class="elem"></div>
&#13;
&#13;
&#13;

答案 3 :(得分:10)

扩展@Temani Afif的答案,但更类似于您的要求:

&#13;
&#13;
.test {
  width: 600px;
  height: 600px;
  border-radius: 50%;
  background-size: 50% 50%;
  background-repeat: no-repeat;
  background-image: linear-gradient(150deg, transparent 63%, tomato 63%),  
    linear-gradient(120deg, transparent 36.5%, red 36.5%),
    linear-gradient(fuchsia, fuchsia),
    linear-gradient(240deg, transparent 63%, green 63%),  
    linear-gradient(210deg, transparent 36.5%, lime 36.5%),
    linear-gradient(lightgreen, lightgreen),
    linear-gradient(330deg, transparent 63%, blue 63%),  
    linear-gradient(300deg, transparent 36.5%, lightblue 36.5%),
    linear-gradient(cyan, cyan),
    linear-gradient(60deg, transparent 63%, papayawhip 63%),  
    linear-gradient(30deg, transparent 36.5%, yellow 36.5%),
    linear-gradient(gold, gold);
  background-position: right top, right top, right top, 
        right bottom, right bottom, right bottom,
        left bottom, left bottom, left bottom,
        left top, left top, left top;
}
&#13;
<div class="test"></div>
&#13;
&#13;
&#13;

答案 4 :(得分:7)

您可以使用css实现此目的,但是如果您想要12个切片,则必须使用更复杂的标记。如果您只想使用4或8,则可以使用多个背景的更简单的解决方案。

  • 使用border-radius和skew-trick绘制一个任意角度切片
  • 使用多个包裹的切片,每个切片都旋转

我更喜欢的另一个想法是:使用svg图形。

&#13;
&#13;
.container {
  position: absolute;
  left: 300px;
  top: 0;
}

.wrap {
  position: absolute;
  transform: rotate(30deg);
  transform-origin: 0% 100%;
}

.slice {
  height: 100px;
  width: 100px;
  overflow: hidden;
  transform-origin: 0% 100%;
  transform: skew(-60deg);
  position: relative;
}

.slice::before {
  height: inherit;
  width: inherit;
  position: absolute;
  content: "";
  border-radius: 0 100% 0 0;
  transform-origin: 0% 100%;
  transform: skew(60deg);
}

.wrap-0 {
  transform: rotate(0deg);
}

.wrap-0 .slice::before {
  background: hsl(0, 100%, 50%);
}

.wrap-1 {
  transform: rotate(30deg);
}

.wrap-1 .slice::before {
  background: hsl(30, 100%, 50%);
}

.wrap-2 {
  transform: rotate(60deg);
}

.wrap-2 .slice::before {
  background: hsl(60, 100%, 50%);
}

.wrap-3 {
  transform: rotate(90deg);
}

.wrap-3 .slice::before {
  background: hsl(90, 100%, 50%);
}

.wrap-4 {
  transform: rotate(120deg);
}

.wrap-4 .slice::before {
  background: hsl(120, 100%, 50%);
}

.wrap-5 {
  transform: rotate(150deg);
}

.wrap-5 .slice::before {
  background: hsl(150, 100%, 50%);
}

.wrap-6 {
  transform: rotate(180deg);
}

.wrap-6 .slice::before {
  background: hsl(180, 100%, 50%);
}

.wrap-7 {
  transform: rotate(210deg);
}

.wrap-7 .slice::before {
  background: hsl(210, 100%, 50%);
}

.wrap-8 {
  transform: rotate(240deg);
}

.wrap-8 .slice::before {
  background: hsl(240, 100%, 50%);
}

.wrap-9 {
  transform: rotate(270deg);
}

.wrap-9 .slice::before {
  background: hsl(270, 100%, 50%);
}

.wrap-10 {
  transform: rotate(300deg);
}

.wrap-10 .slice::before {
  background: hsl(300, 100%, 50%);
}

.wrap-11 {
  transform: rotate(330deg);
}

.wrap-11 .slice::before {
  background: hsl(330, 100%, 50%);
}
&#13;
<div class="container">
  <div class="wrap wrap-0">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-1">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-2">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-3">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-4">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-5">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-6">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-7">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-8">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-9">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-10">
    <div class="slice"></div>
  </div>
  <div class="wrap wrap-11">
    <div class="slice"></div>
  </div>
</div>
&#13;
&#13;
&#13;

答案 5 :(得分:6)

CSS Tricks有一个post about conic gradients,它将“彩色伞”描述为一个中间步骤,看起来非常适合您的使用。为方便起见,我把它放在Code Pen中。

<强> HTML:

<div class="wheel">
  <ul class="umbrella">
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
    <li class="color"></li>
  </ul>
</div>

<强> SCSS:

@mixin circle($size) {
  content: "";
  position: absolute;
  border-radius: 50%;
  width: $size;
  height: $size;
  left: calc(50% - #{$size/2});
  top: calc(50% - #{$size/2});
}

$wheel: 15em;
.color {
  @include circle($wheel);
  clip: rect(0, $wheel, $wheel, #{$wheel/2});
  &:after {
    @include circle($wheel);
    background: blue;
    clip: rect(0, #{$wheel/2}, $wheel, 0);
    transform: rotate(45deg);
  }
}

.color, .color:nth-child(n+7):after {
  clip: rect(0, $wheel, $wheel, #{$wheel/2});
}
.color:after, .color:nth-child(n+7) {
  @include circle($wheel);
  clip: rect(0, #{$wheel/2}, $wheel, 0);
}

$colors: (#9ED110, #50B517, #179067, #476EAF, #9f49ac, #CC42A2, #FF3BA7, #FF5800, #FF8100, #FEAC00, #FFCC00, #EDE604);
@for $i from 0 to length($colors) {
  .color:nth-child(#{1+$i}):after {
    background-color: nth($colors, $i+1);
    @if $i < 6 {
      transform: rotate(#{30*(1+$i)}deg);
      z-index: #{length($colors)-$i};
    } @else {
      transform: rotate(#{-30+(30*(1+$i))}deg);
    }
  }
}

作为旁注,如果背景图像的唯一问题是缩放问题,请记住SVG图像平滑缩放,因为它们基本上是矢量图形。 (你必须手动绘制,但图像会缩放。)

答案 6 :(得分:0)

<div class="circle">
    <div class="table italy">
        <div class="table-cell green"></div>
        <div class="table-cell white"></div>
        <div class="table-cell red"></div>
    </div>
</div>
<div class="circle">
    <div class="table france">
        <div class="table-cell blue"></div>
        <div class="table-cell white"></div>
        <div class="table-cell red"></div>
    </div>
</div>
<div class="circle">
    <div class="table windows">
        <div class="table-cell red"></div>
        <div class="table-cell green"></div>
        <div class="table-cell yellow"></div>
        <div class="table-cell blue"></div>
    </div>
</div>
<div class="circle">
    <div class="table rainbow">
        <div class="table-cell red"></div>
        <div class="table-cell orange"></div>
        <div class="table-cell yellow"></div>
        <div class="table-cell green"></div>
        <div class="table-cell blue"></div>
        <div class="table-cell indigo"></div>
        <div class="table-cell violet"></div>
    </div>
</div>

你有它:一种创建多色圆的可靠方法。这种方法的好处在于,无论你拥有多少种颜色都无关紧要。它可以一直回到IE。