Wenn es eine Sache gibt, die ich an meiner Arbeit am meisten liebe, dann ist es die Umsetzung der Herausforderungen, die mir ein Designer stellt. Es gibt fast immer einen Weg, ein Design in Code umzusetzen, und ich liebe es herauszufinden, wie ich mit CSS dem Originaldesign so nahe wie möglich kommen kann.
Vor kurzem hat mir unser Creative Director bei Sparkbox, Drew, ein Design für eine E-Commerce-Website gegeben, das ich umsetzen sollte. Es gab ein Element auf der Website, das eine Art Sternform hatte und den Preis des Produkts enthielt. Da es einen dynamischen Preis enthielt, musste sich das Element entsprechend vergrößern und anpassen. Also habe ich mich daran gemacht, dieses Ding mit CSS zu bauen.
Das Design zerlegen

Also los geht's. Wir haben einen ziemlich spitzen Kreis mit dem Produktpreis darin. (Beachten Sie auch den dezenten inneren Rand, den Drew hier verwendet. Darüber werden wir später sprechen.) Ich habe dieses Design genommen und daraus das hier gemacht

Ich weiß, es ist nicht *ganz* dasselbe – es hat ein paar "Spitzen" weniger –, was ich technisch gesehen mit etwas mehr Markup hätte erreichen können, aber ich entschied, dass etwas weniger Markup und weniger Spitzen es wert waren. Lassen Sie uns durchgehen, was hier vor sich geht.
Visualisierung des Geschehens
Stellen Sie sich diesen Stern als eine Reihe von rotierten Boxen vor. Die Art und Weise, wie ich mir das Ganze vorstellte, war mit ein paar Haftnotizen. Schauen Sie mal

Ich habe hier also drei Elemente, jedes um 30 Grad gedreht. (Im fertigen Design werde ich tatsächlich sechs Elemente haben, Sie werden sehen...)
Der Markup
<div class="price-container">
<div class="price">
<span class="label">Buy</span>
<span class="number">$15.00</span>
<span class="label">Now</span>
</div>
</div>
Ich habe <div class="price-container">, das, Sie haben es erraten, den Stern für den Preis enthält. Ich werde es für den Hintergrund des Sterns verwenden. Das <div class="price"> ist der Container für den Text im Inneren (die Preisinformationen). Das war's mit dem Markup. Von hier aus werde ich Pseudo-Klassen stylen, um die mehreren Spitzen zu erzeugen. Außerdem erwähnte ich bereits, dass die CSS-Version dieses Sterns ein paar Spitzen weniger hatte. Dieses Markup enthält eigentlich nichts unnötiges.
Das Styling
Nun zum spaßigen Teil. Ich werde kurz umreißen, was ich tun werde, und Ihnen dann die dafür benötigten Stile zeigen. Ich werde .price-container, .price und die Pseudo-Elemente :before und :after für jeden stylen. Im Wesentlichen habe ich sechs Elemente zur Verfügung. Ich habe dieses Hintergrundbild erstellt, das auf jedes der Elemente angewendet wird, und ich werde jedes um 15 Grad drehen

