Tilbakestille Touch Ripple Effect som sett på Google Design

Hva du skal skape

Googles nye designinnsats er stor og rettferdiggjør en betydelig samtale. Men i stedet for å snakke om teorien om materialdesign og konsekvensene av Googles nyeste innsats, skal vi fokusere på en interessant teknikk som Google har ansatt på deres design destinasjonsside. 

Når brukeren klikker på en av blokkene, utvides en SVG-sirkel fra punktet til brukerens klikk for å fylle det meste av boksen. Google henviser til dette som berøringsrippelen. Vi skal gjenskape denne effekten ved å bruke noen få linjer med jQuery, noen enkle HTML og CSS.

La oss komme i gang!

Grunnleggende grid

Før vi starter, må vi sette opp et grunnrutenett. Vi skal bygge gridelementene uten å bruke rammeverk, men denne teknikken vil fungere med et rammeverk helt greit.

Kolonnen klasser kartet til brøker, slik at "col-1-3" betyr 1/3 bredden av det inneholdende elementet.

Grunnleggende CSS

Deretter skal vi sette opp våre kolonneklasser. Vi bruker MINDRE, noe som gjør at vi kan neste regler og bruke &operatør. Vi kommer ikke inn i detaljene til MINDRE, men for denne tutorials skyld, forklarer vi hvordan & operatør arbeider. Men først, her er det mindre for kolonnene.

.col posisjon: relativ; skjerm: blokk; flyte: venstre; margin: 1,25%; bakgrunnsfarge: # 444; farge: #fff; polstring: 100px; boks-størrelse: border-box; & .orange bakgrunnsfarge: # EF8130;  & .blå bakgrunnsfarge: # 00ADE2;  & .gray bakgrunnsfarge: # 444;  & .green bakgrunnsfarge: # 76CE51;  & -1- & 2 bredde: 47,5%;  Og 3 bredde: 30.8333%;  Og 4 bredde: 22,5%; 

Legg merke til & regler. De & operatør legger til strengen som følger den med det overordnede elementet. Med andre ord, dette mindre:

.kol & -1 & -3 farge: #fff; 

Ville resultere i dette CSS:

.col-1-3 farge: #fff; 

Og dette mindre:

& .col & .orange bakgrunnsfarge: # EF8130; 

Ville resultere i dette CSS:

.col.orange bakgrunnsfarge: # EF8130; 

Hvis du vil lære mer om MINDRE, ta en titt på disse veiledningene her på Tuts +:

Hvordan SVG vil fungere

Deretter skal vi planlegge hvordan klikket vil fungere, og hvordan SVG vil bli plassert i hver av boksene.

Når brukeren klikker på en av boksene, beregner vi forskyvningen av museposisjonen fra hjørnet av boksen. Vi bruker da disse koordinatene til å plassere sirkelen. Vi vil også posisjonere SVG-elementet helt inn i boksene, og boksene selv vil bli plassert i forhold. Vi bruker SVGs innfødte  element, sammen med en tilpasset jQuery animasjonsfunksjon.

Først, la oss sette opp CSS for SVG-elementene.

svg posisjon: absolutt; topp: 0; venstre: 0; bredde: 100%; høyde: 100%;  sirkel fyll: rgba (255,255,255,0,1); 

Fyllingen benytter RGBa, som faktisk fyller sirkelelementet med hvitt ved 10%.

JavaScript

Først vil vi sette opp en klikklytter på .col elementer, og ta musens posisjon i forhold til dokumentet (dette ignorerer rulleposisjonen). 

Musposisjon

Stillingen er i forhold til selve esken; Det øverste venstre hjørnet av boksen hentes med $ (Denne) .offset ().

$ (". col") på ("klikk", funksjon (e) var x = e.pageX; var y = e.pageY; var clickY = y - $ (dette) .offset (). clickX = x - $ (this) .offset (). left; var box = this; // ...);

Merk: Vi bruker jQuery for dette eksempelet.

Deretter skal vi konvertere clickX og Clicky variabler til heltall, da de vises som flyter i noen nettlesere. Dette sørger for at vi unngår eventuelle gjengivelsesproblemer som skyldes subpixelaliasering. Vær imidlertid oppmerksom på at dette ikke nødvendigvis vil være nødvendig for effekten av arbeidet.

 var setX = parseInt (clickX); var setY = parseInt (clickY);

Fjern eksisterende SVG-elementer

Deretter fjerner vi eksisterende SVG-elementer fra vår klikkte boks. Hvis du planlegger å legge til en SVG i innholdet i boksen, vær sikker på at du bruker noe som jQuery's.ikke() i kombinasjon med en klasse for å unngå å fjerne innholdet ditt.

 . $ (Dette) .Finn ( "svg") fjern ();

Legg til ny SVG

Deretter legger vi til vårt SVG, som vi lager ved å sende tekst til jQuery-funksjonen.

$ (Denne) .append ('');

De setX og Sety plasser senterets sirkel på det punktet vi klikket på tidligere.

Animer sirkelradius

Deretter animerer vi r eiendom (som setter radius) ved hjelp av jQuery's animere funksjon. Animasjonsfunksjonen støtter ikke animerende egenskaper, så vi bruker skritt alternativ, som kalles etter hvert trinn av selve animasjonen.

var c = $ (boks) .find ("sirkel"); c.animate ("r": $ (boks) .outerWidth (), easing: "easeOutQuad", varighet: 400, trinn: funksjon (val) c.attr ("r", val); );

Husk at eske er tidligere definert som boksen som ble klikket. Vi benytter også jquery.easing, som gjør det mulig for oss å definere "easeOutQuad" for å lette eiendommen.

JavaScript, alle sammen

Den endelige JavaScript vil se slik ut:

$ (". col") på ("klikk", funksjon (e) var x = e.pageX; var y = e.pageY; var clickY = y - $ (dette) .offset (). clickX = x - $ (dette) .offset (). venstre; var boks = dette; var setX = parseInt (clickX); var setY = parseInt (klikkY); $ (dette) .find ("svg"). ); $ (dette) .append (''); var c = $ (boks) .find ("sirkel"); c.animate ("r": $ (boks) .outerWidth (), easing: "easeOutQuad", varighet: 400, trinn: funksjon (val) c.attr ("r", val); ); );

Konklusjon

Denne enkle effekten kan brukes på en rekke måter utover vårt eksempel. Tenk deg for eksempel å identifisere hvor i et bilde en person klikket, og lage en popover for å kommentere den delen av bildet, og deretter lagre koordinatene. Hvilke bruksområder kan du finne for denne effekten?

I villmarken

  • Polymerpapirelementer Papir-rippel - ved hjelp av webkomponenter for den virkelige avtalen
  • Ripples Effect Button - på CodePen
  • Google Material Design - på CodePen
  • Materiale Design Knapper - på CodePen