Für die größeren Werbeboxen im Design von Uniqlo.com werden animierte Streifen verwendet, die beim Überfahren mit der Maus erscheinen. Das ist ziemlich genial, wenn Sie mich fragen. Vielleicht, weil sie den Vorteil mit so vielen verschiedenen Browsern wie möglich teilen wollten, haben sie ein animiertes GIF verwendet, um den Effekt zu erzielen. Es ist mit 4K recht klein, aber wie wir hier wissen, ist es auch eine weitere HTTP-Anfrage. Lassen Sie uns den Effekt im Stil von progressive enhancement nachbilden: weniger Browserunterstützung, aber effizienter.

Das HTML
Wir *könnten* dies mit *nur* dem Elternelement tun, indem wir seinen Hintergrund auf :hover auf animierte Streifen ändern. Die Streifen auf Uniqlo blenden jedoch ein, sie erscheinen nicht einfach sofort. Leider gibt es für uns keine background-opacity, zu der wir überblenden könnten, um uns zu helfen.
Wir könnten stattdessen das ::before Pseudo-Element verwenden und die Opazität nutzen, um das Ganze ein- und auszublenden, aber die Unterstützung für Übergänge bei Pseudo-Elementen fängt gerade erst an, akzeptabel zu werden.
Nur dieses eine Mal verwenden wir ein zusätzliches Element, um unseren speziellen Hintergrund zu handhaben
<div class="product">
<div class="product-hover"></div>
<!-- all the product information and stuff -->
</div>
Das CSS
Das .product hat etwas Padding, das im Wesentlichen den dicken weißen Rand freilegt, wo die animierten Streifen erscheinen werden.
.product {
background: white;
padding: 20px;
position: relative;
}
Wenn wir dann unser .product-hover absolut an jeder Ecke positionieren, wird der Hintergrund davon in diesem 20px padding um das Produkt herum angezeigt. Standardmäßig setzen wir die opacity auf 0, damit es nicht sichtbar ist.
.product-hover {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0;
}
Die Streifen
Um nun den animierten „Barberpole“-Streifen zu erstellen, müssen wir einen linearen Gradienten von 45 Grad verwenden, um ein wiederholbares Quadrat zu erzeugen, das wie Streifen aussieht. Hier ist der Code dafür.
.product-hover {
background-size: 30px 30px;
background-image: linear-gradient(
45deg,
rgba(black, 0.1) 25%,
transparent 25%,
transparent 50%,
rgba(black, 0.1) 50%,
rgba(black, 0.1) 75%,
transparent 75%,
transparent
);
}
Es gibt auch einige diagonale Streifen in Lea Verous Mustergalerie. Der Code ist auch etwas leichter, aber er erlaubt nicht, dass der Hintergrund weiß oder transparent ist.
So funktioniert der Gradient

