Wie man den Welligkeitseffekt von Materialdesign -Tasten nachbildert
Apr 02, 2025 am 03:34 AMAls ich das Material Design zum ersten Mal traf, war ich beeindruckt vom Designkonzept seiner Knopfkomponenten. Es verwendet geschickt den Ripple -Effekt, um den Benutzern auf einfache und elegante Weise Feedback zu geben.
Wie wird dieser Effekt erzielt? Die Schaltfl?chen des Materialdesigns sind nicht nur einfache Wellenanimationen, sondern die Position der Animation variiert auch je nach Position des Klickens der Schaltfl?che.
Wir k?nnen den gleichen Effekt durch Code erzielen. Zuerst werden wir ES6 JavaScript verwenden, um eine saubere L?sung bereitzustellen und dann einige Alternativen zu erkunden.
HTML -Struktur
Unser Ziel ist es, unn?tige HTML -Tags zu vermeiden, sodass wir den kleinsten Code verwenden:
<button>Erfahren Sie mehr</button>
Knopfstil
Mit JavaScript müssen wir einige Stile des Ripples -Elements dynamisch festlegen, aber alle anderen Stile k?nnen in CSS durchgeführt werden. Für unseren Knopf müssen nur zwei Eigenschaften einbezogen werden.
Taste { Position: Relativ; überlauf: versteckt; }
Verwenden von position: relative
erm?glicht es uns, position: absolute
für Wellenelemente, was für uns erforderlich ist, um seine Position zu steuern. In der Zwischenzeit verhindern overflow: hidden
verhindert, dass Wellen die Kante des Knopfes überschreiten. Alle anderen Eigenschaften sind optional. Aber jetzt sehen unsere Kn?pfe ein wenig veraltet aus. Hier ist ein modernerer Ausgangspunkt:
/* Roboto ist die Standardschrift für Material*/ @import url ('https://fonts.googleapis.com/css2?family=roboto&display=swap'); Taste { Position: Relativ; überlauf: versteckt; übergang: Hintergrund 400 ms; Farbe: #ffff; Hintergrundfarbe: #6200ee; Polsterung: 1Rem 2Rem; Schriftfamilie: 'Roboto', sans-serif; Schriftgr??e: 1,5Rem; Umriss: 0; Grenze: 0; Grenzradius: 0,25Rem; Box-Shadow: 0 0 0,5Rem RGBA (0, 0, 0, 0,3); Cursor: Zeiger; }
Wellenstil
Sp?ter werden wir JavaScript verwenden, um Wellen als .ripple
zu verwenden<span></span>
Elemente werden in unsere HTML injiziert. Bevor wir jedoch zu JavaScript wechseln, definieren wir den Stil dieser Wellen in CSS, damit wir jederzeit verwenden k?nnen:
span.ripple { Position: absolut; /* Wir haben oben die absolute Positionierung erw?hnt*// Grenzradius: 50%; Transformation: Skala (0); Animation: Ripple 600 ms linear; Hintergrundfarbe: RGBA (255, 255, 255, 0,7); }
Um unsere Wellen rund zu machen, setzen wir border-radius
auf 50%. Um sicherzustellen, dass alle Wellen von Grund auf neu erscheinen, setzen wir die Standardskala auf 0. Jetzt k?nnen wir noch nichts sehen, da wir Werte für die Eigenschaften top
, left
, width
oder height
nicht festlegen. Wir werden diese Eigenschaften bald mit JavaScript injizieren.
Was unsere CSS betrifft, ist das Letzte, was wir hinzufügen müssen, der Endzustand der Animation:
@keyframes ripple { Zu { Transformation: Skala (4); Deckkraft: 0; } }
Bitte beachten Sie, dass wir from
Schlüsselwort nicht verwenden, um den Startzustand in keyframes
zu definieren. Wir k?nnen from
und CSS den fehlenden Wert basierend auf dem auf das Animationselement angewendeten Wert erstellen. Dies geschieht, wenn die relevanten Werte explizit deklariert werden (z. B. transform: scale(0)
) oder Standardwerte (z. B. opacity: 1
).
JavaScript -Implementierung
Schlie?lich brauchen wir JavaScript, um die Position und Gr??e der Wellen dynamisch festzulegen. Die Gr??e sollte auf der Gr??e der Taste basieren, und die Position sollte auf der Position der Taste und des Cursors basieren.
Wir beginnen mit einer leeren Funktion, die das Klickereignis als Argument nimmt:
Funktion CreateRipple (Event) { // }
Wir werden auf unsere Schaltfl?che zugreifen, indem wir nach currentTarget
des Ereignisses suchen.
const button = event.currentTarget;
Als n?chstes werden wir unsere instanziieren<span></span>
Elemente und berechnen Sie seinen Durchmesser und seinen Radius basierend auf der Breite und H?he des Knopfes.
const Circle = document.createelement ("span"); const diameter = math.max (button.clientwidth, button.clientHeight); const radius = Durchmesser / 2;
Wir k?nnen nun die verbleibenden Eigenschaften definieren, die von den Wellen ben?tigt werden: left
, top
, width
und height
.
Circle.Style.Width = Circle.Style.Height = `$ {Durchmesser} px`; Circle.Style.Left = `$ {event.clientX - (button.offsetleft radius)} px`; Circle.Style.top = `$ {event.clienty - (button.offsettop radius)} px`; Circle.ClassList.Add ("Ripple");
In<span></span>
Bevor Sie dem DOM ein Element hinzufügen, überprüfen Sie am besten, ob verbleibende Wellen vorhanden sind, die m?glicherweise aus dem vorherigen Klick stammen, und l?schen Sie sie, bevor Sie die n?chsten Wellen ausführen.
const ripple = button.getElements byclassName ("ripple") [0]; if (ripple) { ripple.remove (); }
Im letzten Schritt werden wir<span></span>
Fügen Sie das Schaltfl?chenelement als untergeordnetes Element so an, dass es in die Innere der Taste injiziert wird.
Button.AppendChild (Kreis);
Nachdem unsere Funktion beendet ist, bleibt alles, was bleibt, es zu nennen. Dies kann auf verschiedene Arten erfolgen. Wenn wir jeder Schaltfl?che auf der Seite Wellen hinzufügen m?chten, k?nnen wir einen solchen Code verwenden:
const buttons = document.getElementsByTagName ("button"); für (const Taste der Schaltfl?chen) { Button.AdDeVentListener ("Click", Createripple); }
Jetzt haben wir den Welligkeitseffekt der Arbeit!
Erweiterte Funktionen
Was ist, wenn wir noch einen Schritt weiter gehen m?chten und diesen Effekt mit anderen ?nderungen der Knopfposition oder -gr??e kombinieren m?chten? Schlie?lich ist die Anpassung einer der Hauptvorteile der Entscheidung, die Auswirkungen selbst wiederherzustellen. Um die Erleichterung der Verl?ngerungsfunktion zu testen, habe ich beschlossen, einen "Magnet" -Effekt hinzuzufügen, der unsere Taste zum Cursor bewegt, wenn er sich in einem bestimmten Bereich befindet.
Wir müssen uns auf einige der gleichen Variablen verlassen, die in der Ripple -Funktion definiert sind. Um eine unn?tige Doppelarbeit von Code zu vermeiden, sollten wir sie irgendwo speichern, damit beide Methoden darauf zugreifen k?nnen. Wir sollten aber auch den Umfang gemeinsamer Variablen auf jeden einzelnen Taste einschr?nken. Eine M?glichkeit, dies zu erreichen, besteht darin, eine Klasse zu verwenden, wie im folgenden Beispiel gezeigt:
Da der Magnet -Effekt jedes Mal, wenn sich der Cursor bewegt, den Cursor verfolgt, müssen wir die Cursorposition nicht mehr berechnen, um Wellen zu erstellen. Stattdessen k?nnen wir uns auf cursorX
und cursorY
verlassen.
Zwei wichtige neue Variablen sind magneticPullX
und magneticPullY
. Sie steuern die Intensit?t unserer Magnetmethode, die den Knopf hinter dem Cursor zieht. Wenn wir also die Mitte der Wellen definieren, müssen wir die Position (x und y) und den Magnetismus der neuen Taste einstellen.
const offsetleft = this.left this.x * this.magneticpullx; const offsettop = this.top this.y * this.magneticpully;
Um diese Kombinationseffekte auf alle Schaltfl?chen anzuwenden, müssen wir für jede Taste eine neue Klasseninstanz instanziieren:
const buttons = document.getElementsByTagName ("button"); für (const Taste der Schaltfl?chen) { neue Schaltfl?che (Schaltfl?che); }
Andere Technologien
Dies ist natürlich nur eine M?glichkeit, den Welligkeitseffekt zu erzielen. Auf CodePen gibt es viele Beispiele, die unterschiedliche Implementierungen zeigen. Hier sind einige meiner Lieblingsbeispiele.
Reine CSS -Implementierung
Wenn der Benutzer JavaScript deaktiviert, hat unser Ripple -Effekt keine Sicherungsl?sung. Nur mit CSS mit der :active
Pseudo-Klasse, um auf Klicks zu reagieren, k?nnen Sie sich dem ursprünglichen Effekt n?hern. Die Hauptbeschr?nkung besteht darin, dass Wellen nur aus einem Punkt - normalerweise der Mitte der Schaltfl?che - und nicht als Antwort auf unsere Klickposition erscheinen k?nnen. Dieses Beispiel von Ben Szabo ist besonders pr?gnant:
JavaScript vor ES6
Die Demo von Leandro Parice ?hnelt unserer Implementierung, ist jedoch mit früheren Versionen von JavaScript kompatibel:
JQuery
In diesem Beispiel wird JQuery verwendet, um einen Ripple -Effekt zu erzielen. Wenn Sie JQuery bereits als Abh?ngigkeit haben, k?nnen Sie einige Codezeilen speichern.
Reagieren
Schlie?lich gibt es ein weiteres Beispiel von mir. W?hrend Reacts Merkmale wie Zustand und Schiedsrichter verwendet werden k?nnen, um Ripple -Effekte zu erzielen, ist dies nicht unbedingt erforderlich. Die Position und Gr??e der Wellen muss für jeden Klick berechnet werden, sodass es keinen Vorteil hat, diese Informationen im Zustand zu halten. Darüber hinaus k?nnen wir über das Klickereignis auf das Schaltfl?chenelement zugreifen, sodass wir auch keine Schiedsrichter ben?tigen.
In diesem React -Beispiel wird dieselbe createRipple
-Funktion verwendet wie die erste Implementierung in diesem Artikel. Der Hauptunterschied besteht darin, dass unsere Funktion als Methode der Button
zu dieser Komponente skopiert wird. Darüber hinaus ist der onClick
Event -Listener jetzt Teil unseres JSX:
Diese Antwort beh?lt die ursprüngliche Bildformatierung bei und vermeidet es, die Kernbedeutung des Textes zu ver?ndern und gleichzeitig Phrasen und S?tze für einen natürlicheren Fluss und eine verbesserte Lesbarkeit zu belohnen. Es verwendet auch den beschreibenden Alt -Text für die Bilder.
Das obige ist der detaillierte Inhalt vonWie man den Welligkeitseffekt von Materialdesign -Tasten nachbildert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen





AutoPrefixer ist ein Tool, das die Pr?fixe von Anbietern automatisch zu CSS -Attributen basierend auf dem Zielbrowserbereich hinzufügt. 1. Es l?st das Problem, die Pr?fixe mit Fehlern manuell aufrechtzuerhalten. 2. Arbeiten Sie das POSTCSS-Plug-in-Formular durch, analysieren Sie CSS, analysieren Sie Attribute, die vorangestellt werden müssen, und generieren Sie den Code gem?? Konfiguration. 3.. 4. Notizen enthalten nicht manuelles Hinzufügen von Pr?fixen, Konfigurationsaktualisierungen, Pr?fixe nicht alle Attribute, und es wird empfohlen, sie mit dem Pr?prozessor zu verwenden.

TocreatestickyHeadersandfooterswithcss, Anwendungseinstellung: Stickyforheaderswithtopvalueandz-Index, sicherstellen, dass ParentContainersdon'Trictit.1.ForstickyHaaders: Einstellungen: Kleber, Top: 0, Z-Index und BackgroundColor.2.

Mobile-firstcsSdeSignRequiressettingTheviewPortMetatag, Verwenden von Relativen, StylingFromsMallScreensUp, Optimierungstypographie und touchtargets.First, addtocontrolscaling.second, verwenden Sie%, EM, orreminsteadofpixelforflexiblelayouts.thirds, thishirds

Um ein intrinsisches reaktionsschnelles Gitterlayout zu erstellen, besteht die Kernmethode darin, den Wiederholungsmodus von CSSGrid (automatisch, minmax ()) zu verwenden. 1. Setzen Sie Grid-Template-S?ulen: Wiederholen (automatisch, Minmax (200px, 1FR)), um den Browser automatisch die Anzahl der Spalten anzupassen und die minimalen und maximalen Breiten jeder Spalte zu begrenzen. 2. Verwenden Sie die Lücke, um den Rasterabstand zu steuern. 3. Der Container sollte auf relative Einheiten wie Breite eingestellt werden: 100%und verwenden Sie Box-Gr??en: Border-Box, um die Berechnungsfehler der Breite zu vermeiden und sie mit Rand: Auto zu zentrieren; 4. Setzen Sie optional die Zeilenh?he und die Ausrichtung des Inhalts, um die visuelle Konsistenz wie die Zeile zu verbessern

Es gibt drei M?glichkeiten, einen CSS -Laderotator zu erstellen: 1. Verwenden Sie den Basisrotator der Grenzen, um eine einfache Animation durch HTML und CSS zu erreichen. 2. Verwenden Sie einen benutzerdefinierten Rotator mit mehreren Punkten, um den Sprungeffekt durch verschiedene Verz?gerungszeiten zu erreichen. 3. Fügen Sie einen Rotator in die Taste hinzu und wechseln Sie den Klassen über JavaScript, um den Ladestatus anzuzeigen. Jeder Ansatz betont die Bedeutung von Entwurfsdetails wie Farbe, Gr??e, Zug?nglichkeit und Leistungsoptimierung, um die Benutzererfahrung zu verbessern.

Um das gesamte Netzlayout im Ansichtsfenster zentriert zu machen, kann es mit den folgenden Methoden erreicht werden: 1. Rand: 0Auto, um horizontales Zentrieren zu erreichen, und der Container muss so eingestellt werden, dass die feste Breite festgelegt wird, die für festes Layout geeignet ist. 2. Verwenden Sie Flexbox, um die Eigenschaften der Rechtfertigung und Ausrichtung der Eigenschaften des Au?enbeh?lters einzustellen, und kombinieren Sie Min-H?he: 100 VH, um vertikale und horizontale Zentrierung zu erzielen, was für Szenarien mit Vollbild-Displays geeignet ist. 3. Verwenden Sie CSSGrid's Place-Items-Eigenschaft, um sich schnell auf den übergeordneten Container zu konzentrieren, der einfach ist und eine gute Unterstützung von modernen Browsern hat. Gleichzeitig ist es erforderlich, sicherzustellen, dass der Elternbeh?lter eine ausreichende H?he hat. Jede Methode hat anwendbare Szenarien und Einschr?nkungen. W?hlen Sie einfach die entsprechende L?sung gem?? den tats?chlichen Bedürfnissen aus.

FeaturedEtctionIncsusinus@SupportSchecksifabrowsersupportSaspecificfeatureboreAppying-relatedStyles.1.ituSconditionalcsblocksbasedonProperty-ValuePairs, solchas@Supports (Display: Grid)

Um mit CSS -Browser -Kompatibilit?t und Pr?fixproblemen umzugehen, müssen Sie die Unterschiede im Browser -Support verstehen und Anbieterpr?fixe vernünftigerweise verwenden. 1. Verstehen Sie gemeinsame Probleme wie Flexbox und Grid -Unterstützung, Position: Sticky Invaly und Animationsleistung ist unterschiedlich. 2. überprüfen Sie den Best?tigungsunterstützungsstatus von Caniuse. 3. Verwenden Sie korrekt -webkit-, -moz-, -ms-, -o- und andere Herstellerpr?fixe; 4. Es wird empfohlen, Autoprefixer zu verwenden, um automatisch Pr?fixe hinzuzufügen. 5. Postcss installieren und Browserlist konfigurieren, um den Zielbrowser anzugeben. 6. automatisch die Kompatibilit?t w?hrend des Baus bew?ltigen; 7. Modernizr -Erkennungsmerkmale k?nnen für alte Projekte verwendet werden; 8. Keine Notwendigkeit, die Konsistenz aller Browser zu verfolgen,