Wenn Sie sich das Bild der Haftnotizen oben noch einmal ansehen, bemerken Sie, wie ich den inneren Rand mit Bleistift gezeichnet habe. Durch das Zerlegen des Haftnotizen-Modells habe ich ein Stück erhalten, das so aussieht.
Hier sind also die Stile jedes Elements (die Kommentare sollten Ihnen helfen zu verstehen, was vor sich geht. Ich habe auch einige Notizen unten.)
.price-container,
.price-container:before,
.price-container:after,
.price-container .price,
.price-container .price:before,
.price-container .price:after {
height: 8.5em;
width: 8.5em;
background: #760B1F url(price-bg.png) top left no-repeat;
background-size: 8.5em;
}
.price-container:before,
.price-container:after,
.price-container .price:before,
.price-container .price:after {
content: "";
position: absolute;
}
.price-container {
margin: 100px auto; /* Centering for demo */
position: relative; /* Context */
top: 2.5em;
left: 2.5em;
-webkit-transform: rotate(-45deg);
-moz-transform: rotate(-45deg);
-ms-transform: rotate(-45deg);
-o-transform: rotate(-45deg);
transform: rotate(-45deg);
}
.price-container:before {
top: 0;
left: 0;
-webkit-transform: rotate(-30deg);
-moz-transform: rotate(-30deg);
-ms-transform: rotate(-30deg);
-o-transform: rotate(-30deg);
transform: rotate(-30deg);
}
.price-container:after {
top: 0;
left: 0;
-webkit-transform: rotate(-15deg);
-moz-transform: rotate(-15deg);
-ms-transform: rotate(-15deg);
-o-transform: rotate(-15deg);
transform: rotate(-15deg);
}
.price-container .price {
padding: .5em 0em;
height: 7.5em; /* height minus padding */
position: absolute;
bottom: 0;
right: 0;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
z-index: 1; /* important so the text shows up */
}
.price-container .price:before {
top: 0;
left: 0;
-webkit-transform: rotate(60deg);
-moz-transform: rotate(60deg);
-ms-transform: rotate(60deg);
-o-transform: rotate(60deg);
transform: rotate(60deg);
}
.price-container .price:after {
top: 0;
left: 0;
-webkit-transform: rotate(75deg);
-moz-transform: rotate(75deg);
-ms-transform: rotate(75deg);
-o-transform: rotate(75deg);
transform: rotate(75deg);
}
Ein paar Dinge, die ich zu den Stilen anmerken werde
- Beachten Sie die Reihenfolge der Rotationswinkel: Diese Reihenfolge ist wichtig, da im innersten Element Text sein wird. Daher muss das letzte Element (das, in das der Text eingefügt wird, in diesem Fall
.price) gerade sein. Beachten Sie, dass.price-containerum -45 Grad und.priceum 45 Grad gedreht ist – zurück auf 0. - Die Höhe und Breite: Höhe und Breite müssen festgelegt werden, da wir es hier mit Hintergrundbildern zu tun haben. Ich habe sie in em festgelegt, damit sie sich entsprechend anpassen, wenn sich die Textgröße erhöht.
- Es gibt einen oberen und unteren Abstand bei
.price-container .price. Deshalb ist die Höhe etwas anders als bei allen anderen. - Alles ist absolut im ersten Container positioniert.
.price-containerhatleft: 2.5emundtop: 2.5em, um das Ganze ein wenig zu verschieben. Wenn alles gedreht wird, gehen die Ecken über den Rand und aus dem Container heraus. - z-index: Es gibt einen
z-indexfür.price-container .price. Dies ist wichtig, damit die Preisinformationen in diesem Div sichtbar sind.
Nun bleibt nur noch das Stylen des Textes.
.price-container .price span {
position: relative;
z-index: 100;
display: block;
text-align: center;
color: #FE3D5C;
font: 1.8em/1.4em Sans-Serif;
text-transform: uppercase;
}
.price-container .price span.number {
font-weight: bold;
font-size: 2.5em;
line-height: .9em;
color: #fff;
}
Ohne Bild
Nun, ich habe hier ein paar zusätzliche Elemente, da das Design diesen sehr dezenten inneren Rand vorsah. Wenn Sie den inneren Rand nicht mögen oder benötigen, entfernen Sie einfach den Teil mit dem Hintergrundbild und der Hintergrundgröße, und das Design wird trotzdem gut aussehen.
Browser-Unterstützung
Dies funktioniert so, wie es ist, in IE 9+, Firefox 4.0+, Safari 4.1+ und Chrome 3.0+. IE 8 und älter unterstützen keine Hintergrundgröße, und Chrome 1.0, Firefox 3.6 und Safari 3.0 benötigen einige Vendor-Präfixe. IE8 unterstützt zwar Pseudo-Elemente, aber keine transform.
Der Fallback wäre ein farbiger Quadrat. Wahrscheinlich kein großes Problem.
Da haben Sie es
Es ist eine Sternen-Preis-Sache. Flexibel genug, um sich zu vergrößern, wenn Sie Ihre Schriftgröße erhöhen. Mit etwas CSS gemacht.
Demo ansehen Dateien herunterladen
Es ist wirklich cool, dass man all das mit CSS machen kann.
Aber da man das Hauptbild (Quadrat) braucht, um es zu starten. Wäre es nicht einfacher, einfach das Sternenbild zu nehmen, das er einem gegeben hat, und es als Hintergrund zu verwenden?
Und wenn man es so machen wollte, dass man den Text im Inneren bearbeiten kann, stempelt man den Originaltext einfach weg und positioniert dann den Text darunter.
Für mich scheint das einfacher :P.
Wie auch immer, das ist eine erstaunliche Programmierleistung, gut gemacht.
Ja, aber dann gäbe es kaum noch CSS oder Tricks, oder? :p
Gehen Sie auf die Demoseite und versuchen Sie, die Textgröße zu ändern. Sehen Sie, wie sich die Grafik entsprechend ändert? Das macht den Punkt!
Sehr kreativ und gut umgesetzt. Ich erstelle ständig Bilder für Abzeichen, die diesem ähneln – aber je mehr wir Bilder durch vollständig CSS-basierte Lösungen ersetzen können, desto besser. Der Rand ist auch eine nette Geste. Danke für den Artikel!
Ja, das ist genial :)
Schönes Beispiel für die Kraft von CSS3, aber ich muss Zach zustimmen, diese Übung ist völlig sinnlos, da man sowieso ein Bild verwenden muss.
Warum benutzt du nicht den Stern als Hintergrundbild mit deinem Text über dem Div, um dir eine Menge Zeit zu sparen, da du keine zusätzlichen 100 Zeilen CSS programmieren müsstest, mit einem Ergebnis, das auf ALLEN Webbrowsern funktioniert, anstatt auf nur 4?
Das ist brillant. Ich kann es kaum erwarten, es auszuprobieren. Es ist großartig, aus Sicht der Seitenladezeit, CSS statt Bilder zu verwenden.
Gary,
Er benutzt immer noch ein Bild... Die Seitenladung würde sich nicht ändern, wenn er einfach das gesamte Bild des Sterns anstelle von nur einem Randkontur davon verwenden würde. Andere Kommentatoren haben Recht – diese Übung ist toll für das Gehirn, aber nicht so sehr für die Funktionalität.
Super Tutorial. Es ist beeindruckend, was man nur mit CSS machen kann.
Aber (es gibt immer ein "aber", oder?) Ich denke nicht, dass dieses Beispiel sehr praktisch ist, da man sowieso ein Bild erstellen muss. Warum nicht den Stern als Hintergrund verwenden und das CSS stark reduzieren?
Schönes Tutorial, ich muss Zach irgendwie zustimmen, da du sowieso ein Bild verwendest, wäre es nicht einfacher, das ganze Bild zu verwenden und `background-size: 100% 100%` zu setzen, damit es sich immer horizontal und vertikal dehnt?
Vergessen Sie nicht, dass dies alles komplett ohne Bilder gemacht werden kann. In diesem speziellen Fall erforderte das Design einen inneren Rand, daher war die Bildlösung am besten. Wenn Sie das Hintergrundbild entfernen und eine Hintergrundfarbe verwenden, erhalten Sie das gleiche Ergebnis – und in diesem Fall viel flexibler als die Verwendung eines Sternenbildes.
Mit reinem CSS ist das umwerfend, vor ein paar Jahren hätte das jeden CSS-Experten umgehauen, das zeigt nur, wie sehr sich CSS entwickelt hat, vielleicht werden wir in Zukunft komplexe Muster in CSS integriert sehen oder vielleicht Flash-ähnliche Effekte oder wer weiß was………….
Schauen Sie sich die kürzlich erstellten CSS-Shader an!
Mein Geist ist überwältigt
Erstaunlich großartig
Hm, was ist mit der Verwendung von
border-radiusmitborder-image? Ich bin mir nicht sicher, ob das in dieser Kombination funktioniert, aber ich denke, es sollte.Wie die anderen, eine komplett bildfreie Lösung wäre wirklich großartig gewesen.
Oh, und du hast vergessen, Opera in der Browserunterstützung zu erwähnen ;)
Sehr gut.
Gute Arbeit! Nun, da das erledigt ist... :)
Vergessen wir für einen Moment die Bilder. Nicht, dass Bilder falsch wären. Bilder werden CSS3 überleben, daran habe ich keine Zweifel.
Ich sehe hier nichts, was man nicht besser mit SVG machen und dabei mehr Browserabdeckung erzielen könnte.
Obwohl es mit CSS gemacht werden kann, denke ich persönlich, *wieder* ;), dass CSS hier wirklich nicht das richtige Werkzeug für die Aufgabe ist.
Als CSS-Übung, als CSS-Herausforderung, zweifellos, hat diese ihre Verdienste. Das Endprodukt liefert jedoch nicht die allgemeine grafische Qualität, die man erwartet.
Und das ist hier der entscheidende Punkt! Nicht viele werden die Coding-Technik schätzen, aber alle werden die endgültige grafische Qualität beurteilen.
Daher wäre, wenn nicht ein Bild, dann sicherlich ein SVG für diese Art von Dingen angemessener.
Ich schätze, was ich sage, hängt mit meinen vorherigen Kommentaren zusammen: Der schwierige Teil ist zu entscheiden, wann einige CSS-Tricks über clevere Konzepte hinausgehen und sich als nutzbar für reale Projekte erweisen.
Die "Visualisierung des Geschehens" war unerlässlich! nette Analogie.
Chris,
Obwohl dies eine sehr geniale Nutzung neuer Konzepte von CSS3 (transform => rotate) ist, habe ich das Endergebnis zusammen mit Ihrem Code überprüft. Es skaliert nicht, wenn Sie die Ziffern des Preises erhöhen. Zum Beispiel, wenn Sie 39 in 3999 ändern, fällt eine Ziffer aus dem Kreis.
Wenn das der Fall ist, warum nicht ein einfaches Hintergrundbild verwenden?
Schöne brillante Idee!!!
Eine gestohlene Idee, als eigene ausgegeben, gut gemacht.
http://matthewjamestaylor.com/blog/css3-starbursts
Matthew,
Wie ist das gestohlen? Dieses Tutorial verwendet einen völlig anderen Prozess als der in dem von Ihnen geteilten Artikel.
Die Titel sind ähnlich, aber das ist alles.
Ich bin zu faul, um es zu tun, aber ich bin sicher, wir können andere Artikel mit Methoden zur Erstellung von CSS-basierten Sternen finden, die älter sind als der Matthew-Artikel. Nur weil man nicht der Erste ist, der eine Methode dokumentiert, heißt das nicht, dass man etwas gestohlen hat.
Hier ist eine Idee. Aktualisieren Sie Ihren Artikel mit einem Link zu Chris' Beitrag und fügen Sie einen Link zu Ihrem Beitrag in den Kommentaren zu diesem Beitrag ein. Denken Sie darüber nach, was der Community nützt. Wenn Sie Artikel nur für sich selbst schreiben, sperren Sie Ihren Blog mit einem Passwort, damit niemand die Inhalte "stehlen" kann.
Hmm, lassen Sie mich Matt verteidigen. Ich habe seine Layouts und Navigationsmenüs in mehreren Projekten verwendet (und modifiziert und manchmal missbraucht) und ihn ein- oder zweimal um Rat zu ihrer Verwendung gebeten, mit freundlichen und hilfreichen Antworten. Er hat eine Menge außergewöhnlich gut gemachter Materialien erstellt, die alle kostenlos heruntergeladen werden können, mit nur einer generischen Bitte um eine Spende, wenn Sie möchten.
Daher ist die Forderung nach einer privaten Absicherung seines Blogs, damit niemand seine Materialien "stehlen" kann, reiner Bullshit. Er und Chris stellen beide eine gewaltige Menge an Materialien zur Verfügung, beides aus dem, was ich glaube, einer aufrichtigen Liebe zu Design/Entwicklung und einem Geist der Großzügigkeit und des "Zurückgebens an die Community".
Für den Stern ist Chris' Methodik ganz anders als die von Matt. Die Konzepte sind jedoch ähnlich genug, um zu sagen, dass Chris Matts Arbeit hätte anerkennen sollen – wenn er davon gewusst hätte, was er vielleicht nicht hat – in dem Beitrag. Matt hätte wahrscheinlich ein weniger belastetes Wort als "gestohlen" verwenden können, weil Chris Matts Arbeit nicht gestohlen hat.
Damit dürfte die Angelegenheit geklärt sein. Entspannt euch, Leute.
Dies ist der echte Matthew James Taylor hier...
Ich möchte darauf hinweisen, dass der obige Kommentar "gestohlen" nicht von mir stammt. Er wurde von jemandem hinzugefügt, der sich als ich ausgab. Es ist schade, dass Leute sich als jemand anderes ausgeben und andere schlecht aussehen lassen können.
Chris, gibt es eine Möglichkeit, seinen Kommentar zu ändern, damit er nicht so aussieht, als käme er von mir? Übrigens, ich bin eigentlich ein großer Fan deiner Arbeit und deines Engagements, ich bin viel zu faul, um so produktiv zu sein wie du! ;)
Kein Problem. Prost.
Haha, super Idee, es zuerst auf ein paar rechteckige Papierstücke zu zeichnen!
Das ist verdammt genial! Ich kann nicht glauben, dass Leute wie *Ryan Buttrey* existieren.
Ernsthaft, ihr kommt immer wieder mit innovativen CSS-Sachen. Niemand kann CSS als eine *einfache* oder *grundlegende* Sprache zum Lernen bezeichnen. CSS verdient es, genauso gemeistert zu werden wie PHP, ASP.NET, C++ oder Assembly.
Verrückt, obwohl ich einfach ein Bild verwenden würde, weil ich faul bin :)
Sehr kreativ, gefällt mir :)
Ich liebe es, zufällige coole Sachen zu finden, besonders wenn sie mit CSS zu tun haben, also passt das hier gut.
Danke, dass du deine Ideen geteilt hast, jetzt werde ich noch ein bisschen lustige Hover-Rotation und Farbwechsel hinzufügen.
Simon
K2Joom.com
Das ist so dermaßen cool. Ich frage mich, ob es eine Möglichkeit gibt, CSS-Verläufe einzubauen.
Man sollte sogar die innere Randversion ohne Bild für moderne Browser umsetzen können, indem man etwas unsemantisches Markup hinzufügt. Sagen wir, zwei Div-Container mit den Klassennamen innerborder-1 & innerborder-2, die zusammen mit ihren Pseudo-Elementen sechs absolut positionierte Blöcke mit transparentem Hintergrund und hellem braunen Rand sind. Dann lassen Sie einen der Spans ein Kreisblock mit braunem Hintergrund sein, um die Ränder innerhalb des inneren Sterns abzudecken.
Man kann immer darüber streiten, ob das Einsparen einer HTTP-Anfrage den Aufwand für zusätzliches Markup und die Notwendigkeit eines CSS2-Fallbacks wert ist, aber ich bin mir nicht sicher, ob es das nicht wäre!
Lustiger Beitrag, mir gefällt besonders das Konzept der Visualisierung mit Haftnotizen!
Zu verdammt cool.
Ich bin mir nicht sicher, ob ich es jemals benutzen würde, da Sterne ein bisschen klischeehaft sind, aber ich lese solche Artikel gerne rein aus dem "Coding Fun"-Blickwinkel. Kudos, Chris – eine sehr aufschlussreiche Lektüre.
Alles, was ich sagen kann, ist, dass das einfach genial ist...
Hallo zusammen, ich habe bemerkt, dass mehrere Leute Chris sowohl für diesen Beitrag loben als auch kritisieren. Ich wollte nur erwähnen, dass Chris ihn nicht geschrieben hat. Es ist ein Gastbeitrag von Ryan Buttrey.
Warum???
Reine Neugier, um zu beweisen, dass es möglich ist, zum Experimentieren, zum Spaß, um eine Herausforderung zu bieten, um die Grenzen des Codes zu erweitern usw. usw. usw. Aber das ist nur meine Vermutung.
Du bist verrückt haha (im guten Sinne natürlich) – du musst so viel Spaß haben, diese Sachen zu machen. Auch wenn etwas noch nicht praktisch mit CSS (und den besagten Tricks) umzusetzen ist, ist es immer noch interessant zu sehen, wie du es machst. Lustig für mich, wenn Leute diesen Punkt bei einigen deiner Beiträge verpassen. Jedenfalls ist das wirklich cool. Gute Arbeit!
Tolles Angebot,
Kann ich es für meine Joomla-Website verwenden?
Dies scheint eine weitere Fehlverwendung von CSS zu sein. Ich denke, wir müssen bedenken, dass CSS nicht zur Erzeugung von Inhalten verwendet werden sollte; sondern zur Gestaltung desselben. Ansonsten ist dies ein sehr konstruiertes Beispiel für "clevere" CSS-Programmierung. Ich würde lieber mehr gute und angemessene Anwendungen von CSS2 und CSS3 sehen. Vielleicht in Verbindung mit SVG, um die Dinge spannend zu halten, ohne schlechte Codierung zu erfinden und zu verstärken. Es gibt auch Dinge über XSLT & CSS usw. zu besprechen.
Ich würde gerne mehr echten/nützlichen Code sehen, wie in den alten Tagen von CSS-Tricks. Ansonsten ist meine Gunst für diese Website stark rückläufig.