Wussten Sie, dass Sie die `content`-Eigenschaft von Pseudo-Elementen animieren können? Laut der Liste der animierbaren Eigenschaften in der Spezifikation sollten Sie das nicht können, aber in der neuesten Version von Desktop Chrome können Sie es. Die folgende Demo sollte von "A" nach "B" animieren, indem die `content`-Eigenschaft innerhalb einer `@keyframes`-Animation geändert wird.
Der Code
Um eine Buchstabentausch-Demo wie die obige zu erstellen, erstellen wir ein leeres <div>, das wir mit dem content seines Pseudo-Elements füllen werden, wie folgt:
<div class="letter-changer"></div>
Und dann setzen wir den content seines Pseudo-Elements so, dass er sich ändert, wie wir es mit jeder anderen CSS-Eigenschaft tun würden, indem wir eine neue `@keyframes`-Animation erstellen und sie mit der `animation`-Eigenschaft einrichten.
@keyframes changeLetter {
0% {
content: "A";
}
50% {
color: white;
}
100% {
content: "B";
}
}
.letter-changer::after {
animation: changeLetter 3s linear infinite alternate;
}
Könnte das nützlich sein?
Die Tatsache, dass es in den meisten Browsern nicht funktioniert und nicht standardisiert ist, macht die Verwendung etwas riskant. Aber es gibt ja auch das ganze "Paving-Cowpaths"-Ding (d. h. wenn es offensichtlich nützlich ist, *könnte* es standardisiert werden).
In einem Beitrag letzte Woche beschrieb ich eine Methode zum Inkrementieren der Zahlen in einer Ladeleiste. Sie verwendete genau dieses Konzept, um die Zahlen zu inkrementieren. Hier ist ein weiteres Beispiel in diesem Sinne: ein Countdown!
Browser-Unterstützung
Bei meinen eigenen Tests hat die Animation von content *nur* im stabilen Desktop Chrome (v46 zum Zeitpunkt des Schreibens) funktioniert. Überall sonst keine Unterstützung. Kein Safari auf dem Desktop oder iOS. Kein Firefox. Kein IE. Jeder dieser Browser ignoriert die Animation und zeigt nur den ursprünglichen content im Pseudo-Element an.
Es könnte ein praktischer Trick in ferner Zukunft sein *oder* es könnte nie von irgendetwas unterstützt werden. Nicht standardisierte Funktionen laufen immer Gefahr, veraltet zu werden, daher könnte diese Chrome-Unterstützung nicht ewig andauern.
Erneuter Blick auf die Browserunterstützung im September 2017: Funktioniert in Chrome/Mobile, Firefox und Opera, aber nicht in IE, Edge oder iOS.
Erneuter Blick auf die Browserunterstützung im Oktober 2020: Edge wurde zu Chrome, das ist also gelöst. IE-Unterstützung wird immer seltener. Immer noch keine iOS-Unterstützung.
Wenn Sie Inhalte auf eine browserübergreifende Weise ändern müssen
Verwenden Sie JavaScript.
Ich finde, dass selbst ein `content`-Attribut in CSS *sehr* falsch ist!
Warum? Es ist in vielen verschiedenen Situationen nützlich, wie z. B. für Clearfix, zur Erstellung von Rahmen mit unterschiedlichen Breiten usw.
+1 Adrian
Ich empfinde das genauso, CSS sollte sich mit Styling befassen, nicht mit dem Inhalt.
Die Animation kommt auf mobilen Chrome für Android laut und deutlich durch. Ich bin aber irgendwie bei Kino, während ich mir vorstellen kann, dass das konzeptionell Spaß macht, damit herumzuspielen, macht es mir Angst, daran zu denken, Inhalte von CSS generieren zu lassen und nicht nur stylen. Ich würde es vorziehen, Countdowns, Ladefortschrittsanzeigen usw. dort zu programmieren, wo sich der Rest meiner Inhalte befindet, anstatt die Kontrolle an meine CSS-Datei abzugeben.
Der einzige Fall, in dem ich das `content`-Attribut nicht missbillige, ist, wenn es für Font-Icons verwendet wird, und ich denke, diese Funktion könnte für die Animation von Icons nützlich sein.
Gut gemacht, Robin und Chrome – her mit dem plattformübergreifenden Code! Nutzbarkeit für ein Jahrzehnte altes Regelwerk (das zur Bereitstellung von Forschungsarbeiten gedacht war) zu opfern, macht einfach keinen Sinn mehr. Wenn es funktioniert, los geht's!
Zum Thema "Kein
contentüberhaupt! D:<" istcontentextrem nützlich in Fällen, in denen das Berühren des HTML unerwünscht oder schwierig ist. Betrachten Sie schlecht gemachte Tumblr- oder wahrscheinlich WordPress-Styles, die Sie ändern möchten, oder Browsererweiterungen, die es Ihnen ermöglichen, CSS einzufügen. Es ist auch nützlich für Informationen, die die Seite aus irgendeinem Grund weniger zugänglich machen würden, als wenn sie übercontenthinzugefügt würden, wie z. B. ein kleiner Geschmacks-Text oder, wie Herman erwähnte, Icon Fonts.Was den Inhalt des Artikels betrifft, ich glaube nicht, dass ich das mag. Es ist nicht nur nicht spezifikationskonform, sondern auch ziemlich begrenzt in dem, wofür es richtig verwendet werden kann. Ich sage, markieren Sie es als eine clevere Eigenheit und lassen Sie es so.
Bezüglich des Standardisierungsgrades dieser Funktion
Der oben verlinkte Entwurf der CSS Transitions-Spezifikation wurde zuletzt vor zwei Jahren (November 2013) neu veröffentlicht. Seitdem wurden eine Reihe von Änderungen in den Editor's Draft aufgenommen, darunter ein neuer Ansatz für "animierbare Eigenschaften".
Während die alte Spezifikation nur die Animation von Eigenschaften unterstützte, die kontinuierlich interpoliert werden konnten (Zahlen, Farben usw.), erlaubt der neue Entwurf praktisch jeder Eigenschaft die Animation, durch Anwendung diskreter (gestufter) Übergänge. Die einzigen Eigenschaften, die nicht animiert werden können, sind diejenigen, die logische Implementierungsprobleme mit Übergängen oder Animationen verursachen würden. Dies ist im Wesentlichen der Ansatz, der zur Definition animierbarer Eigenschaften in SVG/SMIL verwendet wird.
Mit anderen Worten, wenn es keine größeren Probleme mit Testimplementierungen wie Chrome gibt, wird dies wahrscheinlich in Zukunft standardisiert werden.
Die `content`-Eigenschaft ist nur eine von vielen Eigenschaften, die von dieser Änderung betroffen sind. Dennoch sind die Bedenken anderer Kommentatoren hinsichtlich der Verwendung von `content` für substanzielle Textinhalte berechtigt. Nur nicht-essenzielle, dekorative Effekte, bitte!
Toller Kommentar.
Nützlich, informativ, nuanciert und gut recherchiert.
Vielen Dank.
Zu den Punkten von Kino und Matt: Ich finde, dass Inhalte innerhalb von CSS ihren Platz haben. Zum Beispiel verwende ich es oft, um Inline-Listenelemente zu trennen. Meiner Meinung nach ist es eine Designfrage, ob Elemente durch |, Kommas, Klammern usw. getrennt werden. Die Möglichkeit, es zu animieren, erscheint fair.
Es scheint auf Chrome für Android zu funktionieren.
Dies ist eine sehr nützliche – und einfache – neue Möglichkeit für uns Web-Designer mit CSS. :)
Robin, danke für deine Entdeckung und Demo.
Zum Dogma "CSS ist nur für Stile" – Das ist Theorie über Praktikabilität – ergibt keinen Sinn.
Und es ist großartig von Amelia zu wissen, dass dies standardisiert wird.