Nehmen wir an, Sie möchten ein Element für einen lustigen visuellen Effekt bei :hover bewegen.
@media (hover: hover) {
.list--item {
transition: 0.1s;
transform: translateY(10px);
}
.list--item:hover,
.list--item:focus {
transform: translateY(0);
}
}
Kühl, kühl. Aber was, wenn Sie mehrere Listenelemente hätten und diese sich alle beim Hovern bewegen sollten, aber jedes mit einer gestaffelten Zeitverzögerung?
Der Trick liegt in transition-delay und der Anwendung einer leicht unterschiedlichen Verzögerung auf jedes Element. Wählen wir jedes Listenelement einzeln aus und wenden wir unterschiedliche Verzögerungen an. In diesem Fall wählen wir einen internen Span nur zum Spaß aus.
@media (hover: hover) {
.list li a span {
transform: translateY(100px);
transition: 0.2s;
}
.list:hover span {
transform: translateY(0);
}
.list li:nth-child(1) span {
transition-delay: 0.0s;
}
.list li:nth-child(2) span {
transition-delay: 0.05s;
}
.list li:nth-child(3) span {
transition-delay: 0.1s;
}
.list li:nth-child(4) span {
transition-delay: 0.15s;
}
.list li:nth-child(5) span {
transition-delay: 0.2s;
}
.list li:nth-child(6) span {
transition-delay: 0.25s;
}
}
Siehe den Pen
Gestaffelte Animationen von Chris Coyier (@chriscoyier)
auf CodePen.
Wenn Sie sich etwas mehr programmatische Kontrolle verschaffen wollten, könnten Sie die Verzögerung als benutzerdefinierte CSS-Eigenschaft festlegen
@media (hover: hover) {
.list {
--delay: 0.05s;
}
.list li a span {
transform: translateY(100px);
transition: 0.2s;
}
.list:hover span {
transform: translateY(0);
}
.list li:nth-child(1) span {
transition-delay: calc(var(--delay) * 0);
}
.list li:nth-child(2) span {
transition-delay: calc(var(--delay) * 1);
}
.list li:nth-child(3) span {
transition-delay: calc(var(--delay) * 2);
}
.list li:nth-child(4) span {
transition-delay: calc(var(--delay) * 3);
}
.list li:nth-child(5) span {
transition-delay: calc(var(--delay) * 4);
}
.list li:nth-child(6) span {
transition-delay: calc(var(--delay) * 5);
}
}
Das könnte Ihnen vielleicht ein wenig zu heikel sein. Sagen wir, Ihre Liste beginnt zu wachsen, vielleicht auf sieben oder mehr Elemente. Das Staffeln funktioniert plötzlich nicht mehr bei den neuen Elementen, da dies nicht ausreicht, um so viele Listenelemente zu berücksichtigen.
Sie könnten die Verzögerung von HTML übergeben, wenn Sie wollten
<ul class="list">
<li><a href="#0" style="--delay: 0.00s;">① <span>This</span></a></li>
<li><a href="#0" style="--delay: 0.05s;">② <span>Little</span></a></li>
<li><a href="#0" style="--delay: 0.10s;">③ <span>Piggy</span></a></li>
<li><a href="#0" style="--delay: 0.15s;">④ <span>Went</span></a></li>
<li><a href="#0" style="--delay: 0.20s;">⑤ <span>To</span></a></li>
<li><a href="#0" style="--delay: 0.25s;">⑥ <span>Market</span></a></li>
</ul>
@media (hover: hover) {
.list li a span {
transform: translateY(100px);
transition: 0.2s;
}
.list:hover span {
transform: translateY(0);
transition-delay: var(--delay); /* comes from HTML */
}
}
Oder, wenn Sie Sass-affin sind, könnten Sie eine Schleife mit mehr Elementen erstellen, als Sie gerade benötigen (wissend, dass der zusätzliche Code ziemlich effizient komprimiert wird)
@media (hover: hover) {
/* base hover styles from above */
@for $i from 0 through 20 {
.list li:nth-child(#{$i + 1}) span {
transition-delay: 0.05s * $i;
}
}
}
Das könnte nützlich sein, ob Sie nun für mehr als nötig schleifen oder nicht.
Ich bevorzuge die Sass-Version, da ich sie für viele verschiedene Dinge verwendet habe. Ich habe einen Ein-Farb-Themengenerator unter anderem für einfache Staffelungseffekte auf Codepen erstellt. Es werden viele nth-childs erzeugt, obwohl ich CSS-Variablen noch nicht genutzt habe.
In der Produktion könnte man argumentieren, dass die CSS- und HTML-Technik in größerem Maßstab einfacher zu kontrollieren wäre, auch wenn sie die Verzögerung in ein (höchstwahrscheinlich) separates Dokument legt.
Es scheint nicht allzu schwierig zu sein, den Index in der CSS-Spezifikation zu implementieren. Nth-child, aber in calc verwendbar. Die li würde vermutlich wissen, wie viele Elemente in der ul/ol davor kamen.
.list-item:nth-child(index) span {
transition-delay: calc(index + var(–delay));
}
Ich schätze, Sass ist bis dahin der richtige Weg. Oder JS.
Das Menü der Apple-Mobilseite ist ein schönes Beispiel dafür. Sie haben es etwas abgeschwächt von dem, was es früher war, aber man kann den gestaffelten Fade-Effekt beim Öffnen/Schließen immer noch gerade so erkennen.
Schnelles Hovern und De-Hovern auf diesem Codepen macht Spaß!
Heute habe ich von
@media (hover: hover)gelernt, es testet, ob der primäre Eingabemechanismus des Geräts über Elemente schweben kann. Danke!Warum verwendet CSS-Tricks so oft Listenelemente für Dinge, die keine Listenelemente sind, wie in diesem Fall? Es macht die Dinge nur ein kleines bisschen schwerer zu verstehen, zu lesen und kollidiert wirklich mit dem Gesamtbild der Semantik, meiner Meinung nach.
Ich habe einen anderen Designer gefragt, warum er das tut, und er sagte: "Weil WordPress das tut." Persönlich denke ich, dass WordPress-Code ein Zugwrack ist, das man niemals nachahmen sollte, aber was weiß ich schon?
Es soll eine Navigation nachahmen, wie sie das alte CSS-Tricks-Design hatte, und Navigation sollte in einer Liste sein.
Ich weiß nicht einmal, wie ich darauf reagieren soll. WordPress, was, setzt automatisch alles Markup in Listen? Wo? Wie? Was ist hier überhaupt los?
Ich bin mir nicht sicher, ob ich den Verweis auf WordPress richtig verstehe, aber das ist ein Anwendungsfall für eine Liste, weil es *eine Liste von Wörtern* ist, keine zusammenhängende Aussage, die als solche gelesen werden soll.
Ich glaube, was Texxs hier argumentiert, ist im Wesentlichen das Argument "Navigations sind keine Listen", nur vielleicht breiter gefasst. Das würde den WordPress-Code-Teil sinnvoller erscheinen lassen, da WordPress standardmäßig seine Navigation als Listen ausgibt.
Trotzdem... es ist ein alter Kampf, der nie entschieden wird. Wenn es eine Stack-Overflow-Frage wäre, würde sie geschlossen werden, weil jede Antwort "hauptsächlich meinungsbasiert" wäre.
Die Verwendung von Listenelementen für Ihre Navigation ist sehr nützlich. CSS-Tricks hat 2013 einen Artikel dazu veröffentlicht: https://css-tricks.de/navigation-in-lists-to-be-or-not-to-be/
Es hat nichts mit der Verwendung von WordPress zu tun. Listen vermitteln Navigationshierarchie mit Klarheit. Und sie sind gut für Screenreader. Mehr Infos hier: https://www.w3.org/TR/2008/WD-WCAG20-TECHS-20081103/H50 und im oben genannten Artikel
Wenn jemand nicht erklären kann, warum er etwas verwendet, und seine einzige Erklärung lautet: "nur weil WP es tut", dann ist das schlecht.
Aber in diesem Fall ist die Verwendung von Listen gerechtfertigt. Das Beispiel ist eine Liste von Wörtern, das Design zeigt auch etwas, das typischerweise ein Menü ist, und das ist typischerweise eine Liste, weil es tatsächlich eine Liste von Einträgen ist. Macht Sinn.
Das scheint ein großartiger Kandidat für etwas wie
transition-delay: calc(0.05 * attr(data-delay));zu sein, wobei Sie das Attribut aus
<span data-delay="1">...</span>ziehen. Was... laut
calc()möglich sein sollte, aber ich schätze, in den 5+ Jahren, seit dies vereinbart wurde, hat kein Browserentwickler es tatsächlich umgesetzt.Als ich die Verwendung von benutzerdefinierten Eigenschaften sah, hätte ich erwartet, den Index anstelle der Verzögerung zu übergeben
<span style="--index: 1">...</span>Und dann in der CSS zu verwenden
transition-delay: calc(var(--delay) * var(--index));Einverstanden! Ich kann es kaum erwarten, bis das umgesetzt wird.
Um den Browsern fair zu sein, liegt der Grund, warum dies derzeit nicht funktioniert, nicht an der
calc()-Spezifikation. Dieattr()-Funktion ist durch die CSS Level 2-Spezifikation sehr eingeschränkt – sie kann nur in dercontent-Eigenschaft verwendet werden, und der referenzierte Wert wird immer als<string>zurückgegeben.Mit den bevorstehenden Änderungen in CSS Values 3 können Sie
<type-or-unit>und<fallback>-Argumente fürattr()angeben. Ihr Beispiel würde also lauten:Sehr cool und schnell verdaulich. Danke fürs Teilen!
Ich liebe das "Laut-denken" in diesem Artikel, Chris. Es hat mich zum Nachdenken gebracht: Wie einfach wäre es, mit nur ein wenig Javascript dynamisch CSS-benutzerdefinierte Eigenschaften für den Index hinzuzufügen?
Es stellte sich heraus, dass es relativ einfach war: Ich habe den Pen hier gegabelt: https://codepen.io/kbav/pen/gOYMYJm
Als nächstes möchte ich mit Mutationsbeobachtern herumspielen, um zu sehen, ob ich dynamisches Hinzufügen/Entfernen/Filtern/Sortieren von Listen usw. lösen könnte, da die Reihenfolge der benutzerdefinierten Eigenschaften nicht mehr ihrer "wahren" Indexierung entspricht.
Übrigens, wäre es nicht erstaunlich, wenn
:nth-child(n)-Selektoren die Wiederverwendung vonnincalc()erlauben würden? :)