Am Wochenende fiel mir ein interessantes Design für eine Fortschrittsanzeige in einem Videospiel auf. Der %-Fortschritt wurde als Text in der Mitte des Balkens angezeigt und bewegte sich nicht. Aber der Text hatte die gleiche Farbe wie der Hintergrund des Balkens, der von links nach rechts gefüllt wurde. Es sah so aus, als würde der Hintergrund den Text unsichtbar machen, sobald sie sich überlappten, aber stattdessen kehrte sich die Textfarbe in Weiß um, überall dort, wo sie sich mit dem Hintergrund überlappte.
Mein erster Gedanke war: Wie können wir dieses Designmuster nachbilden und was können wir dabei lernen?
Hier ist, was ich mir ausgedacht habe, aber stellen Sie sicher, dass Sie diese Demo auf der neuesten Version von Chrome überprüfen, um alles richtig funktionieren zu sehen
Siehe den Pen Ein reiner CSS-Ladebalken von Robin Rendle (@robinrendle) auf CodePen.
Ziemlich cool, oder? Dies ist mit der erstaunlichen Magie von mix-blend-mode in CSS möglich.
Schauen wir uns zuerst den Markup an
<div class="wrapper">
<div class="bg">
<div class="text"></div>
</div>
</div>
Der .wrapper hält unsere Elemente an Ort und Stelle, .bg wird unser Ladebalken sein, der sich mit der Zeit erhöht, und unser .text-Element wird als Prozentinformation verwendet.
Machen wir das Ganze nur mit CSS
Ein „echter“ Lader im Web würde wahrscheinlich von JavaScript angetrieben und irgendwie auf tatsächliche Daten reagieren. Aber während wir hier Spaß haben, lassen wir das Ganze, sogar das Zählen, nur in CSS passieren (SCSS für die Schleifenunterstützung).
Wir richten unsere Variablen ein und stylen das .bg-Element
$loadingTime: 10s;
$color: rgb(255, 0, 0);
.bg {
background-color: $color;
animation: loading $loadingTime linear infinite;
}
Mit der loading-Animation ändern wir die Breite des Elements, wie folgt
@keyframes loading {
0% {
width: 0;
} 100% {
width: 100%;
}
}
Vielleicht hätten wir den Überlauf verstecken und die Hintergrundbox mit der transform-Eigenschaft verschieben können (aus Performance-Gründen), aber in dieser kleinen Demo denke ich, dass es in Ordnung ist, die animation der width-Eigenschaft allein zu verwenden.
Um den Inhalt des .text-Elements mit dem korrekten Prozentwert zu aktualisieren, müssen wir ein wenig schlau sein und eine Mischung aus Pseudo-Elementen und Animationen verwenden. Zuerst lassen wir das <div> leer und setzen den content seines after Pseudo-Elements auf 0%, bevor wir eine Animation definieren
.text {
color: $color;
width: 200px;
border: 1px solid $color;
&:after {
padding-left: 20px;
content: "0%";
display: block;
text-align: center;
animation: percentage $loadingTime linear infinite;
}
}
Was wir also mit der percentage-Animation oben machen wollen, ist, unseren content-Eigenschaft mit jedem Wert von 1 bis 100 zu aktualisieren, wie hier
@keyframes percentage {
0% {
content: "0%";
}
1% {
content: "1%";
}
/* ... */
100% {
content: "100%";
}
}
Aber anstatt all diese @keyframe-Selektoren von Hand zu erstellen, können wir uns mit der @for-Schleifensyntax in Sass vertraut machen
@keyframes percentage {
@for $i from 1 through 100 {
$value: $i + "%";
#{$value} {
content: $value;
}
}
}
Wenn das ein wenig beängstigend aussieht, keine Sorge! In der dritten Zeile fügen wir die aktuelle Zahl in der Schleife (die wir $i nennen) hinzu, machen sie zu einem String, indem wir % anhängen und sie einer Variablen zuweisen. Dann können wir Interpolation verwenden, um jeden @keyframe-Selektor den content-Eigenschaft auf den richtigen Wert aktualisieren zu lassen.
Der Farbwechsel
Schließlich müssen wir nur noch die Farbe und den mix-blend-mode unseres Pseudo-Elements einstellen und schon haben wir einen reinen CSS-Loader, bei dem die Hintergrundfarbe die Vordergrundfarbe beeinflusst
.text:after {
/* This value is the OPPOSITE color of our background */
color: rgb(0, 255, 255);
mix-blend-mode: difference;
}
Siehe den Pen Ein reiner CSS-Ladebalken von Robin Rendle (@robinrendle) auf CodePen.
Mit dem difference-Blend-Modus müssen wir den Farbwert des Textelements auf das Gegenteil des Hintergrunds setzen. Wenn unser Hintergrund also rgb(0, 0, 0) ist, müssen wir das Text-Pseudo-Element auf rgb(255, 255, 255) setzen.
Ich denke, diese kleine Demo hilft uns zu erkennen, wie nützlich die mix-blend-mode-Eigenschaft sein kann. Es wird in Zukunft alle möglichen Fälle geben, in denen Schnittstellen Informationen auf Arten offenlegen können, die wir nie für möglich gehalten hätten.
Textfarbe komplett ändern
Das Coole an dieser Technik ist, dass ein Teil des Textes eine Farbe und andere Teile des Textes eine andere Farbe haben. Die Umkehrung geschieht nur basierend darauf, was abgedeckt ist und was nicht, selbst wenn es nur ein Teil eines Buchstabens ist.
Wenn Sie eher eine auf Barrierefreiheit basierende „Ändere die Textfarbe, um sicherzustellen, dass sie genügend Kontrast hat“-Lösung suchen, kann Sass auch dabei helfen.
Ein weiteres Beispiel
Die XOXO-Website verwendete mix-blend-mode: darken; ziemlich oft, um Hintergründe, Formen und Text auf subtile/interessante/schöne Weise interagieren zu lassen, die wir im Web noch nicht oft gesehen haben.

