CSS und mehrere Hintergrundverläufe
Anstatt zu versuchen, den grünen Teil zu zeichnen, können Sie stattdessen die weißen Teile zeichnen:
pie {
border-radius: 50%;
background-color: green;
}
.ten {
background-image:
linear-gradient(126deg, transparent 50%, white 50%),
linear-gradient(90deg, white 50%, transparent 50%);
}
pie {
width: 5em;
height: 5em;
display: block;
border-radius: 50%;
background-color: green;
border: 2px solid green;
float: left;
margin: 1em;
}
.ten {
background-image: linear-gradient(126deg, transparent 50%, white 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.twentyfive {
background-image: linear-gradient(180deg, transparent 50%, white 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.fifty {
background-image: linear-gradient(90deg, white 50%, transparent 50%);
}
.seventyfive {
background-image: linear-gradient(180deg, transparent 50%, green 50%), linear-gradient(90deg, white 50%, transparent 50%);
}
.onehundred {
background-image: none;
}
<pie class="ten"></pie>
<pie class="twentyfive"></pie>
<pie class="fifty"></pie>
<pie class="seventyfive"></pie>
<pie class="onehundred"></pie>
Demo: http://jsfiddle.net/jonathansampson/7PtEm/
Skalierbare Vektorgrafiken
Wenn dies eine Option ist, können Sie mit SVG <circle>
und <path>
Elementen einen ähnlichen Effekt erzielen . Folgendes berücksichtigen:
<svg>
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 190,35 z"></path>
</svg>
Das obige ist ziemlich einfach. Wir haben ein Element, das einen Kreis und einen Pfad enthält. Der Mittelpunkt des Kreises liegt bei 115 x 115 (wodurch das SVG-Element 230 x 230 wird). Der Kreis hat einen Radius von 110, was eine Gesamtbreite von 220 ergibt (wobei ein Rand von 10 verbleibt).
Wir fügen dann ein <path>
Element hinzu, was der komplizierteste Teil dieses Beispiels ist. Dieses Element verfügt über ein Attribut, das bestimmt, wo und wie der Pfad gezeichnet wird. Es beginnt mit folgendem Wert:
M115,115
Dies weist den Pfad an, in der Mitte des oben genannten Kreises zu beginnen. Als nächstes ziehen wir eine Linie von diesem Ort zum nächsten Ort:
L115,5
Dadurch wird eine vertikale Linie vom Mittelpunkt des Kreises bis zur Oberseite des Elements gezogen (also fünf Pixel von der Oberseite). An diesem Punkt werden die Dinge etwas komplizierter, aber immer noch sehr verständlich.
Wir zeichnen jetzt einen Bogen von unserem gegenwärtigen Standort (115,5):
A110,110 1 0,1 190,35 z
Dies erzeugt unseren Bogen und gibt ihm einen Radius, der dem unseres Kreises (110) entspricht. Die beiden Werte stellen den x-Radius und den y-Radius dar und beide sind gleich, da es sich um einen Kreis handelt. Der nächste Satz wichtiger Zahlen ist der letzte 190,35
. Dies teilt dem Bogen mit, wo er abgeschlossen werden soll.
Was den Rest der Informationen ( 1 0,1
und z
) betrifft, steuern diese die Krümmung, Richtung und das Ende des Bogens selbst. Sie können mehr darüber erfahren, indem Sie eine Online-SVG-Pfadreferenz konsultieren.
Um ein "Slice" einer anderen Größe zu erzielen, ändern Sie einfach das 190,35
, um einen größeren oder kleineren Satz von Koordinaten wiederzugeben. Möglicherweise müssen Sie einen zweiten Bogen erstellen, wenn Sie mehr als 180 Grad überspannen möchten.
Wenn Sie die x- und y-Koordinaten aus einem Winkel bestimmen möchten, können Sie die folgenden Gleichungen verwenden:
x = cx + r * cos(a)
y = cy + r * sin(a)
Mit dem obigen Beispiel wäre ein Grad von 76:
x = 115 + 110 * cos(76)
y = 115 + 110 * sin(76)
Welches gibt uns 205.676,177.272
.
Mit etwas Leichtigkeit können Sie Folgendes erstellen:
circle {
fill: #f1f1f1;
stroke: green;
stroke-width: 5;
}
path {
fill: green;
}
svg.pie {
width: 230px;
height: 230px;
}
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 190,35 z"></path>
</svg>
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 225,115 z"></path>
</svg>
<svg class="pie">
<circle cx="115" cy="115" r="110"></circle>
<path d="M115,115 L115,5 A110,110 1 0,1 115,225 A110,110 1 0,1 35,190 z"></path>
</svg>
Demo: http://jsfiddle.net/jonathansampson/tYaVW/