Slik animerer du en kaffedrikk med ScrollMagic

Å skape rulleinitierte bevegelser kan være utrolig gledelig. Vi vil dykke inn i en bestemt effekt som ses på Casper Madrass-nettsiden (opprettet av Jonnie Hallman) som imponerte mange utviklere. I denne opplæringen vil vi bryte ned trinnene som trengs for å lage en lignende sprite-animasjon med ScrollMagic.

Sluttresultat

La oss ta en titt på hva vi skal skape:

Sprite

Før vi begynner koding, trenger vi en sprite å bruke som grunnlag for denne demoen. Her er den vi skal bruke: Jeg nyter en nydelig kopp kaffe. Du kan ta en kopi for å følge opplæringen.

mmmmm

Hele sprite er arrangert i lineær mote langs x-aksen. Hvert bilde i sprite er 200px x 509px som resulterer i en total størrelse på 2000px x 509px (hvert enkelt bilde er 200px bredt multiplisert med ti keyframes). 

Ekstra poeng allerede

For det ekstremt nysgjerrige benyttet jeg spesielt Gulp-plugin gulp.spritesmith i stedet for å kutte sammen spritet manuelt. Selv om det ikke er nødvendig å lage denne demoen, er det oppsettet jeg brukte hvis du vil prøve det selv:

var gulp = krever ('gulp'); var spritesmith = krever ('gulp.spritesmith'); gulp.task ('sprite', funksjon () var spriteData = gulp.src ('images / * .png'). pipe (spritesmith (imgName: 'sprite.png', cssName: 'sprite.css', algoritmOpts : sort: false, algoritme: 'venstre-høyre',)), returner spriteData.pipe (gulp.dest ('images / dist')););

Det er viktig å merke at algoritmen egenskapen kan akseptere et utvalg av verdier for å ordne sprite som lineær, vertikal, diagonal og mer. Jeg anbefaler at du tar deg tid til å lese mer om dette Gulp-pluginet for noen av dine fremtidige behov.

Opprette markeringen

Markeringen er jorda hvorfra vår demo skal vokse, så vi begynner med å lage beholderen der sprite animasjonen vil finne sted. Vi skal også bygge noen dummy-beholdere for å få regioner til å bla gjennom.

Den midterste delen med den inneholdende div er hvor vår spritbevegelse brenner, men vi må legge til noen klasser og ids for styling og arrangementskrok formål.

Klassen js-scrollpin er det punktet som visningsporten vil bli "pinnet" etter som brukeren ruller. Dette stikkpunktet varer i en definert varighet satt fra våre JavaScript (vi vil adressere dette i en kommende seksjon). Det indre div med klassen ramme vil være punktet der rullende magien finner sted.

Opprette stilene

Vår demo ville ikke være komplett uten styling, så la oss komme i gang! For å skrive koden med oppdateringer og forbedringer i tankene bruker vi Sass, slik at vi kan lage loop og variabler for kortfattet forfattering.

$ frame-count: 9; $ offset-val: 100;

Disse variablene definerer: 

  • rammen teller, lik antall bilder i sprite 
  • og offsetverdien som plasserer bakgrunnsposisjonen til hvert enkelt bilde i sprite. 

Du kan legge merke til at jeg bare har satt rammen til 9 på grunn av at den første rammen allerede er i oversikt, og etterlater 9 rammer igjen i sekvensen (10 - 1 = 9).

Jeg har vært innrammet

Som nevnt, er hvert bilde i vår sprite 200px bredt, så jeg vil definere bredden på rammen som 200px. 

.ramme bredde: 200px; bakgrunnsbilde: url (sprite.png); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: 0 50%; 

Bildet er lastet som bakgrunn og plassert tilsvarende.

Nå for løkken:

@for $ i fra 1 til $ ramme-count .frame # $ i bakgrunnsstilling: - (($ i * $ offset-val) * 2) + px 50%; 

Denne Sass-løkken er den viktigste delen. Når vi ruller, blir hver korrelerende klasse skiftet via JavaScript; disse veksle klassenavnene korrelerer til plasseringen av hvert bilde i sprite.

.ramme1 bakgrunnsposisjon: -200px 50%;  .frame2 bakgrunnsstilling: -400px 50%;  .frame3 bakgrunnsstilling: -600px 50%;  .frame4 bakgrunnsposisjon: -800px 50%;  .frame5 bakgrunnsstilling: -1000px 50%;  .frame6 bakgrunnsstilling: -1200px 50%;  .frame7 bakgrunnsposisjon: -1400px 50%;  .frame8 bakgrunnsstilling: -1600px 50%;  .frame9 bakgrunnsstilling: -1800px 50%; 