Browser-Unterstützung
Die mix-blend-mode-Eigenschaft wird derzeit nicht gut unterstützt, ebenso wenig wie die animierbare content-Eigenschaft. Stellen Sie also sicher, dass Sie Fallbacks bereitstellen, wenn Sie sich für einen dieser Tricks entscheiden.
Guter Trick. Auch die Änderung des Inhalts innerhalb der Animationsschleife ist eine nette Idee. Die Blend-Modus-Sachen sind auch nett, es ist nur schade um die Browserunterstützung.
Sehr informativ
Schöne Technik, aber ein Artikel wie dieser *benötigt wirklich* Support-Informationen. Dies ist für die reale Nutzung noch nicht wirklich machbar, ohne einen (visuell stark abweichenden) Fallback für IE und alles außer der allerneuesten Android-Version einzuschließen. http://caniuse.com/#feat=css-mixblendmode
100% zustimmen, und IMO eine einfache Verbesserung.
Ich begann heute, diesen Artikel auf meinem Handy zu lesen, wurde unterbrochen und kam dann auf meinem Laptop zurück, nur um festzustellen, dass die Demos nicht funktionierten (Chrome). Anfangs dachte ich, dies sei eine dieser CSS-Eigenschaften, die nicht weit verbreitet, aber absolut nützlich und gut unterstützt sind. Ich lag falsch und war gleichzeitig enttäuscht.
Browserunterstützung vorab oder zumindest ein Hinweis darauf, dass dies nicht weit verbreitet ist, wäre fantastisch.
Das Fehlen *jeglicher* IE-Unterstützung schließt es für mich ziemlich aus, ich hätte es genauso gut nicht lesen können!
Für mobile/Electron-Apps hat es vielleicht einen gewissen Wert. Es ist schön zu wissen, dass Features existieren, aber es ist frustrierend, wenn man feststellt, dass sie in der realen Welt praktisch unbrauchbar sind.
Wunderbare Informationen……
Ich warte seit Jahren auf die
mix-blend-mode-Funktion in CSS. Alle meine Designer wollen schicke Blend-Modi für ihre Transparenz- und Schatteneffekte verwenden. Schade, dass IE es noch nicht unterstützt, der Edge/IE-Plattformstatus ist auch ziemlich entmutigend. Wenn sie es überhaupt in Version 14 hinzufügen würden, wäre ich überrascht.Sie könnten diesen Effekt auch mit CSS-Clip erreichen, eine Bibliothek wie https://github.com/salsita/jq-clipthru könnte das für Sie tun.
http://salsita.github.io/jq-clipthru/demo/
Tatsächlich war es vor ein paar Monaten noch nicht möglich, die content-Eigenschaft mit CSS zu animieren. Großartig!
Als CSS-Neuling fand ich das interessant. Ich stieß darauf, dass es in der stabilen Version von Chrome v46.0.2490.7a unter Win 7 64 nicht funktioniert, aber in Firefox, dann in Chrome Canary (48.02540.0) und dann... Chrome Android!
Wenn ich Scotts Link richtig verstehe, sollte es in Chrome 46 funktionieren, aber das tut es bei mir nicht. Nicht im „normalen“ Modus, auch nicht im Inkognito- oder Gastmodus.
Ich benutze auch Chrome v46.0.2490.7a und bei mir geht es auch nicht... :P
Es scheint, dass die automatische Prozentanzeige derzeit nur in Chrome Canary funktioniert.
Erster Halt, caniuse.com.
Suche nach mix-blend-mode…. hmmmm. Keine Unterstützung auch in IE11
Artikel vergessen. Komme in zehn Jahren wieder, um ihn zu lesen.
Viele Leute sagen „keine Browserunterstützung – kann es nicht verwenden“.
Warum fügen Sie dies nicht als progressive Verbesserung hinzu? Erstellen Sie eine Basisversion mit CSS, die funktioniert – fügen Sie dann mix-blend-mode hinzu, sodass alles, was es verarbeiten kann, den Jingle bekommt – und etwas, das es nicht kann, erhält eine solide Basisversion.
Das Problem ist, dass es auf Safari 9 so ziemlich unterstützt wird, in dem Sinne, dass die Zahl lesbar wird. Aber die Werte der Zahl ändern sich auf Safari nie – es ist 0 %, während der Balken fortschreitet. In Chrome werden die Werte korrekt hochgezählt.
Die Verwendung von etwas wie diesem bedeutet, dass ich eine Reihe von Fällen testen, herausfinden muss, wann die Unterstützung nicht gegeben ist (wenn es teilweise Unterstützung gibt, wie viel ist akzeptabel?) und dann all das programmieren, testen und warten muss. Oder, in einem solchen Fall, kann ich nach einer JS-Komponente suchen, die mit JS in jedem Browser funktioniert.
Verstehen Sie mich nicht falsch, ich liebe es, von diesen Dingen zu wissen, aber in der realen Anwendung sind solche Dinge problematisch, wenn die Unterstützung nicht nur wackelig ist, sondern keine klare Linie zwischen funktioniert/funktioniert nicht.
Es ist nicht nur die Browserunterstützung, sondern der Fallback, der zählt – was passiert, wenn diese Eigenschaft nicht unterstützt wird? Normalerweise werden sie einfach ignoriert.
Nachdem ich die beiden Beispiele überprüft habe, sehe ich, dass ein gewisses Maß an fortgeschrittener Visualisierung verloren geht, aber die Funktion der Website nicht beeinträchtigt wird.
Bevor Sie etwas als unbrauchbar abtun, testen Sie es in Browsern, in denen es nicht funktioniert, und sehen Sie, wie Sie es gracefully degradieren können. Sie werden sogar feststellen, dass es sowieso gracefully degradiert (denken Sie an border-radius auf IE7).
Ich denke auch, dass ein Hinweis auf die Unterstützung im Voraus nützlich wäre. Nicht, damit ich entscheiden kann, ob ich den Artikel lesen möchte oder nicht; ich würde ihn immer noch lesen, weil es nützlich sein könnte, zu wissen, was ich in Zukunft bedenken könnte.
Aber in diesem Fall hätte ich gerne Support-Informationen, weil der Artikel ohne eine funktionierende Demo viel schwieriger zu verstehen ist. Der Autor zeigt uns eine Demo und sagt „ziemlich cool, huh?“. Aber ich weiß nicht, was ich sehen soll oder was die Demo mir zeigen soll. Ich muss mich folglich doppelt so sehr anstrengen, um dem Artikel zu folgen.
Mit Support-Informationen im Voraus könnte ich den richtigen Browser starten, um den Artikel anzuzeigen, ohne alle auszuprobieren oder auf caniuse zurückgreifen zu müssen.
Sie haben absolut Recht, David. Ich habe den Beitrag um eine Notiz zur Browserunterstützung ergänzt und ihn auch vor der Demo etwas klarer gestaltet.
Hey – ich dachte, es wäre cool, eine Version ohne Blend-Modi zu haben.
Was denkst du?
http://codepen.io/anon/pen/BoJwZR
Das ist eine ziemlich nette Implementierung derselben Idee. Ich mag sie!
Hallo,
Könnten Sie näher erläutern, warum ein difference-Wert für mix-blend-mode dazu führt, dass die beiden betroffenen Farben irgendwie verschmelzen, um zu 255,255,255 zu werden.
Ein bisschen Farbtheorie wäre hier hilfreich!
Danke
Ich teile auch eine Folie über Stränge des Webdesigns. Ich diskutiere über das grundlegende Thema, das die meisten Premium-Websites verwenden.
Heh, vor etwa zwei Wochen habe ich den Difference-Blend-Modus verwendet, um einen ähnlichen Hover-Effekt auf Flat-UI-Buttons zu erzielen. Er zeigt auch einen ordentlichen Fallback (nur keine Übergänge) und wie man @supports verwendet, um gute Fallbacks sicherzustellen.
Sie sagen „stellen Sie sicher, dass Sie die neueste Version von Chrome verwenden, um sicherzustellen, dass die Demo ordnungsgemäß funktioniert“.
Ironischerweise funktioniert es in Firefox einwandfrei, aber in Chrome 46 sehe ich im CodePen-Widget nur eine schwarze Leere.
(und off-topic, aber „am besten in Chrome angezeigt“ ist eines meiner Haustiere des heutigen Webs – es ist, als hätten wir all die Lektionen vergessen, die wir von diesen „am besten in Netscape angezeigt“- und „am besten in IE angezeigt“-Buttons damals gelernt haben).
Was dieser Typ sagt, ich bin in der neuesten Version von Chrome und alles, was ich sehe, ist schwarz, aber es funktioniert gut in Firefox, vielleicht ein bisschen zu früh für diesen Artikel, da die Mehrheit der Leute, die ihn lesen, nichts sehen?
Anknüpfend an Ludwigs Kommentar von oben, hier ist eine IE9-kompatible Version ohne den Blend-Modus-Zauber
http://codepen.io/theprojectsomething/pen/pjadwY
TV-Untertitel sind mein Ausgangspunkt für diese Idee. Da text-shadow jetzt breiter unterstützt wird, ist es eine Möglichkeit, Text lesbar zu halten, und mit allen verfügbaren Farben können Sie eine Farbe einstellen, die zum Design passt.
Ich habe vor einiger Zeit einen ähnlichen Effekt mit SVGs und Masken erstellt. Er funktionierte gut mit dem Slider und Übergängen und älteren Browsern. http://documenta60.de