Sie wissen wahrscheinlich schon, dass Sie Dreiecke mit CSS erstellen können. Aber was, wenn Sie einen Schatten dahinter legen möchten? Leider ändert der klassische Rahmen-Trick die Form des Elements nicht, er ist nur ein visueller Trick. Schauen wir uns ein paar alternative Lösungen an.
Einfach Unicode verwenden
Es gibt Dreieckszeichen in Unicode. Wie
▲▼◀▶
Und noch viel mehr.
Wenn Sie dies als Ihr Dreieck verwenden, können Sie es auswählen und damit allerhand Schickes machen.
<span class="triangle">▲</span>
.triangle {
color: #BADA55;
text-shadow: 0 0 20px black;
}
Farbe, Schatten, Größe, was auch immer. Sie könnten sogar noch schicker werden. Wenn das Dreieck nicht die exakte Form hat, die Sie möchten, oder nicht in die richtige Richtung zeigt, können Sie CSS3-Transformations-Elemente verwenden, um es zu strecken oder zu drehen. Hier ist eine Demo davon.
Siehe den Stift myomvM von Chris Coyier (@chriscoyier) auf CodePen.
Ich mag diese Technik, aber es gibt einige offensichtliche Probleme. Eines ist, dass die Abhängigkeit von CSS3-Transformations-Funktionen keine tiefe Browser-Unterstützung bietet. Sicherlich kein IE 8. Aber hey, dieser Artikel handelt von Schatten, also ist das sowieso CSS3. Selbst ältere Browser als diese könnten Probleme mit den Unicode-Symbolen selbst haben. Also, eine faire Warnung.
Die Double-Box-Methode
Wenn wir mit CSS3 einverstanden sind, könnte eine Methode darin bestehen, eine Container-Box mit verstecktem Überlauf und eine weitere darin liegende Box zu haben, die gedreht ist und herausragt. Der Teil, der noch sichtbar ist, würde ein Dreieck bilden. Dann können Sie einen box-shadow für beide Boxen verwenden, um einen Schatten rundherum zu erzielen.
<div class="triangle-with-shadow"></div>
.triangle-with-shadow {
width: 100px;
height: 100px;
position: relative;
overflow: hidden;
box-shadow: 0 16px 10px -17px rgba(0, 0, 0, 0.5);
}
.triangle-with-shadow:after {
content: "";
position: absolute;
width: 50px;
height: 50px;
background: #999;
transform: rotate(45deg); /* Prefixes... */
top: 75px;
left: 25px;
box-shadow: -1px -1px 10px -2px rgba(0, 0, 0, 0.5);
}
Beachten Sie, dass wir einen negativen Streuwert auf dem übergeordneten Element verwenden, um den Schatten nur auf einer Seite erscheinen zu lassen. Hier ist eine Demo davon.
Siehe den Stift Triangle with Shadow von Chris Coyier (@chriscoyier) auf CodePen.
Einfach ein Bild verwenden
Ich bin kein großer Fan davon, da es eine zusätzliche HTTP-Anfrage oder eine weitere Sache ist, die man in seinem Sprite verwalten muss. Und Sie werden die "responsiven Bilder" haben (sehen nicht so gut aus auf Pixel-dichten Displays, es sei denn, Sie haben mehrere Versionen davon bereit und gehen große Längen, um sie zu reparieren). Die anderen Techniken sind im Wesentlichen Vektorgrafiken, so dass sie in jeder Umgebung scharf sind.
Aber, wissen Sie, niemand wird sterben und Sie werden eine gute Browser-Unterstützung erhalten.
Die Zukunft
Sie können filter: drop-shadow() verwenden, um sehr einfach einen Schatten über die Form zu werfen. Hier ist ein Artikel darüber.
Wie üblich verblüffen Sie mich weiterhin.
Ist jemand anders betrübt darüber, wie sehr es ein Hack ist, selbst zu diesem Zeitpunkt irgendeine nicht-rechteckige Form in HTML zu bekommen? Ein Dreieck. Sie wissen, die Art von Zeug, das die Griechen gut im Griff hatten? a^2 + b^2 = c^2?
Und fangen Sie gar nicht erst mit Kreisen an.
Ich nehme an, dafür ist Canvas da.
Hier ist ein Canvas-Beispiel.
http://jsfiddle.net/SdeeV/
Ich wünschte, das würde funktionieren.
Gibt es irgendwelche Browser- oder OS-Kompatibilitätsprobleme bei der Verwendung von Unicode-Zeichen?
Die Verwendung von Unicode scheint noch einfacher zu sein als die Verwendung von Rahmen, um ein Dreieck zu erstellen. Plus der Vorteil, text-shadow verwenden zu können! Ich mag es.
Es scheint, dass IE8 Unicode nicht mag. Es schlägt den Modernizr-Test fehl, aber immerhin kann man in diesem Fall eine Fallback-Lösung verwenden.
Tatsächlich unterstützt IE8 einige Unicode-Zeichen.
Zum Beispiel unterstützt es das "Schwarze nach unten zeigende Dreieck", aber nicht das "Kleine Schwarze nach unten zeigende Dreieck"... seltsam.
Damit ein seltsames Unicode-Zeichen korrekt angezeigt wird, muss der Benutzer eine entsprechende Schriftart installiert haben, eine Schriftart, die dieses Zeichen unterstützt.
Ich nehme an, Sie könnten Webfonts verwenden, um dieses Problem zu umgehen, aber warum dann nicht eine Symbolschriftart verwenden?
Also stellt sich heraus, dass die Farbe
#BADA55nicht wirklich badass ist... Bin sehr enttäuscht, das zu sehen : (Das hat mich auch amüsiert. :P
Übrigens, schöner Trick mit dem Unicode-Zeichen, das gefällt mir!
Froh, dass ich nicht der Einzige war, der das bemerkt hat :)
Wenn ein Rahmen ausreichen würde, könnte man immer etwas wie dieses tun.
Reiner CSS-Pfeil mit Rahmen (Tooltip)
Canvas-Version desselben.
http://jsfiddle.net/SdeeV/
Ich mag die Schriftartlösung, aber warum nicht die Unicode-Probleme vermeiden und eine Symbolschriftart mit @font-face verwenden? So bieten die meisten Browser Unterstützung und Sie behalten das Dreieck, auch wenn es nicht immer einen Schatten hat.
Wie wäre es mit Platzierung
transition: all 0.2s ease;im span-Selektor, um es beim Überfahren des Dreiecks sanfter zu machen?
Bin ich der Einzige, der sich darüber ärgert, dass die Unicode-Dreiecke nicht exakt die gleiche Form haben, wenn sie um 4 verschiedene Arten gedreht sind, sondern 4 verschiedene Dreiecke, die sich in Größe und Dimension leicht unterscheiden? Es ist am auffälligsten bei den rechten/linken Dreiecken - das nach rechts zeigende ist etwas kürzer als das nach links zeigende. Das nervt mich unglaublich!
Schön. Ich bin absolut verblüfft, die Lösung zu sehen. Aber ich bin neugierig, ob es möglich ist, andere Symbole oder Formen mit etwas Ähnlichem zu erstellen. Wenn ja, kann mir jemand die URL mitteilen?
color: #BADA55 ha ha ha ha. Gut gemacht. Zum Thema: Wir haben zwei benutzerdefinierte Schriftarten erstellt und Font Squirrel verwendet, um die verschiedenen Versionen zu generieren. Das hat uns viel Frustration erspart, wenn wir die Farbe beim Überfahren ändern, sogar Übergangseffekte wurden dadurch leichter zu handhaben.
Sinan
Ich liebe diese Idee. Irgendwelche Empfehlungen für Schriftwerkzeuge?
Hallo Steve,
zuerst haben wir Illustrator verwendet, um alle gewünschten Zeichen "Symbole" vorzubereiten, dann haben wir http://www.fontlab.com/ verwendet, um die Schriftart zu erstellen, und schließlich http://www.fontsquirrel.com/, um unsere Schriftart mit ihrem Schriftartengenerator zu konvertieren.
Sie können natürlich auch jede andere Schriftart-Erstellungssoftware verwenden. Das war eine Idee, die ich hatte, nachdem sich das Design und Layout eines Projekts nach dem Start so oft geändert haben. Irgendwann änderte sich das Farbschema der Website! Sie können sich also vorstellen, wie einschüchternd die Aufgabe ist, zurückzugehen und Ihre Sprites zu bearbeiten. Damit ist es jetzt einfach :)
Gefällt dir das nicht?
Mehr so?
:)
Ein SVG würde bei jeder Pixeldichte gut aussehen.
Stimmt, aber dann machen Sie eine zusätzliche HTTP-Anfrage, um diese Datei zu erhalten. Keine Weltuntergang, aber etwas zum Nachdenken. Sie müssten den Schatten auch in der SVG-Grafik selbst hinzufügen. Vielleicht nicht schlecht, je nach Verwendung, aber es kann schwierig sein, den Schatten mit anderen CSS-generierten Schatten abzugleichen.
Ich habe in einem kürzlichen Projekt eine Reihe von CSS-Pfeilen verwendet und es hat mir gefallen, dass ich die Farbe und Ausrichtung dieser Pfeile ändern konnte, ohne viele verschiedene Asset-Dateien erstellen zu müssen. Wieder, Kleinigkeiten, aber ich liebe die kleinen Details.
SVG ist kein separater Download, es wird als Kind-Element in das HTML gezeichnet. Als solches wird es Teil des DOM und kann wie jedes andere Element auf der Seite mit CSS gestylt werden. So können Sie die Farben mit anderen CSS-gestylten Elementen abgleichen. Mit einer Bibliothek wie Raphael oder D3 ist die Arbeit einfacher und hat eine Unterstützung für ältere Browser.
Ich nehme an, das stimmt, je nachdem, wie Sie die SVG-Assets verwenden. Während Raphael großartig für solche Dinge ist, ist es vielleicht übertrieben, eine ganze Bibliothek für einen oder zwei Pfeile zu laden. Verstehen Sie mich nicht falsch, ich liebe die Verwendung von SVG. Aber meiner Meinung nach müssen Sie eine ganze Menge davon verwenden, um das Laden einer weiteren JS-Bibliothek zu rechtfertigen. Ich glaube, deshalb gibt es eine so große Nachfrage, diese Effekte in CSS zu erzielen.
Ich war überrascht, diesen Blogbeitrag in meinem LinkedIn Today News Reel zu sehen. Wie immer ein toller Beitrag!
Wäre es nicht sinnvoll, Base64-Kodierung für Bilder zu verwenden, die so klein wie ein monochromes Dreieck sind? Ich habe ein einfaches Dreieck-PNG erstellt, es durch meine PNG-Optimierer laufen lassen und die Kodierung auf etwa 200 Zeichen reduziert, was mir sehr vernünftig erscheint.
Während Base64-Kodierung eine gute Möglichkeit ist, eine HTTP-Anfrage zu sparen, sind die anderen Lösungen ebenfalls auflösungsunabhängig.
@Josh Johnson, @Jason, @Steve Schrab: Habe es noch nicht vollständig durchdacht, aber wie wäre es mit dem Besten aus beiden Welten?
Betten Sie das SVG in Ihre Stylesheet ein (da es nicht binär ist, müsste es nicht Base64-kodiert sein). Ich weiß, dass IE (zumindest ältere Versionen von IE) nur Data-URI-Einbettung für "Bilder" unterstützt, also bin ich mir nicht sicher, ob das SVG einschließt, aber als zukünftige Idee... ein SVG in ein Stylesheet einbetten - klingt ziemlich cool!
Der Vorteil gegenüber einem PNG ist, dass SVG auflösungsunabhängig ist und auch viel einfacher zu warten ist (kein PNG-File mehr herumliegen lassen, das periodisch neu kodiert/eingebettet wird, man könnte das SVG direkt im Stylesheet pflegen!).
Der Vorteil gegenüber einem Unicode-Zeichen (entweder in einer CSS-"content"-Eigenschaft oder als Textinhalt eines tatsächlichen DOM-Elements) ist, dass die SVG-Form absolut flexibel, nicht von Schriftarten abhängig und von allen Browsern zuverlässig interpretiert wird. Zuverlässig wie? Nun, die meisten Schriftarten implementieren nicht alle Unicode-Zeichen, was bedeutet, dass die Schriftart in den meisten Fällen für diese Zeichen auf eine Systemstandard-Schriftart zurückfällt, die diese Zeichen implementiert. Das Problem ist jedoch, dass verschiedene Betriebssysteme/Browser unterschiedliche Standard-Schriftarten haben. Und verschiedene Schriftarten implementieren diese Zeichen auf leicht unterschiedliche Weise.
Ich bin darauf gestoßen, als ich "⟨" (U+27E8) als Pfeil auf einer Schaltfläche in einem JavaScript-Schieberegler verwendet habe. Ich mochte die Form sehr und gab mir die Freiheit, die Textfarbe, Größe und dergleichen zu animieren. Aber die Abhängigkeit von der Höhe und dem Abstand erwies sich als Problem, als ich feststellte, dass der Pfeil auf den meisten Windows-Systemen sehr anders aussah als auf meinem vertrauten Mac. Der Pfeil war breiter und kürzer, für das Design, das ich hatte, völlig unbrauchbar, Mist. Vorübergehend behoben durch die Verwendung eines transparenten PNGs anstelle dessen (exportiert durch Eingabe des Zeichens in Photoshop). Nebenbei bemerkt, ein Vorteil, den ich hatte, als ich zu PNG wechselte, war die Möglichkeit, es leicht vertikal zu zentrieren, unabhängig vom Padding (Text kann das auch über die Zeilenhöhe tun, aber weniger flexibel).
Der Vorteil gegenüber der Double-Box-Methode ist, dass man mit einem eingebetteten SVG-Hintergrundbild das Stylesheet viel sauberer und leichter lesbar hält und vielleicht auch günstiger im Rendering ist, spart ein ":after" (das dann für etwas anderes verwendet werden kann) und ist weniger fehleranfällig, da es nicht davon abhängt, wie Browser das Box-Modell in diesen "Edge Cases" rendern (wie z. B. der Border-Radius-"Bug" (wenn es überhaupt ein Bug ist), bei dem Safari Radien, die größer als die Box selbst waren, anders behandelte als Firefox).
Der einzige Nachteil, der mir einfällt, ist die Kompatibilität mit älteren Browsern und die Flexibilität bei Variationen (z. B. Vererbung von einer CSS-Klasse und deren Farbänderung ist nicht so einfach, erfordert möglicherweise das mehrfache Duplizieren des SVG, während man bei der Double-Box-Methode eine gemeinsame Klasse verwenden und eine ergänzende Klasse erstellen könnte, die nur einige Eigenschaften überschreibt).
Obwohl die Verwendung eines (eingebetteten SVG-) Hintergrunds auch einige interessante Fähigkeiten bietet. Zum Beispiel die Verwendung von background-position (center center?) und background-size (stellen Sie sich vor, "background-size: cover" für einen eingebetteten SVG-Hintergrund zu verwenden und ihn automatisch über die gesamte Größe eines Elements skalieren zu lassen).
Nur einige zufällige (ungetestete) Ideen,
— Krinkle
Natürlich kann man bei Verwendung eines Hintergrunds nicht CSS verwenden, um das eigentliche SVG-Objekt zu stylen/animieren. Aber wie DED früher erwähnt hat, könnte man das SVG auch in HTML einbetten. Keine Notwendigkeit für eine Art Bibliothek.
[email protected] Ich möchte darauf hinweisen, dass ich auf meinem schicken neuen Android-Tablet 4 Boxen sehe. Es scheint, dass keine Pfeile in der Schriftart vorhanden sind. Das könnte ein Argument dafür sein, dies nach Möglichkeit mit @font-face zu kombinieren.
Das ist großartig, aber ich hoffe immer noch, dass W3C diese Dinge einfacher machen kann~
Ich habe diese Technik bereits verwendet und hier ein Profi-Tipp. Um das Dreieck perfekt auszurichten, müssen Sie die Schriftgröße zurücksetzen und eine Schriftart sehr sorgfältig auswählen. Das Rendering wird zwischen den Plattformen variieren.
Hallo ...
Wie immer hast du großartige Arbeit geleistet..
Ich habe viel von Ihrem Beitrag gelernt ...
Vielen Dank ...
Alles gut, aber ist die zusätzliche Markierung nicht hässlich, nur um ein Dreieck anzuzeigen? Ich benutze :after-triangle, um einen aktiven Zustand anzuzeigen.
Ich muss sagen, Sie kommen immer wieder auf sehr faszinierende Ideen, es ist schade, dass es keine einfachere Methode gibt, solche Dinge zu tun. Zweifellos wird es irgendwann so sein, aber bis dahin müssen wir uns wohl damit abfinden.
Ich habe auch CSS3-Dreiecke mit Rahmen und Schatten erstellt, Sie können sich meinen Beitrag auf Forrst ansehen.
http://forrst.com/posts/CSS3_Triangle_Gradients-XGU
Wenn Sie keine älteren Browser unterstützen müssen, können Sie den Rahmen-Trick verwenden, um Dreiecke zu erstellen und ihnen immer noch einen box-shadow hinzuzufügen.
Sie müssen nur zwei aneinandergrenzende Seiten des Rahmens nicht transparent statt einer machen und das Ganze um
45degdrehen. Dann können Sie einen richtigenbox-shadowzum Dreieck hinzufügen, wie ich in diesem Beispiel gezeigt habehttp://codepen.io/numbereleven/pen/pFcek