html - css background color
Div circular multicolor con colores de fondo? (7)
Intento crear un círculo multicolor en CSS para simular una rueda de la fortuna. He intentado usar degradados lineales, pero solo aplica tiras de color que se extienden verticalmente a través del div circular en lugar de áreas de color como si estuvieras cortando una pizza si eso tiene sentido?
Este es el código que he intentado:
background: -moz-linear-gradient(left, red, red 20%, blue 20%, blue);
Lo que resulta en:
Pero quiero que se vea más así?
¿Es esto posible en CSS o voy a tener que usar una imagen de fondo (prefiero evitar esto porque no es tan fácil de escalar a medida que cambia el tamaño de la página, etc.)?
Ampliando con la respuesta de @Temani Afif, pero más similar a su solicitud:
.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;
}
<div class="test"></div>
CSS Tricks tiene una publicación sobre gradientes cónicos que describe el "paraguas colorido" como un paso intermedio, que se ve perfecto para su uso. Lo armé en un Code Pen para mayor comodidad.
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);
}
}
}
Como nota al margen, si su único problema con las imágenes de fondo es el problema de escalado, tenga en cuenta que las imágenes SVG se escalan sin problemas, ya que básicamente son gráficos vectoriales. (Tendría que dibujar eso manualmente, pero la imagen se escalaría).
Puede lograr esto con css, pero como quiera 12 segmentos, tendrá que usar un marcado más complicado. Si solo quiere usar 4 u 8, sería posible una solución mucho más simple usando un fondo múltiple.
- Usa el radio del borde combinado con un truco de sesgo para dibujar un trozo de ángulo de arbitraje
- Use múltiples rebanadas envueltas, cada una girada
Otra idea que preferiría: usar un gráfico svg para eso.
.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%);
}
<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>
Puedes hacer esto usando bordes:
.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;
}
<div id="chart1" class="chart"></div>
<div id="chart2" class="chart"></div>
<div id="chart3" class="chart"></div>
<div id="chart4" class="chart"></div>
ACTUALIZACIÓN 1
.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;
}
<div class="pizza"></div>
Se puede hacer usando algo llamado gradientes cónicos. Desafortunadamente, no son compatibles con muchos navegadores en este momento. Lea Verou creó un ligero plugin JS que puede permitir su uso:
https://leaverou.github.io/conic-gradient/
Esto podría usarse para crear:
.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%
}
<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>
Una solución para tener algo como esto es usar un pseudo elemento, un color transparente y un degradado lineal rotado .
Puede considerar los elementos uno sobre el otro y / o usar múltiples degradados en el mismo elemento.
Luego, simplemente ajuste los grados, los colores, la opacidad de los colores y la posición del pseudo elemento para obtener cualquier gráfico que desee (ver más ejemplos a continuación y una simulación de la rueda de la fortuna )
.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 {
content: "";
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
background: linear-gradient(-60deg, 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(0deg, rgba(128, 169, 170, 0.5) 50%, transparent 0%), linear-gradient(30deg, rgba(0, 169, 170, 1) 50%, transparent 0%);
}
<div class="circle"></div>
ACTUALIZAR
Para más detalles, la respuesta aquí es más ejemplos utilizando las técnicas explicadas anteriormente:
- Usando solo un elemento y gradiente múltiple
.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>
- Usar elementos múltiples y un gradiente por elemento:
.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>
- Usar elementos múltiples y múltiples degradados por elementos y solo color sólido (sin cambiar
background-position
como la respuesta de @vals):
.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>
- La rueda de la fortuna (¡con rotación!):
.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>
<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>
Ahí lo tienes: una forma confiable de crear círculos multicolores. Lo bueno de este enfoque es que no importa cuántos colores tengas Y funciona todo el camino de regreso a IE.