Wenn ich Filter, Schatten, Transformationen oder Gradient-Hintergründe in CSS erstelle, fühlt es sich großartig an. Wer hätte gedacht, dass CSS so weit kommen würde. Keine Notwendigkeit, Bilder für so etwas zu verwenden. Ich kann fast hören, wie der Browser mir sagt: „Mach dir keine Sorgen, ich mache das für dich.“
Trotz all dieser Entwicklung hat CSS immer noch Einschränkungen. Beispielsweise können Hintergrundverläufe nur in linearer oder radialer Form erstellt werden, aber nicht in einer konischen Form.
Im Jahr 2011 begann Lea Verou einen Thread zur Implementierung eines nativen CSS-konischen Verlaufs und erstellte eine Entwurfsspezifikation, die bereits in den offiziellen Entwurf des W3C aufgenommen wurde. Wir müssen jedoch immer noch darauf warten, dass das W3C die Funktion formalisiert und die Browser sie implementieren, was noch einige Zeit dauern könnte. In der Zwischenzeit zeige ich Ihnen, wie Sie einen konischen Verlauf mit nur CSS3 simulieren können.

Schön, nicht wahr? Schauen wir uns den Code an!
Der Anfang
Um Code-Duplizierung zu reduzieren, verwende ich Sass. Eines der interessantesten Features von CSS-Präprozessoren ist das @mixin. Ein @mixin ist eine Mischung aus Funktion und Include, die bei Aufruf ihren Inhalt zurückgibt.
@mixin circle($size) {
content: "";
position: absolute;
border-radius: 50%;
width: $size;
height: $size;
left: calc(50% - #{$size/2});
top: calc(50% - #{$size/2});
}
Dieses @mixin wird nur verwendet, um Eigenschaften von Form und Platzierung festzulegen, und erstellt einen Kreis mit absoluter Position, der horizontal und vertikal relativ zu seinem Elternelement zentriert ist.
Die Magie!
Durch die Kombination eines @mixin circle mit der clip-Eigenschaft können wir einen Halbkreis erhalten. Beginnen wir mit der Erstellung eines vollen Kreises, indem wir zwei Halbkreise (mit unterschiedlichen Farben) zusammenlegen. Können Sie sich vorstellen, was passieren wird, wenn wir einen der Halbkreise drehen? Magie!
$wheel: 15em;
.color {
@include circle($wheel);
background: red;
clip: rect(0, $wheel, $wheel, #{$wheel/2});
&:after {
@include circle($wheel);
background: blue;
clip: rect(0, #{$wheel/2}, $wheel, 0);
transform: rotate(45deg);
}
}
Die clip: rect (top, right, bottom, left)-Eigenschaft beschränkt den sichtbaren Bereich auf ein rechteckiges Element, wodurch im obigen Beispiel nur die Hälfte des roten Kreises sichtbar ist. Das gleiche Prinzip wird auf den blauen Kreis, das .color:after-Element, angewendet. Zu diesem Zeitpunkt hätten wir einen vollen Kreis, der halb rot und halb blau ist. **Die transform-Eigenschaft bewirkt jedoch, dass der sichtbare Bereich des blauen Kreises in den des roten Kreises eindringt**. Beispiel ansehen.

Der bunte Regenschirm

Wir wissen bereits, wie dieser Zaubertrick funktioniert. Erstellen wir einen Regenschirm mit 12 Farben
<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>
Da wir einen vollen Kreis durch die Kombination von Halbkreisen erstellen wollen, müssen wir ab dem siebten Element (dem ersten Element der zweiten Hälfte) den Clip umkehren
.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);
}
Ab dem siebten Element wird das .color zu einem Halbkreis mit der linken Hälfte des Kreises, und die .color:after-Elemente gehen zur rechten Hälfte des Kreises über.
Wir sind fast fertig!! Wir müssen die Farben und den Winkel jedes Elements ändern. Wieder einmal missbrauchen wir die Macht von Sass, um 26193^42 Zeilen Code in etwas mehr als 10 zu generieren ;)
$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);
}
}
}
Zuerst definieren wir das $colors-Array mit den „12 Farben des Regenbogens“ und iterieren dann über die Liste, um den Selektor .color:nth-child(n):after mit den Eigenschaften background-color, rotate und z-index zu erstellen.
Die rotate-Eigenschaft hat einige wichtige Punkte. Ihr Winkel wird entsprechend der Anzahl der Farben im Kreis definiert. In unserem Fall gibt es 12 Farben, also ist 360/12 = 30 die Drehung jeder Farbe. Aber ab dem siebten Element beginnt die andere Hälfte des Kreises, erinnern Sie sich? Somit stoppt der gerade beschriebene Prozess am siebten Element. Wir beginnen dann denselben Prozess erneut, aber diesmal erfolgt die Drehung in eine andere Richtung. Deshalb gibt es ein @else mit rotate(#{-30+(30*($i+1))}deg), das 30 Grad von den Elementen der zweiten Hälfte des Kreises subtrahiert.
Wenn Sie ein guter Beobachter sind (und bisher alles verstanden haben), sollten Sie bemerkt haben, dass unser Regenschirm eigentlich ein Fächer ist! Bazinga! Damit die letzte Farbe der ersten Hälfte des Kreises nicht über andere Farben ragt, müssen wir den Index dieser Elemente umkehren. Zum Beispiel: z-index (6) = 1 und z-index (1) = 6.
Etwas mehr Magie
Schließlich müssen wir den Übergang zwischen den Farben erleichtern. Wir wollen ja keinen Regenbogen-im-Regenschirm-Stil, sondern einen konischen Verlauf!
.umbrella {
-webkit-filter: blur(1.7em);
}
.wheel {
overflow: hidden;
box-shadow: inset 0 0 0 3em rgba(0, 0, 0, 0.3);
}
Der blur-Filter ist für das Mischen der Farben verantwortlich. Aber durch das Anwenden des Weichzeichners stoßen die Farben an die Grenzen des Kreises. Deshalb wurde auch die overflow: hidden-Eigenschaft zum .wheel-Element hinzugefügt. Der innere box-shadow wird verwendet, um die Ränder abzudunkeln, die „ausgewaschen“ wurden. Dies ist das Endergebnis
Siehe den Pen Conical gradient in pure CSS von Shankar Cabus (@shankarcabus) auf CodePen
Demo
Der konische Verlauf kann auf verschiedene Weise verwendet werden, um unterschiedliche Effekte zu erzielen. Eine der interessantesten Anwendungen ist jedoch die Farbwaage, wie im folgenden Beispiel
Siehe den Pen Color Picker in Pure CSS von Shankar Cabus (@shankarcabus) auf CodePen
Andere Demos
Hinweis des Herausgebers: Ich habe im Laufe der Zeit viele andere Ansätze dazu gesehen. Ich werde sie hier als Referenz einfügen.
Siehe den Pen css conical gradient von Kai Waddington (@waddington) auf CodePen.
Ein weiteres Demo von Michael Wehner.
WOW! Einfach WOW.
Das ist tatsächlich einer der intelligentesten CSS-Tricks, die ich seit langem gesehen habe.
Danke und weiter so!
Gehirn explodiert! Sehr clever.
Eine schöne Alternative zur Abdunkelung des äußeren Rands mit einem Innen-Schatten ist das Hochskalieren der „Regenschirme“ innerhalb des „Rad“-Beschneidungselements. Sieht etwas natürlicher aus, finde ich. Hier ist ein Fork des finalen Pens, der dies zeigt.
Eine wirklich großartige Verbesserung! Danke ;)
Das ist einfach episch.
Man könnte das auch verwenden, um den Anflugwinkel in CSS zu erkennen.
Sehr cool!
Endlich!
WOOT HOT DOG!
Wirklich schönes Tutorial, danke fürs Teilen!
Nun! Heidi-ho! +1000
Tolles Beispiel für CSS-Power! Sehr cool!
Ziemlich raffiniert. Ich musste das Gleiche als Hintergrund für ein Radar-Diagramm machen und habe am Ende SVG verwendet, weil mir keine andere Möglichkeit ohne Bilder einfiel.
Ich weiß nicht, ob es an meinen Augen, meinem Monitor oder Chrome liegt, aber ich sehe ein Artefakt eines schwachen weißen Kreises innerhalb des Hauptkreises, etwas über dem halben Durchmesser.
Ich kann dieses Artefakt auf meinem iPad sehen. Ich glaube, es wird durch den Innen-Schatten verursacht, der verwendet wird, um den äußeren Rand abzudunkeln. Siehe meinen Kommentar (der zweitnächste von oben) für eine Alternative dazu.
Absolut erstaunlich. Danke für den Trick, Leute.
Arun
Wow, sehr gut! :)
Sehr cleverer Trick, das gefällt mir.
Vielleicht möchten Sie Ihre Sass-Schleife leicht ändern, um sie besser lesbar zu machen.
Trotzdem tolle Arbeit!
Ja... wäre besser. Danke, Hugo!
Sieht erstaunlich aus.
Gute Arbeit, Shankar!!
Das könnte explodieren, wenn man es berührt, aber hier ist ein kleines Experiment mit einer anderen Art, einen konischen Verlauf mit reinem CSS zu fälschen. Es ist nicht so schön, da es sich um einen tatsächlichen konischen Verlauf handelt, sodass die Mitte nicht gut aussieht. Man könnte etwas in die Mitte legen, um das zu verdecken.
(Haftungsausschluss: Es ist wahrscheinlich kein genauer Verlauf.)
Ich kann erklären, was Sie sehen, wenn es nicht offensichtlich ist.
Man könnte es wie im obigen Beispiel bereinigen, indem man einfach hinzufügt
-webkit-filter: blur(1.7em);zu Ihrer
umbrella-Klasse.Trotzdem gut gemacht, sowohl Ihnen als auch
Shankar. Ich liebe solche Beispiele.
Endlich eine elegante Lösung für bildfreie Clown-Brustwarzen.
Honk honk! DB
Die Demo funktioniert in Safari nicht richtig.
Konische Verläufe können auch mit linearen Verläufen emuliert werden (dies bedeutet auch die Verwendung von nur einem Element). Die Idee dahinter ist die, die ich in diesem Artikel erklärt habe.
Es ist schön zu sehen, dass konische Verläufe an Bedeutung gewinnen, obwohl die Menge an Code, die dies erzeugt, sie wahrscheinlich für den Produktionseinsatz ungeeignet macht. Dennoch brauchen wir solche Experimente, um mit konischen Verläufen voranzukommen.
Übrigens, hier ist eine einfachere Möglichkeit, dies zu tun, aber viel eingeschränkter (Sie können 4 Segmente haben, nicht 8): http://dabblet.com/gist/6915653
@Lea Verou…
Das ist verdammt genial... gut gemacht
Sehr coole Sache – danke fürs Posten! Ich hoffe, konische Verläufe sind in naher Zukunft ohne die Verwendung mehrerer Elemente möglich, ähnlich wie man lineare oder radiale Verläufe verwenden kann. Das ist auch etwas, das SVG als Standard haben sollte.
Nochmal vielen Dank fürs Posten!
Gut gemacht! Aber wir müssen ein paar Jahre warten, bis es in IE unterstützt wird:)
Eine Hommage an die Mac OS Finder-Implementierung :-)
CSS-Spinning-Wheel
Irgendeine Idee, wie man Text in die Kacheln einfügt?
Dies war der erste Fall, in dem ich den konischen Verlauf verwendet habe ;)
http://codepen.io/shankarcabus/details/hBbDi