Haben Sie die Presse-Seite von Netlify gesehen? Es ist einer dieser Orte, an denen man sich eine Download-Version des Firmenlogos herunterladen kann. Ich habe heute Morgen danach gesucht, weil ich das Logo als Beitragsbild für einen Post hier auf CSS-Tricks benötigte.
Nun, ich bemerkte, dass sie diese hübsch aussehenden Schaltflächen zum Herunterladen des Logos haben. Sie sind klein und scharf. Sie ziehen die Aufmerksamkeit auf sich, stören aber nicht.
Sie sind auch interaktiv! Sehen Sie, wie sie sich erweitern und bei Hover das Wort „Download“ offenbaren.
Schön, oder?! Ich bemerkte tatsächlich, dass sie in Safari etwas seltsam aussahen.

Das machte mich neugierig, wie sie hergestellt werden. Also habe ich sie hier als Demo nachgebildet und dabei einige der Abstandsdinge bereinigt
Siehe den Pen
Netlify Sliding Buttons von Geoff Graham (@geoffgraham)
auf CodePen.
Wie haben sie das gemacht? Das Rezept besteht eigentlich aus vier Zutaten
- Verwendung der
left-Eigenschaft, um das „Download“-Label hinein- und herauszuschieben - Verwendung von
paddingim Hover-Zustand der Schaltfläche, um zusätzlichen Platz für die Anzeige des „Download“-Labels bei Hover zu schaffen - Deklarieren einer 1:1
scale()im Hover-Zustand der Schaltfläche, damit alle Inhalte beim Bewegen von Dingen enthalten bleiben. - Festlegen einer
transitionfür denpaddingder Schaltfläche, diebackground-positiondes Schaltflächen-Icons und dietransform-Eigenschaft, um eine reibungslose Animation zwischen dem Standard- und dem Hover-Zustand der Schaltfläche zu ermöglichen.
Hier ist, wie das ohne alle Präsentationsstile aussieht
Siehe den Pen
Style-less Netlify Sliding Buttons von Geoff Graham (@geoffgraham)
auf CodePen.
Wenn Sie Schwierigkeiten haben, sich vorzustellen, was passiert, hier ist eine Illustration, die zeigt, wie das „Download“-Label außerhalb der Schaltfläche verborgen ist (dank overflow: hidden) und wo es beim Hover in Sichtweite geschoben wird.

