Ich habe mir die Zeit vertrieben, meinen CodePen-Feed nach Augenschmaus zu durchstöbern, und musste nicht weiter als bis zur ersten Seite gehen, bevor ich einen tollen CSS-Hover-Effekt von Adam Argyle entdeckte.
Ich muss 10 Minuten damit verbracht haben, einfach nur andächtig auf die Demo zu starren. Irgendetwas daran fühlt sich so App-ähnlich an. Ich glaube, es liegt daran, wie kontextbezogen es ist, dass die Hintergrundfarbe von links hereinrutscht und dann nach rechts hinausgeht. Es ist genau das Verhalten, das ich von einer Maus-rein-, Maus-raus-Interaktion erwarten würde.
Wie auch immer, ich habe einen neuen Pen gestartet und mich daran gemacht, ihn nachzubilden. Und es ist nichts allzu Komplexes, sondern eher eine clevere Nutzung von Übergängen und Transformationen, gepaart mit richtigen Offsets. Ziemlich elegant! Ich bin sogar ein wenig beschämt, wie lange es gedauert hat, bis ich verstanden habe, wie der Maus-raus-Teil funktioniert.
Hier ist, wie ich es angegangen bin, mit allen Ecken und Kanten.
„Ich wette, das verwendet einen Übergang auf einem background.“
Das war mein erster Gedanke. Definiere die background-color, setze die background-size und background-position, und dann animiere die background-position. So wurde diese "wachsende" Hintergrundfarbe in der Vergangenheit gemacht. Ich habe das selbst bei einigen Projekten gemacht, wie diesem
Wenn ich dasselbe tun könnte, nur von links nach rechts, dann bleibt nur noch das Maus-raus, oder? Nein. Das Problem ist, dass nichts wirklich dafür sorgen kann, dass die background-position von links nach rechts zu links nach rechts animiert wird. Ich könnte es entweder so oder so machen, aber nicht beides.
„Vielleicht ist es stattdessen eine transform.“
Mein nächster Versuch war, mich mit Transformationen zu beschäftigen. Die transform-Eigenschaft bietet eine Reihe von Funktionen, die sich für etwas komplexere Bewegungen zusammen animieren lassen. Zum Beispiel kann der background "wachsen" oder "schrumpfen", indem die scale() des Elements geändert wird. Oder in diesem Fall nur entlang der x-Achse mit scaleX().
Aber wie ich bereits erwähnt habe, gibt es keine Möglichkeit, den background des Elements zu isolieren, um das zu tun. Von scaleX(0) auf scaleX(1) zu gehen, skaliert das *gesamte* Element, so dass dies im Grunde den Link — Inhalt und alles — zu nichts zerquetscht und ihn dann wieder auf seine natürliche Größe dehnt, was ein völlig anderer Effekt ist. Außerdem bedeutet es, mit scaleX(0) zu beginnen, was das ganze verdammte Ding standardmäßig versteckt und es unbrauchbar macht.
Aber ein Pseudo-Element könnte funktionieren! Es spielt keine Rolle, ob das zerquetscht oder versteckt wird, da es nicht Teil des eigentlichen Inhalts ist. Ich muss den background stattdessen darauf legen und ihn direkt unter dem Link positionieren.
a {
/* Keeps the pseudo-element contained to the element */
position: relative;
}
a::before {
background: #ff9800;
content: "";
inset: 0; /* Logical equivalent to physical offsets */
position: absolute;
transform: scaleX(0); /* Hide by default */
z-index: -1; /* Ensures the link is stacked on top */
}
„Jetzt muss ::before bei Hover wechseln.“
Ich wusste, dass ich ::before von 0 auf 1 skalieren konnte, indem ich es an den :hover-Zustand des Link-Elements hänge.
a:hover::before {
transform: scaleX(1)
}
Schön! Ich war auf dem richtigen Weg.
Ein wenig transition-Feenstaub darauf gestreut, und die Dinge beginnen zum Leben zu erwachen.
a::before {
background: #ff9800;
content: "";
inset: 0;
position: absolute;
transform: scaleX(0);
transition: transform .5s ease-in-out;
z-index: -1;
}
„Hmm, der Übergang bewegt sich in *beiden* Richtungen.“
Auch hier war ich irgendwie festgefahren. Etwas in meinem Kopf klickte aus irgendeinem Grund nicht. Wie üblich, bin ich zum CSS-Tricks Almanac gegangen, um zu sehen, welche Eigenschaft ich vielleicht vergessen hatte.
Ah, ja. Das wäre transform-origin. Das erlaubt mir, festzulegen, wo die transform beginnt, was nicht völlig unähnlich dem Festlegen der background-position ist, wie ich es früher versucht habe. Die transform könnte von links beginnen, anstatt von der Standardposition 50% 50%.
a::before {
background: #ff9800;
content: "";
inset: 0;
position: absolute;
transform: scaleX(0);
transform-origin: left;
transition: transform .5s ease-in-out;
z-index: -1;
}
Ja, so:
Ich habe ::before bereits zu scaleX(1) bei Link-Hover animiert. Wenn ich transform-origin gleichzeitig von left auf right umkehre, dann geht der Hervorhebung vielleicht auf die entgegengesetzte Weise aus, wie sie herausging, wenn die Maus den Bereich verlässt?
a:hover::before {
transform: scaleX(1);
transform-origin: right;
}
🤞
Hoppla, verkehrt herum! Tauschen wir die Werte left und right. 🙃
Wunderschön. Danke, Adam, für die Inspiration!
Hier ist ein Pen des Effekts mit
background-sizeund einem linearen Gradienten. Der Vorteil der Verwendung von Hintergrund für diese Funktion ist, dass sie für Links funktioniert, die sich über mehrere Zeilen erstrecken können, wie z. B. Linktext innerhalb eines Fließtextes. Ich habe diesen Effekt in den letzten Jahren bei vielen meiner Projekte verwendet.Jawoll, super!
Ich schätze, dass dieser Artikel sowohl den Denkprozess als auch, was noch wichtiger ist, die Teile zeigt, die nicht funktioniert haben.
Viele Autoren wollen die Klügsten im Raum sein, bei denen die Antworten ihnen einfach durch göttliche Inspiration kommen, daher ist es erfrischend zu sehen, dass jemand meine "Wirf Zeug an die Wand und scheitere vorwärts"-Methode teilt, die ich verwende.
Ich meine, es gibt VIELE Probleme damit.
Der Link muss im Grunde ein Button sein. Ihn in einem Textblock zu haben, macht ihn kaputt, besonders wenn der Linktext auf eine neue Zeile umbricht.
Wenn man schnell und wiederholt darüber fährt, springt der Übergang ans Ende, bevor er neu startet.
... Randlinien oder besser noch, Innen-Box-Schatten und die Vergrößerung ihrer Größe könnten helfen, das erste Problem zu beheben.
Bessere (engere) Übergangsdefinitionen werden wahrscheinlich das zweite Problem beheben.
Coole Sache. Vielleicht kannst du deinen eigenen Beitrag schreiben, in dem du deinen Denkprozess durchgehst, um es besser zu machen. Das würde ich lesen.
Ich unterstütze, dass ich das lesen würde, wenn du einen Artikel schreibst, der uns erklärt, wie man das strafft! Ich würde es gerne verwenden und ich würde es WIRKLICH gerne so sauber wie möglich haben.
Herr Graham,
Hater hassen halt. Ich habe den Artikel wirklich genossen.
Lustigerweise kann man den ursprünglichen Effekt nur mit Hintergrundübergängen erzielen!
Der Trick besteht darin, einen Übergang auf
background-sizezu verwenden, aber nicht aufbackground-position. Auf diese Weise kann man die Hintergrundposition ändern, bevor die Animation der Hintergrundgröße überhaupt beginnt, und der Benutzer wird es nie merken können, weil der Hintergrund immer entweder komplett gefüllt oder komplett leer sein wird! :DCodepen: https://codepen.io/sloanfinger/pen/XWePVGj
Ha, ja. Mein Bauchgefühl war richtig, aber ich habe mich für einen anderen Ansatz entschieden, als meine Stile unordentlich wurden. Und natürlich begann ich zu erkennen, wo ich mit dem Hintergrundansatz falsch lag, als ich bereits bis zur Hüfte in
transformsteckte. Das ist das Lustige an der Weitsicht, aber auch das Tolle an CSS — so viele Wege, ähnliche Dinge zu erreichen. Noch lustiger ist, dass ich auf denselben Ansatz gestoßen bin wie Adam!Alternativ kann man ein Before verwenden. Und die Ausrichtung wechseln
Schön – ich vermute, man könnte es auch mit Innen-Box-Schatten machen. Der einzige Nachteil ist, dass man eine magische Zahl für die Breite des Box-Schatten festlegen muss.
Wie andere bereits erwähnt haben, ist die Verwendung von
backgroundmitbackground-positiondefinitiv der richtige Weg. Ich habe einen Beitrag über 5 verschiedene Variationen geschrieben, die für Leute nützlich sein könnten https://nerdcowboy.com/blog/sliding-underlined-links/Ich habe etwas Ähnliches gemacht, aber diagonal.
Ausführlich erklärt in diesem Artikel von 2018.
Die Taktik "
transformanimieren, abertransform-originabrupt umkehren" kann auch bei vielen coolen Effekten in 3D helfen, wie in dieser Serie von Demos von Anfang 2016Blöcke
Flair
[Dieser hatte einen Schraubstock]https://codepen.io/thebabydino/pen/qZJevJ)
Eine Frage der Zeit
Schlangenbewegung
Erstaunliche Arbeit wie immer, Ana! Danke fürs Teilen.
Kann ich dich herausfordern, die (Schrift-)Farbe synchron zu ändern?!
Oooo, liebe das. Ich frage mich nur, ob man die Schriftfarbe gleichzeitig ändern könnte, um einen vollständig barrierefreien Farbkontrast zu erzielen und trotzdem toll auszusehen.
–bg-h: was bedeutet das?