Es gibt eine content Eigenschaft in CSS, die zusammen mit den ::before und ::after Pseudo-Elementen verwendet wird. Sie fügt Inhalte in das Element ein.
Hier ist ein Beispiel:
<div
data-done="✅"
class="email">
[email protected]
</div>
.email::before {
content: attr(data-done) " Email: "; /* This gets inserted before the email address */
}

Die Eigenschaft akzeptiert im Allgemeinen alles, was Sie dort hineinfallen lassen. Es gibt jedoch einige ungültige Werte, die sie nicht akzeptiert. Ich habe kürzlich von jemandem gehört, der damit verwirrt war, also habe ich selbst ein wenig damit gespielt und einige Dinge gelernt.
Das funktioniert einwandfrei
/* Valid */
::after {
content: "1";
}
… aber das tut es nicht
/* Invalid, not a string */
::after {
content: 1;
}
Ich bin mir nicht ganz sicher warum, aber ich stelle mir vor, dass es daran liegt, dass 1 eine einheitenzahl ist (d. h. 1 im Gegensatz zu 1px) und keine Zeichenkette. Sie können ihn auch nicht austricksen! Ich habe versucht, schlau zu sein, so
/* Invalid, no tricks */
::after {
content: "" 1;
}
Sie können jedoch Zahlen aus Attributen ausgeben, wie Sie vielleicht vermuten
<div data-price="4">Coffee</div>
/* This "works" */
div::after {
content: " $" attr(data-price);
}
Aber natürlich würden Sie nie generierte Inhalte für wichtige Informationen wie einen Preis verwenden, oder?! (Bitte tun Sie das nicht. Es ist weder sehr zugänglich noch ist der Text auswählbar.)
Auch wenn Sie diese Zahl abrufen und anzeigen können, ist es nur eine Zeichenkette. Sie können damit nichts wirklich anfangen.
<div data-price="4" data-sale-modifier="0.9">Coffee</div>
/* Not gonna happen */
div::after {
content: " $"
calc(attr(data-price) * attr(data-sale-modifier));
}
Sie können überhaupt keine Zahlen verwenden
/* Nope */
::after {
content: calc(2 + 2);
}
Achtung! Versuchen Sie nicht, Zeichenketten zu verketten, wie Sie es vielleicht in PHP oder JavaScript tun würden
/* These will break */
::after {
content: "1" . "2" . "3";
content: "1" + "2" + "3";
/* Use spaces */
content: "1" "2" "3";
/* Or nothing */
content: "1 2 3";
/* The type of quote (single or double) doesn't matter, but content not coming back from attr() does need to be quoted. */
}
Es gibt eine Sache in der Spezifikation zum Konvertieren von Attributen in den tatsächlichen Typ, anstatt sie alle als Zeichenketten zu behandeln…
<wood length="12" />
wood {
width: attr(length em); /* or other values like "number", "px", or "url" */
}
… aber ich bin mir ziemlich sicher, dass das noch nirgendwo funktioniert. Außerdem hilft es uns sowieso nicht bei Pseudoelementen, da Zeichenketten bereits funktionieren und Zahlen nicht.
Die Person, die mich per E-Mail kontaktiert hat, war insbesondere verwirrt, warum sie calc() für content nicht verwenden konnte. Ich bin mir nicht sicher, ob ich Ihnen in dieser Situation bei der Mathematik helfen kann, aber es ist erwähnenswert, dass Pseudoelemente Zähler sein können und diese Zähler ihre eigene begrenzte Form von Mathematik durchführen können. Hier ist zum Beispiel ein Zähler, der bei 12 beginnt und für jedes Element auf dieser Ebene im DOM um -2 inkrementiert.
Sehen Sie den Pen Backwards Double Countdown von Chris Coyier (@chriscoyier) auf CodePen.
Das Einzige, was wir hier noch nicht erwähnt haben, ist, dass ein Pseudoelement ein Bild sein kann. Zum Beispiel
p:before {
content: url(image.jpg);
}
… aber es ist seltsamerweise begrenzt. Sie können das Bild nicht einmal in der Größe ändern. ¯\_(ツ)_/¯
Viel häufiger ist die Verwendung einer leeren Zeichenkette für den Wert (content: "";), die Dinge wie Clear Floats bewirken kann, aber auch positioniert, skaliert und einen eigenen Hintergrund haben kann.
Coooool… Ich wusste nie, dass ich mit reinem CSS zählen kann
Ich frage mich, ob Sie die Höhen-/Breiten-Eigenschaften eines Elements als Ersatz für zumindest die Schriftgröße verwenden könnten, die ich für das Bild selbst in diesem Codepen verwende https://codepen.io/spicedham/pen/pxzYYe ähnlich wie Sie calc in diesem Artikel demonstriert haben. Klingt, als ob vielleicht noch nicht.
Das ist nicht zugänglich, richtig, weil ich denke, dass ein Screenreader ein Pseudoelement nicht vorliest
Interessanterweise kann generierter Inhalt nicht nur ein Bild enthalten, sondern auch mehrere Bilder oder eine Mischung aus Text und Bildern (schnelles Beispiel: http://jsfiddle.net/63xLqbet/).
Außerdem ist es vielleicht erwähnenswert, dass der Entwurf der CSS Generated Content Level 3 Spezifikation den einzelnen Bildwert für die
content-Eigenschaft von der Mischung aus Text und Bildern unterscheidet: Ersteres wird als "content-replacement" bezeichnet und sollte sich wie das normaleimg-Element verhalten (einschließlich Größenänderung), während Letzteres "content-list" genannt wird (und sich wie der aktuelle Inhalt von Pseudoelementen verhält). Leider ist die Implementierung von "content-replacement" für Pseudoelemente, wie derzeit spezifiziert, nicht kompatibel mit dem bestehenden Inhalt, aber wahrscheinlich könnten wir die Spezifikation gemeinsam verbessern?Das, was mich stolpern ließ, war der Versuch, HTML-Entitäten oder rohe Font-Awesome (hohe ASCII)-Zeichen zu verwenden. In beiden Fällen müssen Sie Unicode-Zeichencodes verwenden.
Gut gemacht, Mann! Danke, dass Sie Ihr Wissen teilen.
Zähler können sogar dabei helfen, den
content-Wert auf einenvar()odercalc()zu setzen.Der
var()-FallDer
calc()-FallDas für den
contentverwendete Bild kann beispielsweise ein CSS-Verlauf seinLive-Test für all die oben genannten Dinge.
Vorsicht jedoch – die Verwendung von CSS-Verläufen funktioniert in der aktuellen Firefox-Version immer noch nicht, obwohl ich kürzlich eine E-Mail erhalten habe, die mir mitteilt, dass dieser alte Fehler behoben wurde. Ich hoffe, das bedeutet auch, dass
-moz-element()alscontent-Wert funktionieren wird, da ich ihn in meinen ursprünglichen Testfall aufgenommen habe.Das ist echte CSS-Trickserie.
Einige Screenreader lesen generierten Inhalt vor, glaube ich. Es ist jedoch erwähnenswert, dass nicht alles CSS für Webseiten ist. Generierter Inhalt wird im Paged Media-Modell verwendet, um Inhalte wie Kopf- und Fußzeilen einzufügen. Ich zeige einige davon hier https://www.smashingmagazine.com/2015/01/designing-for-print-with-css/
Kein großer Fan der content-Eigenschaft. Ich finde, sie verletzt die Trennung von Inhalt und Darstellung. Sie kann auch i18n / l10n je nach Ihrem Ansatz verkomplizieren.
Chris: „… ein Pseudoelement kann ein Bild sein [im content-Attribut] … aber es ist seltsamerweise begrenzt. Sie können das Bild nicht einmal in der Größe ändern. ¯_(ツ)_/¯“
In dieser Hinsicht stimmt es. Aber wenn Sie dem Pseudoelement ein background-image geben, dann öffnet sich eine neue Welt. /_☀__/\
Dann können Sie es nach Belieben in der Größe ändern, Sie können Sprites verwenden, sie responsiv, animiert und mehr machen. Mit den richtigen Berechnungen (oder einem guten Ausprobieren) ist die Größenänderung kein Problem.
Beispiele: clba.nl/experiments/styling-images-in-pseudo-elements