Das ist alles Standard-CSS, außer dem „schwarzen“ Wert in der RGBa-Angabe, der durch Sass ermöglicht wird.
Dieser 30px x 30px große Block ist perfekt wiederholbar und füllt das .product-hover mit Streifen.
Die Streifen einblenden
Es ist ein eigenständiges Element, also ist es sehr einfach
.product:hover .product-hover {
opacity: 1;
}
Das ist jedoch ein sofortiges Einblenden. Um das Ein- und Ausblenden zu realisieren, setzen wir eine CSS3 transition.
.product-hover {
transition: opacity 0.3s ease;
}
Die Streifen animieren
Wir brauchen hier animation (im Gegensatz zu transition), da wir möchten, dass sich die Streifen unendlich animieren.
Das Verschieben der background-position des .product-hover ändert, wo unsere kleine 30px x 30px Box beginnt, und lässt sie dadurch wie eine Barberstange erscheinen.
@keyframes barberpole {
from { background-position: 0 0; }
to { background-position: 60px 30px; }
}
Dann setzen wir diese Animation auf das Element, lassen sie linear (ohne Beschleunigung) ablaufen und sich unendlich wiederholen
.product-hover {
animation: barberpole 0.5s linear infinite;
}
Demo
Und fertig! Demo auf CodePen
Check out this Pen!
Es wäre cool, diesen Ansatz auch zu verwenden, um den „Marching Ants“-Auswahl-Effekt in Adobe Photoshop nachzuahmen!
Kann man nicht einfach
rgba()-Werte anstelle vonbackground-opacityverwenden?Für eine Volltonfarbe, ja. Aber wir verwenden hier einen Gradienten, bei dem einzelne Werte innerhalb des Gradienten nicht überblendet werden können (glaube ich).
Ich verwende ständig rgba in Gradienten! Es funktioniert bei mir gut. Der einzige Nachteil ist, dass die Syntax plötzlich viel länger wird.
Die Hintergrund-Gradient-Syntax ist bei mir tatsächlich eine einzige Zeile
@include background(linear-gradient(black, gray));Sass macht den Rest.
—
Übrigens stammt der obige Deklarationsblock aus Compass' Background Image mixin.
Es ist kein zusätzliches Element nötig. Alles, was Sie tun müssen, ist, die weißen Balken zu animieren und den Hintergrund beim Überfahren von weiß zu grau zu überblenden.
Sie verlieren jedoch das Ein- und Ausblenden, richtig?
Ich hatte den Übergang zu abrupt. Er blendet in Chrome jetzt schön ein, seit ich ihn auf 1 Sekunde erhöht habe, aber das könnte natürlich angepasst werden.
Beeindruckende Lösung, aber in der realen Welt würde ich wahrscheinlich die 4K-Anfrage für breitere Unterstützung wählen.
Das würde ich höchstwahrscheinlich auch, aber die „reale Welt“ bedeutet nicht automatisch „immer die tiefste Browserunterstützung anstreben“. Ich halte es für sinnvoller, offizielle Browser-Ziele festzulegen und Entscheidungen auf dieser Grundlage zu treffen. Und selbst dann hängt es davon ab, wie wichtig Sie verschiedene Teile davon erachten. Sind die Streifen das Wichtigste? Oder die Animation? Oder wäre eine Art Fallback mit Volltonfarbe in Ordnung? Vielleicht ist ein Modernizr-basierter Fallback angebracht? Vielleicht ist 4k und eine Anfrage keine große Sache, oder vielleicht überschreitet es Ihr Performance-Budget und diese Methode passt. Es ist eine komplexe Welt für Frontend-Entwickler!
Gute Arbeit, Chris! Es ist immer spannend zu sehen, was wir mit CSS ohne die Hilfe von Bildern machen können.
Ich habe diesen Effekt zum ersten Mal in deinem Tutorial gesehen... Er ist wirklich cool, Mann... Danke für so harte Arbeit für uns.
Mehrere Fragen zur Positionierung von
.product-hoveran allen vier Seiten (left,top,right,bottom)A. Was bewirkt das?
B. Gibt es andere Beispiele, bei denen man diese „4-Seiten-Positionierungstechnik“ anwenden würde?
Danke.
Das macht es exakt gleich groß wie das Elternelement, vorausgesetzt, das Elternelement ist nicht position: static; Häufig für Dinge wie Vollbild-Overlays.
Ich habe festgestellt, dass top: 0; left: 0; width: 100%; height: 100%; etwas „sicherer“ ist – zum Beispiel funktioniert ein iframe nur so, er nimmt nicht right/bottom. Aber wenn Sie box-sizing: border-box; nicht verwenden, riskieren Sie, dass 100% zu 100% + padding wird, was ebenfalls ein Sicherheitsrisiko darstellt (Scrollbalken auslöst).
Hmmm, interessant, Chris.
Ich habe vor einigen Jahren ein sehr ähnliches animiertes GIF für meine Website erstellt, und deshalb
habe ich ein Pen mit diesem Fall/dieser Frage erstellt, schau es dir an: Making position:absolute; top:0; left:0; right:0; bottom:0; work.
Notizen
• Ich habe
rem-Einheiten anstelle vonpxverwendet• Ich habe Sass + Compass verwendet, daher sehen Sie ein paar Mixins (nichts Besonderes)
• Der „animierte“ Rahmen ist immer sichtbar
Let me know what you think.
Danke.
Ich habe die gleiche Frage wie Ricardo. Sie sagen also, dass das Element „gestreckt“ wird und so breit und hoch wie das Elternelement wird, wenn Sie alle Ränder auf 0px setzen (mit Position und top/left/right/bottom, nicht mit der Margin-Eigenschaft)? Ich meine, es hat nicht einmal eine Breite oder Höhe, damit es angezeigt wird. Wie funktioniert diese Technik?
@Andrew, siehe meinen Beitrag oben.
Danke, Chris! Ich liebe diesen Effekt :) Verwende ihn jetzt auf meiner Seite (noch in Entwicklung)
Hallo, warum haben Sie nicht
rgba(0,0,0,0.1)für den Gradienten verwendet?Da Chris Sass verwendet, um seine CSS-Datei zu erstellen, können Dinge wie
#000, oder #000000, oder rgb(0,0,0)durch die Angabe vonblackerreicht werden, z.B.rgba(0,0,0,.5)=rgba(black,.5)Zitat aus dem Artikel: „Das ist alles Standard-CSS, außer dem „schwarzen“ Wert in der RGBa-Angabe, der durch Sass ermöglicht wird.“
Guter Trick, Chris! Ich habe es geliebt =)
Ich habe einmal versucht, ein schwierigeres Problem zu lösen, ich würde gerne sehen, wie Sie es versuchen :)
https://droplr.com/hello + ziehen Sie eine Datei über die Dropzone
Das Problem ist, dass sie einen Hack verwenden, den ich nicht benutzen möchte... es muss einen besseren Weg geben, um das zu tun!
FYI für diejenigen, die sich fragen, dies funktioniert nur in IE10. Chris hat auch einen weiteren Artikel über RGBa-Unterstützung geschrieben: RGBa Support. Toller Artikel, aber er funktioniert nicht browserübergreifend und erfordert einen Fallback für IE für Interessierte. Trotzdem immer toll, etwas Neues zu lernen! Prost & danke fürs Teilen.
Gute Arbeit!
Das GIF ist eigentlich 1,7k :) – aber zu diesem Zeitpunkt ist die HTTP-Anfrage eher ein Problem (etwas gemildert für wiederkehrende Besucher durch einen langen Expiry-Header). Die IE9-Unterstützung wäre wahrscheinlich ein Dealbreaker, aber unter der Annahme, dass die Leistung auf dieser Seite genauso gut oder besser ist (es ist schon viel los), könnte es ein Argument für browserspezifische Implementierungen geben.
In der Tat!
4KB muss die „zugewiesene Größe“ auf OS X oder was auch immer sein.
Es wird auch unter Windows als 4 KB angezeigt und, korrigieren Sie mich, wenn ich falsch liege, aber die 4 KB sind der „zugewiesene“ Speicherplatz auf der Festplatte und nicht die tatsächliche Dateigröße.
Die Dateigröße beträgt tatsächlich 1,697 Bytes / 1,65 KB.
:)
Hallo Chris, als Entwickler, der das Original auf uniqlo.com implementiert hat, muss ich sagen: sehr gute Arbeit! Leider verlangte Uniqlo, dass es auch in anderen Browsern als Webkit/FF funktionieren muss.
Was ich sicher eine kluge Entscheidung war! E-Commerce ist ein klassisches Beispiel dafür, warum tiefe Browserunterstützung sinnvoll und leicht zu rechtfertigen ist.
Hallo, Chris. Nettes Tutorial! Ich hätte nie an so etwas gedacht. Es sieht nett aus und zieht die Aufmerksamkeit auf den speziellen Beitrag/das spezielle Produkt.
Danke für das Tutorial!
Uniqlo.com ist eine schädliche Seite.
Sicherheitsbericht von F-Secure
http://browsingprotection.f-secure.com/swp/result?url=http%3A%2F%2Fwww.uniqlo.com%2Fus%2F&lang=en
Guter Trick, aber ich habe tatsächlich eine Technik, die kein anderes Element als das Bild verwendet.
Sie verwendet einen eingesetzten weißen Schatten, der beim Überfahren von weiß auf transparent übergeht.
Hier ist ein jsFiddle
http://jsfiddle.net/alicelieutier/RDq3a/
Wirklich schöner Effekt! Gibt es eine Möglichkeit, den reinen CSS-Code anstelle von nur Sass-Code zu posten? Nicht jeder, besonders Anfänger wie ich, verwendet bereits CSS-Präprozessoren... Das wäre sehr nett.
Eric, wenn Sie zum Beispiel in Codepen gehen, im mittleren Bereich, im CSS-Bereich, klicken Sie auf den oberen Titel, wo „CSS (SCSS)“ steht, dann sehen Sie das kompilierte CSS.
Ups, Entschuldigung, ich habe vergessen zu sagen, dass es nicht funktioniert, wenn es in eine HTML-Datei kopiert oder in zwei Dateien aufgeteilt wird. Entschuldigung auch für die Tippfehler oben…
Tolles Tutorial, Chris, ich würde das gerne auf meiner Produktwebsite anwenden. Aber ich habe eine Frage: Beeinträchtigt diese Animation die Browsergeschwindigkeit?
Das kommt mir wie Spam vor, aber hier ist meine Antwort trotzdem.
Alles beeinträchtigt die Browsergeschwindigkeit, von der Größe Ihrer CSS-, HTML-, JavaScript-, Bilddateien bis hin zur Menge an Markup, angeforderten Dateien (HTTP-Anfragen), bis hin zu den Animationen/Übergängen in Ihren CSS-Dateien und Bildern und deren Geschwindigkeiten.
Ich habe viele andere Dinge weggelassen, um die Antwort kurz zu halten.
Aber eine gute Faustregel ist: Verwenden Sie all diese Effekte mit Bedacht, denken Sie daran: „Es geht immer um die Benutzererfahrung“.
@Ricardo Zea: Nur Ihre Website und eine einzeilige Frage reichen nicht aus, um sie zu Spam zu machen :) Als Webentwickler besuche ich täglich Top-Design-Websites, um neue Dinge zu lernen.
Vielen Dank für Ihre Antwort. Ich stimme Ihnen zu. Die Benutzererfahrung steht immer an erster Stelle.
Schönes Tutorial! Eine Sache: Warum „erlaubt“ die repeating-linear-gradient()-Version in meiner Mustergalerie „nicht den Hintergrund weiß oder transparent zu sein“? Offensichtlich müssten Sie die Farben anpassen, aber abgesehen davon sehe ich kein Problem.
Sie haben Recht, es ist in Ordnung. Ich war bei meinem ersten Blick darauf verwirrt, weil die Art und Weise, wie es eingerichtet ist, von einem Vollton-Hintergrund abhängt und die Streifen dann transparent weiß darüber sind.
Wenn Sie den Hintergrund weiß machen, ist nichts sichtbar. Aber wie Sie sagen, können Sie die Farben so anpassen, dass es Volltonfarben anstelle von transparenten sind. Vielleicht ein einfacheres Beispiel wäre
http://dabblet.com/gist/5073506
Etwas weniger Browserunterstützung für wiederholende Gradienten, aber nicht genug, um eine Rolle zu spielen (http://caniuse.com/#search=gradient)
Ziemlich cooler Effekt!
Sehr schön, ich hätte es gerne als Markenzeichen.
Ziemlich süß!
Wow, großartige Arbeit, liebe den Code!
Sehr nett, ich wünschte, der CodePen wäre in reinem CSS für diejenigen von uns, die sich noch nicht für SASS/LESS/SCSS entschieden haben. Ich fange an, das Gefühl zu bekommen, dass wir reinen CSS-Nutzern die kalte Schulter gezeigt wird. :-)
@Chris C, wie ich Eric bereits sagte, wenn Sie zum Beispiel in Codepen gehen, im mittleren Bereich, im CSS-Bereich, klicken Sie auf den oberen Titel, wo „CSS (SCSS)“ steht, dann sehen Sie das kompilierte CSS.
OFFTOPIC--
Ich war bis vor kurzem ein „reiner CSS-Entwickler“ und wollte nicht zurückbleiben, also musste ich auf den CSS-Präprozessoren-Zug aufspringen, und heute kann ich mir nicht mehr vorstellen, CSS ohne Sass zu schreiben (und Compass und Bourbon und meine eigenen Mixins zu erstellen und mich von all den Dingen, die da draußen passieren, überfordern zu lassen, oh Junge).
Das ist für Ricardo,
Danke für die Information. Ich bin immer noch ein Vanilla-CSSer und lerne gerade Präprozessoren.
Ja, danke Ricardo... Ich wusste nicht, dass ich es so sehen kann!
Wenn die Hauptsorge eine zusätzliche HTTP-Anfrage ist, kann die Data-URI-Technik verwendet werden.
Sie erhöht die Größe etwas (statt 1,7 KB sind es 2,3 KB), ist aber browserkompatibler.
Es ist nicht die Hauptsorge, es wird nur zu einem größeren Problem als die Dateigröße. Der Data-URI ist ein interessanter Gedanke, der mir theoretisch gefällt (insbesondere für Schriftarten), aber auf einer großen Produktionswebsite habe ich ihn noch nicht praktisch eingesetzt, wenn man die Browserunterstützung, Wartung usw. berücksichtigt. Letztendlich denke ich, dass der richtige Weg hier die Lösung von Chris für die Browser ist, die es unterstützen, und der bestehende Code für den Rest. Wir werden sehen, ob es auf die Website kommt :)
Nun, es ist nicht so schwer, alle Browser mit einer einfachen Syntax zu pflegen und zu unterstützen.
Hier ist ein Beispiel mit Fallback auf ein Bild für IE6 und IE7
Verwenden Sie dies mit der inline-image()-Funktion von SASS oder LESS, und Sie haben die vollständige Lösung.
Einfach genial. Ich steige auch ein!
Scheint deutlich intelligenter zu sein, einfach ein animiertes GIF zu verwenden.
Ich würde tatsächlich einfach Flash verwenden, das scheint das unglaublich intelligenteste von allem zu sein.
Effizienter herunterzuladen, nicht effizienter zu rendern. Gradienten erfordern, dass der Browser den Gradienten generiert. Animierte Gradienten erfordern, dass der Browser die Gradienten bei jedem Frame generiert. Bilder hingegen werden einmal dekodiert.
Siehe den Google I/O-Talk, Jank Busters, https://www.youtube.com/watch?v=x0VR3lUOpdc