Interessante Frage
CSS3-Sprechblasen-Frage: Wie kann ich für die Rahmenfarbe des "Dreiecks" diese automatisch auf die Hintergrundfarbe seines übergeordneten Divs setzen?
— Jin Yang (@jzy) 1. Februar 2012
Mit "CSS3-Sprechblase" meint Jin die Verwendung eines Pseudoelements an einem Container, um eine kleine Pfeilspitze (Dreieck) hinzuzufügen. Nicht wirklich CSS3, aber das ist kleinlich.

Nehmen wir an, diese pinke Farbe ist nicht praktisch in einer externen CSS-Datei festzulegen. Vielleicht ist es eine Benutzereinstellung oder wird irgendwie dynamisch gesetzt.
<div class="speech-bubble" style="background: pink;">
I like bananas, because they have no bones.
</div>
Das Setzen des Containers mit einem Inline-Stil ist in Ordnung, aber leider gibt es keinen Inline-Stil für Pseudoelemente. Daher könnten wir am Ende etwas wie das hier haben

Mist.
Es gibt jedoch eine Lösung! Während wir den Inline-Stil für den Container setzen, können wir auch einen Inline-Stil für border-color setzen. Auch wenn der Container tatsächlich keinen Rand hat, können wir uns auf Vererbung verlassen, um diese Farbe an das Pseudoelement weiterzugeben, das als untergeordnetes Element behandelt wird.
<div class="speech-bubble" style="border-color: pink; background: pink;">
I like bananas, because they have no bones.
</div>
Dann werden wir in unserem Code für das Pseudoelement explizit festlegen, dass es die Farbe erbt
.speech-bubble:after {
content: "";
position: absolute;
top: 100%;
left: 20px;
border-top: 20px solid black;
border-top-color: inherit;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
}
Beachten Sie, dass ich inherit auf border-top-color angewendet habe, anstatt auf die Kurzschreibweise border-top. Aus irgendeinem Grund (klären Sie mich gerne auf) funktioniert inherit in der Kurzschreibweise nicht. Beachten Sie auch, dass beim Überschreiben der Farbe mit inherit diese nicht von der direkt darüber gesetzten Farbe (schwarz) "geerbt" wird, sondern vom übergeordneten Element. Wenn Sie also einen Standardwert benötigen, müssen Sie die border-color am übergeordneten Element festlegen.
Durch den Ersatz eines Pseudoelements durch ein Span-Element machen Sie es kompatibel mit IE7- und IE8-Browsern.
Nur IE 7 tatsächlich, IE 8 hatte Pseudoelemente. Aber ja, korrekt. UND Sie müssten sich weniger um diese Vererbungsangelegenheiten kümmern, da Sie die Rahmenfarbe direkt am Span setzen könnten. Aber dann haben Sie nicht-semantische Markup.
Nun, Semantik ist gut, aber in meinem Projekt musste ich diese Technik verwenden, um Tooltips anzuzeigen, und ich stellte fest, dass ich die Stile von Pseudoelementen nicht über JavaScript manipulieren konnte (ich versuchte, die Position dieses kleinen Dreiecks anzupassen). Daher denke ich, es kommt alles darauf an, was Sie damit machen.
Ich denke, es gäbe eine JavaScript-Möglichkeit, zu testen, ob der Browser Pseudoelemente unterstützt, und wenn nicht, ein <span>-Element anzuhängen. Dann tun Sie beim Styling einfach
.bubble::after,
.bubble span {
border-top-color: inherit; /* Ich habe das nicht tatsächlich getestet, aber theoretisch sollte es funktionieren */
}
Verzeihen Sie meine Tippfehler…
Kennt jemand eine Möglichkeit, alle Elemente mit `:before` oder `:after`-Inhalt mit JavaScript zu finden? Ich habe eine Weile gesucht und nichts gefunden. Das würde es ermöglichen, etwas wie das hier zu tun
Dann verwenden Sie Ihr JavaScript, um einen Span in das Element einzufügen… zack, IE7-Unterstützung.
Ich mache das derzeit manuell, indem ich einfach weiß, auf welche Elemente ich `:before` und `:after` anwende, aber das ist keine Best Practice…
Hallo Chris! Ich glaube, das erklärt, warum Sie nicht von Kurzschreibweisen erben können: http://www.w3.org/TR/2002/WD-CSS21-20020802/changes.html#q3
In der Tat. Ergibt Sinn.
Sie können diese JavaScript-Bibliothek verwenden http://ie7-js.googlecode.com/, um die Unterstützung für Pseudoelemente in IE 6, 7 und vielen anderen modernen Browserfunktionen zu aktivieren, wie hier aufgeführt http://ie7-js.googlecode.com/svn/test/index.html
Ich bin beeindruckt von der Wortwahl – "Ich mag Bananen, weil sie keine Knochen haben." Danke für den Lacher!
Kommt auch im normalen Gebrauch gelegen. Danke!
Wenn Ihnen alte Browserunterstützung egal ist, erben Sie einfach die Hintergrundfarbe und drehen Sie die Box um 45°.
Für ältere Browser können Sie auch versuchen, den Hintergrund mit festen farbigen Rändern in eine Dreiecksform zu maskieren. Dies würde erfordern, dass eine bekannte Hintergrundfarbe vorhanden ist, über der die Sprechblasen schweben.
Können wir nicht ein Pseudoelement verwenden, das eine um 45° gedrehte Box ist und die Hintergrundfarbe erbt (mit Positionierung, damit es wie ein Dreieck aussieht, d. h. die Hälfte der Box wird mit der Sprechblase überlappen, damit die Box wie ein herausragendes Dreieck aussieht)?
Wäre es nicht schön, wenn das funktionieren würde
Kennt jemand einen Weg, das zum Laufen zu bringen?
Ich glaube nicht, dass das rein über CSS möglich ist. Und wenn ich JavaScript verwenden könnte, kann ich immer noch nicht
div.bubble:beforeauswählen. Es sei denn, Sie fügen mit JavaScript ein weiteres zusätzliches Element ein. Und ich denke, Sie brauchen keindata-background-Attribut. Holen Sie sich einfach denbackground-color-WertLiege ich falsch?
Das kann in Zukunft mit reinem CSS gemacht werden, aber noch nicht jetzt.
http://dev.w3.org/csswg/css-variables/
Oder wenn Sie SCSS oder eine vergleichbare Erweiterung verwenden, können Sie es jetzt tun.
Toller Tipp, danke Chris.
Übrigens, ich liebe ShopTalk!
.speech-bubble – sollte es nicht eine Zeile "position: relative;" haben?
Sehr nützlicher Tipp.
Danke!
Hallo, Chris. Es gibt eine reduzierte Version der zweiten CSS-Regel
Danke für das Teilen dieser frischen Idee.
Vielleicht wird es auch mit 'currentColor' möglich sein? :P)
"Ich mag Bananen, weil sie keine Knochen haben." vom Mann selbst... Mr Robyn Hitchcock!
Entschuldigung, nur ein Test Ihres großartigen Formulars
Ausgezeichneter Artikel, danke für die vielen erlernten Tricks.
Danke Chris, das ist genau das, wonach ich gesucht habe :)
Ich habe nicht ganz verstanden, welcher Teil des Codes für das Dreieck Dingens verantwortlich ist… Ist es das Schlüsselwort "transparent"?
Bitte sag uns Chris, wie dieses Triangel erstellt wurde
Ich sehe nicht, wo Sie es in Ihrem Code erstellt haben!!
Seltsamer Bug in FF
Probieren Sie einfach das hier
style=”background: white; border-color: white;”
(oder eine beliebige helle Farbe)
statt dessen
style=”background: red; border-color: red;”
Das Dreieck erhält einen dünnen dunklen Umriss. Hat jemand eine Lösung dafür?
Also muss ich jetzt dieses "content: '\a0';" verwenden
… und hier ist die Antwort auf den FF-Bug
<code>border-style:solid;</code>
Der gesamte CSS-Code sollte also lauten:
<code>
<pre>
.speech-bubble:after {
content: “”;
position: absolute;
top: 100%;
left: 20px;
border-top: 20px outset black;
border-top-color: inherit;
border-left: 20px solid transparent;
border-right: 20px solid transparent;
}
</pre>
</code>
Eine sehr kreative Verwendung von CSS. Ehrlich gesagt, es hat mich eine Weile gekostet, die Sache mit den verschiedenen Rändern zu verstehen.
Das Problem, das ich habe, ist, zu versuchen, das auf einer horizontalen Liste von Elementen zum Laufen zu bringen. Wenn ich das :after auf ein Listenelement anwende und dann left:20px; wie Sie es oben gemacht haben, wird der Pfeil 20px vom linken Rand der gesamten Liste positioniert, nicht von diesem Listenelement.
@Keith Mancuso: Stellen Sie sicher, dass Sie position:relative auf Ihrem li.active-Element haben.
Was ist, wenn ich den Hintergrund als linearen Verlauf haben möchte?