Wussten Sie, dass Sie Dreiecke mit reinem CSS erstellen können? Das ist ziemlich einfach. Sie erstellen einfach ein Block-Level-Element mit null Breite und Höhe, einem farbigen Rand auf einer Seite und transparenten Rändern auf den beiden angrenzenden Seiten. Sie sind für viele Dinge nützlich, z. B. kleine Pfeile, die aus Sprechblasen herausragen, Navigationszeiger und mehr. Oft sind dies nur visuelle Verzierungen, die keine eigene Auszeichnung verdienen. Glücklicherweise eignen sich Pseudoelemente oft perfekt dafür. Das bedeutet, dass Sie ::before, ::after oder beides verwenden, um diese Block-Level-Elemente zu erstellen und das Dreieck zu platzieren. Eine nette Anwendung, die mir in diesem Zusammenhang in den Sinn kam: die Brotkrumennavigation.

Das HTML-Markup
Halten wir die Dinge so sauber wie möglich und entscheiden uns für eine einfache ungeordnete Liste mit der Klasse "breadcrumb"
<ul class="breadcrumb">
<li><a href="#">Home</a></li>
<li><a href="#">Vehicles</a></li>
<li><a href="#">Vans</a></li>
<li><a href="#">Camper Vans</a></li>
<li><a href="#">1989 VW Westfalia Vanagon</a></li>
</ul>
Das CSS
Zuerst stellen wir sicher, dass unsere Liste nicht wie eine typische Liste aussieht. Wir entfernen die Standard-Listenstile, setzen die Elemente nach links und definieren sehr einfache Stile für jeden Link. Beachten Sie den versteckten Überlauf am Listencontainer selbst. Dieser wird aus zwei Gründen nützlich sein. Erstens stellt er sicher, dass das Menü eine Höhe hat. Container, die nur gefloatete Elemente enthalten, kollabieren, was oft nicht ideal ist. Zweitens, wenn wir unsere Dreiecke erstellen, werden wir sie groß machen.
.breadcrumb {
list-style: none;
overflow: hidden;
font: 18px Sans-Serif;
}
.breadcrumb li {
float: left;
}
.breadcrumb li a {
color: white;
text-decoration: none;
padding: 10px 0 10px 65px;
background: brown; /* fallback color */
background: hsla(34,85%,35%,1);
position: relative;
display: block;
float: left;
}
Um das Dreieck zu erstellen, verwenden wir den Selektor ::after, um ein Pseudoelement zu erstellen. Es wird ein Block-Element sein, mit null Höhe und Breite und absolut 100% nach links positioniert, was bedeutet, dass es am rechten Rand seines Elternelements beginnt. Wir positionieren es 50% von oben und ziehen es mit einem negativen Margin von -50px zurück, was sicherstellt, dass es exakt zentriert ist. Dies ist ein klassischer Trick. Noch ein paar weitere Dinge zu beachten. Die von uns verwendeten Ränder sind 50px oben, 50px unten und auf der linken Seite (wodurch ein nach rechts gerichteter Pfeil entsteht) nur 30px. Das bedeutet einen flacheren Pfeil. Wenn wir höher als 50px gehen würden, wäre er spitzer. Gleich 50px würde ihn zu einem perfekten 90-Grad-Winkel machen. Da die oberen und unteren Ränder jeweils 50px betragen, ergibt sich eine Pfeilhöhe von 100px. 100px ist weitaus höher als unser Menü wahrscheinlich sein wird, mit seiner 18px Schriftgröße und 10px obere und untere Polsterung. Das ist gut. Es bedeutet, dass wir genügend Spielraum haben, um die Schriftgröße anzupassen, ohne befürchten zu müssen, dass das Dreieck seine Grenzen erreicht.
.breadcrumb li a::after {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent; /* Go big on the size, and let overflow hide */
border-bottom: 50px solid transparent;
border-left: 30px solid hsla(34,85%,35%,1);
position: absolute;
top: 50%;
margin-top: -50px;
left: 100%;
z-index: 2;
}
Beachten Sie die kleine 1-Pixel-Trennlinie? Das ist ein weiterer kleiner Trick. Wir können dem Dreieck keinen direkten Rand hinzufügen, da es bereits aus einem Rand besteht! Stattdessen erstellen wir ein weiteres Dreieck, das wir hinter unser ursprüngliches Dreieck legen und weiß färben. Dieses verwendet den ::before-Selektor, ist aber ansonsten genau gleich. Beachten Sie, dass hier der z-index wichtig ist. Sie könnten vertauschen, welches Dreieck ::after und welches ::before verwendet, das spielt wirklich keine Rolle.
.breadcrumb li a::before {
content: " ";
display: block;
width: 0;
height: 0;
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 30px solid white;
position: absolute;
top: 50%;
margin-top: -50px;
margin-left: 1px;
left: 100%;
z-index: 1;
}
Nun zur Farbgebung. Da wir hier einen etwas progressiveren Ansatz verfolgen, gibt es zwei CSS-Elemente, die meiner Meinung nach perfekt zu dieser Idee passen: nth-child und HSLa.
- Das Coole an nth-child: Wir können die verschiedenen Ebenen der Brotkrümel mit keiner zusätzlichen Auszeichnung einfärben
- Das Coole an HSLa: Wir können die verschiedenen Ebenen der Brotkrümel basierend auf einem einzigen Farbton mit unterschiedlichen Schattierungen sehr einfach einfärben
Zusätzlich zur Farbgebung reduzieren wir den linken Innenabstand des ersten Links (weniger nötig, da kein Dreieck im Weg ist) und der letzte Link erhält keine Farbgebung und reagiert nicht auf Klicks oder zeigt einen Zeigercursor an. Dies können wir ebenfalls ohne zusätzliche Auszeichnung über :first-child und :last-child erreichen.
.breadcrumb li:first-child a {
padding-left: 10px;
}
.breadcrumb li:nth-child(2) a { background: hsla(34,85%,45%,1); }
.breadcrumb li:nth-child(2) a:after { border-left-color: hsla(34,85%,45%,1); }
.breadcrumb li:nth-child(3) a { background: hsla(34,85%,55%,1); }
.breadcrumb li:nth-child(3) a:after { border-left-color: hsla(34,85%,55%,1); }
.breadcrumb li:nth-child(4) a { background: hsla(34,85%,65%,1); }
.breadcrumb li:nth-child(4) a:after { border-left-color: hsla(34,85%,65%,1); }
.breadcrumb li:nth-child(5) a { background: hsla(34,85%,75%,1); }
.breadcrumb li:nth-child(5) a:after { border-left-color: hsla(34,85%,75%,1); }
.breadcrumb li:last-child a {
background: transparent !important;
color: black;
pointer-events: none;
cursor: default;
}
.breadcrumb li:last-child a::after {
border: 0;
}
Und schließlich die Hover-Zustände. Der einzige Trick hierbei ist, dass wir sowohl das Dreieck als auch den Link einfärben müssen. Keine große Sache.
.breadcrumb li a:hover {
background: hsla(34, 85%, 25%, 1);
}
.breadcrumb li a:hover:after {
border-left-color: hsla(34, 85%, 25%, 1) !important;
}
Tiefere Browserkompatibilität
Nennen Sie mich faul, aber ich habe mich nicht um tiefere Browserkompatibilität gekümmert. Ich war mehr vom Gedanken begeistert, als über die Produktion nachzudenken. Wenn Sie diese Idee nutzen möchten, aber Bedenken wegen älterer Browser haben, sind hier einige Dinge, über die Sie nachdenken können:
- Verwenden Sie für die Farbgebung kein
hsla(), sondern Hex-Codes - Verwenden Sie für die Farbgebung kein
:nth-child, sondern geben Sie jedem Listenelement einen Klassennamen - Für Browser, die
::after/::beforenicht unterstützen, verwenden Sie ein bildbasiertes System. Dies ist mein Lieblings-Tutorial für bildbasierte Brotkrümel. - Verwenden Sie Modernizr zur Erkennung von Funktionen (wie HSLa)
- Verwenden Sie bedingte Stylesheets für IE
Viel Spaß
Hier ist das von uns behandelte Beispiel und ein paar Variationen
Sehen Sie den Stift CSS Triangle Breadcrumbs von CSS-Tricks (@css-tricks) auf CodePen.
Sweet. Sehr beeindruckend, was man mit etwas modernem CSS machen kann. Ich verstehe immer noch nicht, wie der Rand das Dreieck macht!
Ok, jetzt verstehe ich es :) http://jsfiddle.net/JvUW4/
Danke für den Link :)
Ja, das hat es erklärt.
Mehrfarbig! http://jsfiddle.net/FPUzF/
Sehr nett. Danke für den Link :)
Sollte das nicht in einem Tag verschachtelt sein? Ich würde denken, das wäre schlauer, als es in die ul zu packen.
Schöne Navigation Chris! Aber es funktioniert nicht in IE. Ich dachte, es sei Cross-Browser-kompatibel.
Aber trotzdem ist das ein toller Artikel! Danke!
Lesen Sie den Abschnitt "Tiefere Browserkompatibilität" im obigen Artikel für einige Tipps, wie Sie selbst damit beginnen können.
Wow! Habe gerade versucht, die Demo in IE6 anzusehen, aber ich habe damit begonnen, diesen Artikel darin zu laden, und das war alles, was ich tun konnte! Ist CSS-Tricks absichtlich so kaputt für IE6? Ich meine, es scheint aktiv, _spielerisch_ nicht funktionsfähig in diesem Browser…
Ich beabsichtige nicht, IE 6 auf dieser Seite zu unterstützen, tut mir leid. Außerdem möchte ich nicht, dass dies zu einer IE 6-Konversation wird, daher werden nachfolgende Antworten vergraben. (Kein böser Wille, ich schätze das Feedback!)
Wenn Sie den Link wegziehen (zumindest in Firefox), können Sie sehen, was CSS tatsächlich tut.
Ansonsten ist das mehr oder weniger das, was ich für die Seite implementiert hatte, an der ich gerade arbeite, bis ich einen Farbverlauf als Hintergrund brauchte...
Ich verwende in letzter Zeit immer öfter ein Größer-als-Zeichen für Dreiecke in Brotkrümeln, sie sind viel einfacher zu handhaben!
Guter neuer Weg, um Brotkrümel zu ändern. Danke Chris
Schöne Technik. Der Teil, den ich im Artikel nicht gesehen habe, ist der Stil, mit dem das Dreieck nach dem letzten Brotkrümel ausgeschaltet wird. Aus dem Code ist es ein schönes.
.breadcrumb li:last-child a:after { border: 0; }
Ich schätze, ein ähnlicher before-Selektor könnte verwendet werden, wenn der Gesamthintergrund nicht weiß wäre.
Wow! Ich bin ein begeisterter Leser Ihres Blogs und kommentiere normalerweise nicht, aber dieser hier hat mir wirklich ins Auge gefallen! Tolle Idee und wunderschöne Umsetzung
Warum setzen Sie sowohl display block als auch float left? Sicherlich brauchen Sie nur float left, da das Element sich wie display inline block verhalten würde?
Sehr coole Technik. Dies könnte mit etwa zehn Minuten mehr Arbeit sehr einfach in IE 8 funktionsfähig gemacht werden. Ich war von der Technik beeindruckt, aber definitiv noch roh.
Wenn Sie diese 10 Minuten haben, habe ich einen Artikel-Update mit Ihrem Namen darauf.
Anstatt nth-child zu verwenden, könnten Sie Klassennamen wie
level-1jedem<li>zuweisen. Da Sie bereits so oft nth-child in den CSS für die aufhellenden Farben verwenden, können Sie es auch gleich tun.Dadurch, zusammen mit der Hinzufügung von z-index ab 1 auf der niedrigsten Ebene und endend bei (für dieses Beispiel) 5 auf der höchsten Ebene, und der Verwendung von rgb anstelle von hsla, erhalten Sie IE8-Unterstützung.
Testfall auf Snipplr
Sieht in Chrome (6.0.472.63) OSX SL schrecklich aus… Sage es nur mal.
Sieht in Chrome 8 für mich gut aus. http://cl.ly/34Ee
Es scheint nichts darin zu geben, wozu Chrome 6 nicht voll kompatibel gewesen wäre. Wenn Sie eine Lösung finden, lassen Sie es uns bitte wissen, damit wir dies aktualisieren können. Ich glaube, es sollte eine clevere Redewendung geben wie "Wenn du Zeit zum Anlehnen hast, hast du Zeit zum Putzen", nur eben "Wenn du Zeit hast, Probleme zu kommentieren, hast du Zeit, eine Lösung zu codieren."
Ich bezog mich auf den Rand der Dreiecke – man kann in Ihrem Screenshot sehen, wie zackig sie sind… :)
http://cl.ly/808614bd38384d2d8f66
…das scheint tatsächlich mit der Schärfe des Dreiecksrands zusammenzuhängen… bei 90-Grad-Winkeln rendert Chrome sie wunderschön.
Ah ja, definitiv rendern die "gedrungeneren" Dreiecke viel schlechter. Ich weiß nicht, was da los ist. 90-Grad-Dreiecke sind normalerweise viel sauberer. Das weiße Dreieck betont das beschissene Rendering stark, also wenn man nur das :before-Dreieck entfernt, sieht das auch viel sauberer aus.
Chrome ist schlecht darin, bestimmte Effekte zu glätten, daher hinterlässt es Zacken auf allem, was nicht leicht in gerade Pixel passt (eine 45-Grad-Linie ist in Ordnung, da sie nur die diagonalen Pixel platziert, aber alles andere als 45 Grad wird geglättet). Allerdings ist auf Chrome 7 unter Windows 7 die Demo perfekt glatt :)
Wirklich ein toller Artikel Chris! Ich liebe das Design dieser Brotkrümel…
Ich kann die volle CSS3-Unterstützung in jedem Browser kaum erwarten.
funktioniert bei mir nicht in IE7,
Al
bei mir genauso. funktioniert nicht in IE7
Ich habe vor etwa einem Jahr praktisch dasselbe erstellt (wenn auch nicht für Brotkrümel)
http://cl.ly/1f8177a6147a07371650
Funktioniert in
PC IE6/7/8, Firefox 3+, Safari 4+, Chrome 4+, Opera 10.5+
Mac Firefox 3+, Safari 4+ (ungetestet in Chrome, habe nur Tiger auf meinem MacBook)
Das Markup ist eine ungeordnete Liste, verwendet Sprites und musste JavaScript verwenden, um es nur in IE6 zum Laufen zu bringen. Ohne JS in IE6 werden die Boxen meiner Meinung nach mit einer eckigen rechten Seite gerendert (ist eine Weile her, seit ich es gebaut habe).
Die Seite ist noch in Entwicklung (interne Entwicklungsfehler, die dann extern vergeben wurden, was die Termine mehrmals verschoben hat!), aber soll bis Ende des Jahres starten. Wir werden sehen, ob es beim Start noch funktioniert, worauf ich nicht viel Vertrauen habe, da der Anbieter gesagt hat, er habe noch nicht einmal Cross-Browser-Tests durchgeführt (igitt).
Wenn ich mich erinnere, werde ich hier zurückkommen und einen Link posten, wenn sie live ist.
Bilder sehen besser und glatter aus
Schöne Sachen, bis es in verdammtem IE funktioniert. Danke fürs Teilen :)
sweet… wusste nicht, dass man Dreiecke aus CSS machen kann… werde diesen Trick bei meinem nächsten Projekt anwenden :)
gute Idee Chris
Außerdem sind hier einige Links zu CSS-Dreiecken aus meinen Lesezeichen
http://www.pvmgarage.com/2010/01/how-to-create-depth-and-nice-3d-ribbons-only-using-css3/
http://hedgerwow.appspot.com/demo/arrows
http://www.dinnermint.org/blog/css/creating-triangles-in-css (Ich glaube, das ist die erste Stelle, an der ich über die Technik gelesen habe)
Es gibt keinen Grund, die Leuchtkraft-Eigenschaft zu verwenden, wenn es opak ist, verwenden Sie hsl
hsl(8%, 100%, 50%)
Alternativ gibt es keinen Grund, die Leuchtkraft-Eigenschaft von HLSA zu ändern, wenn sie auf einem weißen Hintergrund ist, machen Sie sie transparenter.
hsl(8%, 100%, 50%, 1)hsl(8%, 100%, 50%, .8)
hsl(8%, 100%, 50%, .6)
Das gefällt mir wirklich :) toll!
Sehr kreative Verwendung von CSS!
Die Farbgebung erinnert mich an den Wohnwagen aus Breaking Bad
Proof of Concept nur mit CSS3, mit Farbverläufen und Rändern.
http://jsfiddle.net/qXCed/5/
(nur Webkit und FF4)
In der IE9 Beta sieht es etwas seltsam aus…
Die gleiche Idee wird im Sprachwechsler von http://zemz-ua.com/en/about verwendet! Nur zum Spaß.
Liebe es! Einfach liebe es! Vielen Dank fürs Teilen. Übrigens, @Jeremy, deins ist auch großartig.
Wahrscheinlich funktioniert es nicht in IE… Weiß das jemand?
Tolles Tutorial. Brotkrümel sahen noch nie so schön aus.
Was für eine innovative Lösung. Danke, dass Sie sich die Zeit genommen haben, das zusammenzustellen.
lol – ich beabsichtige nicht, ie6 zu unterstützen, ich lache gut. Abgesehen davon, Ninja-Artikel Chris, danke.
Entschuldigung, aber dieser Beitrag beginnt falsch. Der CSS-Trick selbst ist interessant, aber das HTML ist nicht semantisch. Brotkrümel als ungeordnete Liste zu codieren, lässt es so aussehen, als ob die Elemente auf derselben hierarchischen Ebene liegen, wie ein Satz von Elementen in einer Reihe. Die Elemente in einem Brotkrümel sind nicht, sie repräsentieren einen Pfad, wobei jeder Link ein "Kind" des letzten ist.
Ein p-Tag als Wrapper, der einfache a-Tags enthält, wäre also schon besser. Es gibt mehrere Optionen für die Codierung eines Brotkrümel, aber viele sind umständlich oder semantisch falsch. Ich dachte, ich weise darauf hin.
Ohne eine Semantik-Diskussion beginnen zu wollen, denke ich nicht, dass an der Auszeichnung etwas falsch ist. Das Problem mit Semantik ist, dass es subjektiv ist.
Meine eigene Ansicht zu Brotkrümeln ist, dass sie eine geordnete Liste sind, da sie in einer definierten logischen Reihenfolge erscheinen. Das macht mich nicht richtig und Sie und Chris falsch.
Toller Artikel Chris. Ich liebe die neuen Dinge, die mit CSS möglich werden. Ich wünschte nur, mehr von den anderen Entwicklern, mit denen ich arbeite, würden diese Meinung teilen.
Ich denke, Geert hat einen guten Punkt, dass eine ungeordnete Liste nicht die vollkommen semantischste Sache ist. Ich glaube auch nicht, dass ein Absatz-Tag die richtige Antwort ist. Hier geht mein Gedanke zuerst hin, aber es scheint WEIT übertrieben.
Ich denke, eine geordnete Liste wäre semantisch in Ordnung (weil die Reihenfolge der Brotkrümel wichtig ist) und ist einfach.
Der Unterschied zwischen der Verwendung einer
<ol>und einer Reihe von verschachtelten<ul>liegt darin, wie Sie die Funktionsweise von Brotkrümeln wahrnehmen.Für den
<ol>-FallBeginne bei "Oberste Ebene"
Weiter zur "Zweiten Ebene"
Weiter zur "Dritten Ebene"
Ende beim "Aktuellen Element"
Für den verschachtelten
<ul>-FallBeginne mit der Liste der Links in der "Obersten Ebene"
Wähle "Zweite Ebene" aus der nächsten Liste von Optionen
Wähle "Dritte Ebene" aus der nächsten Liste von Optionen
Wähle "Aktuelles Element" aus der nächsten Liste von Optionen
Ich schätze, es hängt davon ab, ob man es als direkten Pfad/kausale Beziehung (
<ol>) oder als eine Reihe von Auswahlmöglichkeiten, die nur die ausgewählten Elemente anzeigen (<ul>), betrachten möchte.@Thomas: Semantik ist bis zu einem gewissen Grad subjektiv, da stimme ich zu, aber manche Dinge sind einfach falsch und das ist eines davon. Andererseits gibt es im speziellen Fall eines Brotkrumens keine eindeutig richtige Lösung. Eine ungeordnete Liste zu verwenden ist nicht schlimm, aber es ist nicht korrekt. Und ich glaube nicht, dass das subjektiv ist. Was jemand am Ende verwendet, ist natürlich seine eigene Wahl.
@Chris: Das von Ihnen gepostete Beispiel ist in Bezug auf die Semantik vielleicht ein wenig besser, aber offensichtlich furchtbar umständlich, wie Sie richtig bemerken. Wie gesagt, ich denke, es gibt keine eindeutig semantisch korrekte Lösung für Brotkrümel, weshalb ich mich entschieden habe, es einfach zu halten (p-Tag mit a-Tags darin). Wenn jede Lösung Nachteile hat, wähle ich in diesem Fall die einfachste. Aber jedem das Seine.
Auf jeden Fall eine interessante Diskussion, und etwas, das meiner Meinung nach während der Entwicklung von HTML5 besser hätte behandelt werden können.
Geert, meine Sichtweise ist, dass Brotkrümel eine Navigationshilfe sind, keine Beschreibung der Seitenhierarchie. Aus Sicht des HTML-Dokuments ist der Brotkrumenpfad eine Liste von Links, mit denen man im Seitenbaum zurücknavigieren kann. Für mich ist dies eine Ergänzung zum Thema des Dokuments, daher würde ich nicht zu sehr ins Detail gehen.
Wenn es jedoch um die Beschreibung der Seitenhierarchie geht, dann würde eine Liste nicht ausreichen.
Aber andererseits zeigen Brotkrümel auch, wo man sich in der Hierarchie befindet, so dass es leicht in beide Richtungen funktionieren kann!
Ich hoffe, das ergibt Sinn.
Ich stimme Thomas Heaney zu, eine geordnete Liste ist hier sehr sinnvoll.
Ich mag James' Verwendung des größeren oder kleineren Symbols.
Cool.. Liebe es!
Ausgezeichneter Artikel, liebe das Design der Brotkrümel, werde versuchen, dies vielleicht für einen Navigationszeiger zu verwenden. LT
Dies ist eine großartige Technik, da sie wirklich cool ist, man kann sie auch als Zeiger auf einem Tooltip verwenden. Schade, dass sie nicht mit älteren Browsern kompatibel ist.
Das ist, wonach ich gesucht habe :D Vielen Dank :)
Das ist ein großartiges Tutorial. Sehr hilfreich. Danke!
Einfach genial, ich kann Workarounds für alte Browser finden, nur wenn es einen wirklichen Grund dazu gibt, ansonsten wird es einfach dankbar abgebaut, ohne nette Tricks, ich habe es mit IE hinter mir.
Es ist genial! Ich mag es wirklich, vielen Dank!
Irgendwelche Vorschläge, wie man CSS-Pfeile mit nur Div-Brotkrumen implementiert? Danke.
Gute Idee, aber nicht wirklich browserkompatibel. Obwohl ich es verwenden werde :)
wie üblich großartige Arbeit :) danke
Es ist sehr schön, Dreiecke ohne Bilder zu machen. Trotzdem verstehe ich nicht, wie er es gemacht hat. Ich muss es durchgehen.
danke
vara
Wo war dieses Tutorial vor Monaten, als ich genau diese Art von Brotkrumen codieren musste??? :P TOLLE Technik Chris.
schön. wirklich hilfreich
Hallo Herr, ich habe eine kleine Frage. Welche Eigenschaft können wir verwenden, damit die Farbe des Menüpunkts nach dem Klicken fixiert ist und beim nächsten Klicken wechselt. Wie ist das möglich?
Können Sie mir die entsprechende Eigenschaft nennen, Herr?