Indem wir negative left-Werte für das Icon und das „Download“-Label vergeben, schieben wir sie aus dem Sichtfeld und setzen diese dann auf positive Werte zurück, wenn die gesamte Schaltfläche gehovert wird.
/* Natural State */
.button {
background:
#f6bc00
url(data:image/svg+xml;base64,...)
no-repeat -12px center;
overflow: hidden;
}
.button span:nth-child(1) {
position: absolute;
left: -70px;
}
/* Hovered State */
.button:hover {
padding-left: 95px;
background-position: 5px center;
}
.button span:nth-child(1) {
position: absolute;
left: -70px;
}
Beachten Sie, dass das Belassen der Dinge in diesem Zustand das Schaltflächen-Icon in Sicht bringen würde und genug Platz für das „Download“-Label schaffen würde, aber das Label würde beim Hover tatsächlich von der Schaltfläche schweben.
Siehe den Pen
Style-less Netlify Sliding Buttons von Geoff Graham (@geoffgraham)
auf CodePen.
Hier hilft die Anwendung einer 1:1-Skalierung auf die Schaltfläche, die Dinge intakt zu halten.
* Hovered State */
.button:hover {
padding-left: 95px;
background-position: 5px center;
transform: scale(1, 1);
}
Diese Padding-Werte sind magische Zahlen. Sie werden bei Ihnen aufgrund der Schriftart, der Schriftgröße und anderer Faktoren unterschiedlich sein, daher kann Ihre Erfahrung variieren.
Die letzte Kernzutat ist die transition-Eigenschaft, die dafür sorgt, dass sich alles reibungslos an seinen Platz verschiebt, anstatt sich zu verstecken. Das sorgt für ein viel angenehmeres Erlebnis.
/* Natural State */
.button {
background:
#f6bc00
url(data:image/svg+xml;base64,...)
no-repeat -12px center;
overflow: hidden;
transition: padding .2s ease, background-position .2s ease, transform .5s ease;
}
Fügen Sie ein paar kleine Verzierungen hinzu, wie abgerundete Ecken und so, und Sie haben eine ziemlich schicke Schaltfläche.
Siehe den Pen
Netlify Sliding Buttons von Geoff Graham (@geoffgraham)
auf CodePen.
Ich wusste nicht, dass transform: scale die gleiche Wirkung hat wie position: relative. Danke!
Überraschenderweise stimmt das.
Es fühlt sich jedoch etwas hackelig an, besonders wenn man skalieren möchte, aber nicht möchte, dass es die Positionierung beeinträchtigt.
Ich frage mich, warum transform benötigt wurde und warum nicht position:relative verwendet wurde, was leichter zu verstehen ist und das Gleiche tut.
Ich habe die Auswirkung von transform: scale zunächst nicht verstanden, danke, dass Sie darauf hingewiesen haben :)
Übrigens, gibt es Ihrer Meinung nach einen bestimmten Grund für die Einstellung der Transition (transform .5s ease)?
Ich versuche immer noch zu verstehen, was
scalehier tut. Danke, dass Sie das aufgeschrieben haben!Ich auch!
Scale sorgt dafür, dass es sich reibungslos ausdehnt, glaube ich.
Nach meinem Verständnis verwendet der Autor
transform: scale(1, 1);, um einen containing block zu erstellenfür das absolut positionierte
span:nth-child(1), das das Wort **Download** ist.Dies kann durch Festlegen von
position: relative;auf dem Elternelement erreicht werden, das in diesem Fall<a class="button">istIch mag diese Interaktion insgesamt nicht. Bin ich der Einzige oder ist sie wirklich desorientierend?
Wirklich schöne Interaktion. Ich denke, Sie könnten ein paar Zeichen sparen, indem Sie
easebei der Transition weglassen (daeasedie Standard-Timing-Funktion ist).Ich denke, es ist möglich, dies mit weniger magischen Zahlen zu erreichen, indem die (max-)Breite der Elemente animiert wird, die ein- und ausblenden. Um dies auszuprobieren, habe ich Ihren Codepen hier geforkt: https://codepen.io/jperals/pen/jONZxWQ?editors=1100
Was ich getan habe, war, den „Download“-Text und das Icon in einem Element zu gruppieren und die (max-)Breite dieses Elements zu animieren. Ein Problem, das ich hatte, war, dass es nicht möglich ist, die Breite von 0 auf „auto“ zu animieren, was in diesem anderen schönen CSS Tricks-Artikel gut erklärt wird: https://css-tricks.de/using-css-transitions-auto-dimensions. Aber Sie können stattdessen die maximale Breite animieren. Wie der Artikel erklärt, hat dieser Ansatz den kleinen Nachteil, dass Sie immer noch einige magische Zahlen als maximale Breite hart kodieren müssen, und er funktioniert nur, solange der Inhalt nicht größer ist, und die Übergangsdauer basiert auf diesem Maximalwert. Aber ich würde sagen, es ist ein flexiblerer Ansatz, da er Ihnen Inhalte variabler Größe ermöglicht (beachten Sie, wie der Button rechts längeren Text hat). Und wir animieren auch weniger Dinge (eigentlich nur eins). Was denkst du?
Danke für den Artikel, er hat mich ein paar Dinge lernen lassen und ein bisschen gehackt :)
Cooler Artikel. Ich habe etwas Ähnliches mit den Schaltflächen in einer Symbolleiste für einen In-Browser-Layout-Editor gemacht. Letztes Jahr musste ich eine benutzerdefinierte Landingpage für eine Dacor-Geräteaktion bei der Arbeit erstellen. Ich konnte ihren coolen JS-Schaltflächeneffekt mit nur CSS, Pseudo-Elementen und einem benutzerdefinierten HTML-data-Attribut nachbilden. Dacor hat den Schaltflächeneffekt nicht mehr auf ihrer Website, aber der folgende CodePen zeigt, wie ich ihn zum Laufen gebracht habe.