Den kompilerte produksjonen fra vår Sass bidrar til å forklare hvordan denne matematikken fungerer, men la oss dykke dypere for å sikre at vi forstår fullt ut hvordan regningen beregnes.

$ i * $ offset-val

På hver iterasjon av løkken på $ i variabel sykluser fra 1 til 9 og multiplisert med forskyvningsverdien (100). Til slutt tar vi hele resultatet og multipliserer med en faktor 2. Faktoren på 2 vil bidra til å flytte bakgrunnsposisjonen i forhold til hvor hvert bilde ligger i sprite. Den samsvarer også med offsetverdien som er definert i JavaScript som vi skal diskutere i neste del av reisen.

Casting JavaScript

Nøkkelen til denne hele effekten er JavaScript. For denne spesielle demoen bruker vi ScrollMagic; et JavaScript-bibliotek for magiske rulleinteraksjoner. Før du skriver en ScrollMagic-kode, må vi sørge for at vi har biblioteket ScrollMagic lastet inn.

Med det gjort, etablerer vi noen variabler.

var ramme = document.querySelector ('. frame'), frame_count = 9, offset = 100;

De definerte variablene skal se ganske kjent ut som de direkte relaterer seg til verdiene vi angav i vår Sass, med unntak av å velge rammeklassen ved å bruke document.querySelector.

var controller = ny ScrollMagic.Controller (globalSceneOptions: triggerHook: 0);

Kontrolleren er hovedklassen kreves en gang per rullebeholder. Våre globalSceneOptions objekt bestått inneholder a triggerHook. Denne egenskapens verdier kan være et tall mellom 0 og 1 som definerer posisjonen til utløserkroken i forhold til visningsporten.

ny ScrollMagic.Scene (triggerHook: 0, triggerElement: '.js-scrollpin', varighet: (frame_count * offset) + 'px', revers: true) .setPin ('. js-scrollpin') .addTo );

Vi definerer tappen en gang i målscenen og legger til animasjonen vår i samme scene. Vi lager en scene for hver klasse og bytter dem på eller av avhengig av forskyvningsverdien for rullen. 

Bryte det ned

Det er noen ting som går igjen for å forklare, så la oss slå ned de viktige delene:

triggerElement: '.js-scrollpin'

Utløsningselementet er referanseplanen til panelet som inneholder vår sprite.

.setPin (.' js-scrollpin')

De setPin Metoden vil fortelle ScrollMagic til, når triggerElement er nådd, pin det panelet til toppen av visningsporten.

varighet: (frame_count * offset) + 'px',

Varigheten vil bidra til å kontrollere hvor lenge bevegelsen skjer, basert på rammenummer og offset. Som du vil huske, hadde vi et rammevalg på 9 og en kompensasjon på 100. Disse verdiene når de blir multiplisert sammen, tilsvarer 900px; den totale verdien av utløser offset poeng.

for (var i = 1, l = frame_count; jeg <= l; i++)  new ScrollMagic.Scene( triggerElement: '.js-scrollpin', offset: i * offset ) .setClassToggle(frame, 'frame' + i) .addTo(controller); 

Siden det er 9 rammer, slår vi gjennom det antall iterasjoner mens du definerer det samme panelet for en triggerElement. Ved hver iterasjon av sløyfen multipliserer vi den kretsens verdi med kompensasjonsbeløpet (1 * 100, 2 * 100, 3 * 100 ...). Vi definerer også en klasse for å bytte gjennom; .frame1, .Frame2, .frame3 og så videre. Hver av klassene representerer bakgrunnsposisjonen til hvert bilde i sprite.

Og vi er ferdige!

Konklusjon

Du lurer kanskje på hva den totale filstørrelsen til sprite er, så la meg legge ned noen tall. Uncompressed bildet veide inn i en heftig 1,5 MB, men når komprimert resulterte i en mer akseptabel 319 KB. Dette inkluderer ikke 6KB gzipped for å laste inn ScrollMagic-biblioteket. 

Jeg håper du er inspirert av denne teknikken til å bruke i ditt neste prosjekt, og vær så velkommen til å stille spørsmål i kommentarene nedenfor, som alltid. Glad koding!