Slik kodes du en rullende Alien Lander Nettsted

I denne opplæringen, den andre i en todelerserie, tar vi den fantastiske vektorbaserte illustrasjonen som er produsert i Yulia Sokolovas "Hvordan lage en langrullende bakgrunn for et nettsted" og kodes det opp i et levende nettsted.

Hva skal vi bygge

Vi setter ting sammen slik at når du ruller ned fra toppen av siden, ser du en "Alien Lander" som gjør veien til å røre seg ned. I begynnelsen vil vi se en UFO sveve i rommet.

Når vi ruller ned, vil UFO nå atmosfæren og bli en "fremmedkammer". 

Og så til slutt, når den passerer gjennom trelinjen, vil den bli til en "liten grønn mann" som gjør sin landing på bakken.

Ta en titt på live demo!

SVG-bilder

I dette prosjektet bruker vi SVG-bilder, slik at vi kan dra nytte av deres evne til å flytte seg vesentlig, og deres små filstørrelse.

Før vi begynner koding, trenger du bildet som ble opprettet i del 1 av denne opplæringsserien, delt i fire SVG-filer:

  1. UFO som en fil med navnet "ufo.svg"
  2. Den "fremmede kometen" som en fil som heter "alien_comet.svg"
  3. Den "lille grønne mannen" som en fil som heter "alien_landing.svg"
  4. Bakgrunnsbildet med de tre ovennevnte elementene ble fjernet, som en fil med navnet "background.svg"

Du kan eksportere disse SVG-bildene selv fra din foretrukne grafikkapp hvis du vil, eller alternativt finner du alle fire bildene klare til bruk i kildefilene på GitHub.

Oppsett Grunnleggende struktur

Opprett en ny mappe for prosjektet ditt og inne i det lage en undermappe kalt "css" og en annen kalt "bilder".

Kopier og lim inn dine fire SVG-bilder i den nye "bilder" -mappen.

I mappen "css" lagrer du en fil med navnet "style.css".

I hovedmappen opprett en ny fil med navnet "index.html".

Din mappestruktur skal nå se slik ut:

I filen "index.html" legger du til følgende grunnleggende HTML for å få essensielle og laste stilarket:

    Scrolling Alien Lander     

Legg til bakgrunnen

Det kan virke counterintuitivt, men vi skal faktisk legge til vårt bakgrunnsbilde ved hjelp av en img element i stedet for som et CSS bakgrunnsbilde. Vi gjør dette fordi:

  1. Vi ønsker å utnytte SVGs evne til å endre størrelse, fylle hele visningsporten med vårt "background.svg" -bilde, uansett hva dimensjonene til nettleservinduet er.
  2. For at rullingsteknikken skal virke, må vi vite høyden på bakgrunnsbildet.
  3. Fordi vi tillater at vårt bakgrunnsbilde er i størrelse, har vi ingen måte å vite hva høyden vil være på forhånd.
  4. Da vi ikke kan vite høyden på bakgrunnsbildet på forhånd, må vi oppdage det etter bildet etter at det er lastet inn.
  5. Hvis vi setter «background.svg» som et CSS-bakgrunnsbilde, vil høyden ikke påvirke nettstedoppsettet, noe som gjør at høyden er vanskelig å oppdage.
  6. Ved å sette "background.svg" som et vanlig bilde i stedet sin høyde vil påvirke sideoppsettet, slik at høyden er relativt enkelt å oppdage ved hjelp av jQuery.

Nå som du forstår hvorfor vi tar denne tilnærmingen, la oss starte kodingen!

I filen "index.html" legger du til denne koden:

Hvis du forhåndsviser filen i en nettleser, bør du se bildet fylle visningsporten. Imidlertid vil det fortsatt være litt hvitt mellomrom rundt kantene. 

Dette skyldes at nettlesere inkluderer en liten margin på kropp element som standard. For å overstyre dette legger du til denne CSS-filen i "style.css" -filen:

kropp margin: 0; 

Det er også en annen nettleser standard vi må overstyre, den av vise Egenskapen på bildene er satt til på linje. Hvis du ruller ned til bunnen av siden, ser du at det for øyeblikket er et lite hvitt mellomrom på bildet på grunn av denne standarden. Endre det ved å legge til:

img display: block; 

Du bør nå se "background.svg" -bildet fylle opp vinduet flush med kantene, og hvis du endrer størrelsen på vinduets bredde, ser du SVG-bildet rescale selv for å passe til den nye størrelsen. Høyden på nettstedoppsettet endres også for å opprettholde det riktige aspektforholdet for "background.svg" -bildet.

Legg til en forgrunnsbeholder

For å få bildet som vi nettopp har satt opp som et bakgrunnsbilde, trenger vi en måte å gjøre resten av innholdet sitt over toppen av det i forgrunnen. Vi kan oppnå dette ved å legge til en div element som vil fungere som en beholder, og deretter endre sitt stilling og z-indeks eiendommer.

I filen "index.html", etter bildet du nettopp har lagt til, sett inn denne nye diven:

 

Og i "style.css" legg til dette CSS:

.forgrunnen posisjon: absolutt; topp: 0; venstre: 0; høyde: 100%; bredde: 100%; z-indeks: 1; 

La oss løpe gjennom det vi gjør med koden ovenfor.

Først ved å sette inn stilling til absolutte vi tar elementet ut av den vanlige dokumentflyten, (som ellers ville legge den under bakgrunnsbildet), slik at vi kan plassere det hvor som helst vi velger.

Så satte vi topp og venstre egenskaper til 0 som skifter elementet opp til toppen av vinduet og justerer det horisontalt med vårt bakgrunnsbilde.

Etter det gir vi elementet a høyde og bredde av 100%. Dette sørger for at elementet ikke kollapser til ingenting, gjemmer noe innhold i det.

Til slutt satte vi z-indeks til 1 som bringer elementet videre slik at det sitter foran bakgrunnsbildet vårt (som er på standard z-indeks av auto). Dette forhindrer at innholdet i elementet blir skjult av bakgrunnsbildet.

Vår forgrunnsbeholder er nå klar til å ha innhold lagt til det.

Legg til UFO-panelet

Måten vi skal gjøre på UFO "land" på bakken, er å skape tre paneler, ett for hvert landingsstadium. Vi legger da til det tilsvarende SVG-bildet for hvert panel, for eksempel "ufo.svg" -filen som et bakgrunnsbilde med fast posisjon. Bildet vil da forbli på plass under rulle mens bakgrunnen beveger seg bak den, noe som skaper illusjonen av nedstigningen.

Inne i "forgrunnen" div, legg til dette nye div:

Legg nå følgende kode i CSS:

.ufo_section høyde: 100%; bakgrunn: url (... /images/ufo.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 40% auto; bakgrunnsbeslutning: fast; 

I den første linjen i vår kode ovenfor gir vi elementet a høyde av 100% for å sikre at innholdet blir synlig. Deretter legger vi til vårt "ufo.svg" bilde som bakgrunn. Vi setter inn background-repeat til no-repeat som vi bare vil ha en UFO å dukke opp, og vi lager da Bakgrunnen-stilling plasser bildet i midten både horisontalt og vertikalt.

Med vår background-size Egenskapen, vi setter bredden som en prosentbasert verdi og tillater at høyden automatisk beregnes. Denne bredden er trukket fra det originale vektorgravet hvor bredden på UFO er omtrent 40% bredden av den samlede illustrasjonen.

Ved å sette bredden på bildet "ufo.svg" i prosent, når vinduet blir endret og bildet "background.svg" endres med det, vil UFO-bildet også justere bredden for å beholde de tiltenkte proporsjonene.

På den endelige linjen satt vi Bakgrunnen-feste til fast, noe som betyr at bildet vil bli løst på plass mens vi ruller, og gir oss vår illusjon om nedstigningen.

Prøv å forfriske siden og rulle nå - du bør se UFO beveger seg vertikalt i mellom planeter.

Legg til Comet og Landing Panels

Når du ruller ned på nettstedet ditt, vil du legge merke til at UFO forsvinner når du går ned langt nok. Dette skjer fordi vi ruller forbi høyden på ufo_section panel så vi kan ikke lenger se bakgrunnen på det punktet. 

Vi skal stable tre paneler som dette på toppen av hverandre, slik at når vi ruller forbi en og dens bakgrunn forsvinner bakgrunnen til følgende panel vises, skaper effekten av ett bilde som erstattes av det neste.

Så vi gjentar nå prosessen vi brukte ovenfor for å sette inn bildene "alien_comet.svg" og "alien_landing.svg".

Til HTML-koden din, legg til følgende like etter din ufo_section div og fortsatt inne i forgrunnen din div:

Deretter legger du til disse nye klassene i CSS:

.comet_section høyde: 100%; bakgrunn: url (... /images/alien_comet.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 15% automatisk; bakgrunnsbeslutning: fast;  .landing_section høyde: 100%; bakgrunn: url (... /images/alien_landing.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 15% automatisk; bakgrunnsbeslutning: fast; stilling: relativ; 

Vi bruker alle de samme kodene og teknikkene her, med bare bildefilnavnene endret og bredden på background-size eiendom satt til 15% for å passe til de smalere bildene vi nettopp har lagt til.

Din fullførte CSS

Din "style.css" -fil er nå ferdig og bør inneholde følgende kode:

kropp margin: 0;  img display: block;  .forgrunnen posisjon: absolutt; topp: 0; venstre: 0; høyde: 100%; bredde: 100%; z-indeks: 1;  .ufo_section høyde: 100%; bakgrunn: url (... /images/ufo.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 40% auto; bakgrunnsbeslutning: fast;  .com_seksjon høyde: 100%; bakgrunn: url (... /images/alien_comet.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 15% automatisk; bakgrunnsbeslutning: fast;  .landing_section høyde: 100%; bakgrunn: url (... /images/alien_landing.svg); bakgrunn-gjentak: ikke-gjenta; bakgrunnsposisjon: senter; bakgrunnsstørrelse: 15% automatisk; bakgrunnsbeslutning: fast; stilling: relativ; 

Gå tilbake til nettstedet ditt nå, rul ned og du bør se UFO-turneringen i kometen, så litt lenger ned blir til "lille grønne mannen".

Legg til panelhøydeberegninger

Akkurat nå ser du at vi har et par problemer å løse når du ruller, og de er:

  1. De tre panelene er hver ikke høy nok. Dette gjør at det ser ut til at den fremmede landeren endrer seg fra en form til den andre for tidlig, slik at den aldri gjør det til bakken.
  2. Du kan se at bildet "alien_comet.svg" begynner å dukke opp før bildet "ufo.svg" er helt forsvunnet, noe som ser merkelig ut.

Fordi bildet vårt "background.svg" ikke har en fast størrelse, vet vi ikke hvilken eksakt pixelhøyde hvert panel burde være før du laster inn. Det vi kan bestemme oss på er imidlertid høyden hvert panel skal være i prosent av høyden på "background.svg".

Ved hjelp av jQuery kan vi implementere denne prosessen:

  1. Definer høyden vi ønsker at hvert panel skal være i prosent, (eller brøkdel) av "background.svg" bildeets høyde.
  2. Oppdag høyden på "background.svg" etter at den laster.
  3. Beregn og sett høydene til panelene basert på de to informasjonsstykkene ovenfor.

Mens vi er på det, legger vi også inn et par ekstra tomme divs for å fungere som mellomrom mellom hvert panel og sette høyde ved hjelp av jQuery også. Å legge mellomrom mellom panelene vil gi en jevnere overgang, og løse problemet med å se bildet "alien_comet.svg" før bildet "ufo.svg" er borte.

Oppdater HTML, så det er en spacer div mellom hver eksisterende div som:

Og i hodet delen, last inn i jQuery ved å legge til følgende:

Sett inn JavaScript-funksjonen

Før avslutningen tag, lag et par merker og sett inn en ny funksjon inne som slik:

Vi vil at denne funksjonen skal brenne når siden først lastes, og når den endres, for å oppnå dette legger du også til følgende kode etter åpningen manus stikkord:

$ (dokument) .ready (funksjon () set_section_heights ();); $ (vindu) .resize (funksjon () set_section_heights (););

Få høyde på bakgrunnsbildet

Inne i set_section_heights () funksjon, det første vi må gjøre er å finne ut hvor høyt vårt bakgrunnsbilde er, og lagre det som en variabel. For å gjøre dette legg til denne koden:

var doc_height = $ (". bakgrunn"). høyde ();

Med den første delen av koden, $ ( "Bakgrunn"), jQuery finner elementet med klassenavnet bakgrunn. Den vedlagte .høyde() funksjonen får det elementets pikselhøyde som et heltall. Dette forteller oss hvor høyt vårt "background.svg" -bilde er og lagrer det nummeret i variabelen doc_height.

Definer tilsatte seksjonshøyder

Nå skal vi sette opp et objekt der vi kan definere:

  1. Klassenavnet til hvert element som vi ønsker å sette en høyde på.
  2. Hvor høyt elementet skal være som en brøkdel av bakgrunnens høyde. 

Vi kommer til å iterere gjennom dette objektet og bruke verdiene det inneholder for å endre størrelsen på seksjonene i forgrunnen vår.

La oss starte med bare en oppføring i objektet:

var section_heights = "ufo_section": 0.25

Her har vi satt indeksen, (verdien til venstre), til ufo_section for å matche klassenavnet til vår første seksjon.

Da har vi satt verdien til 0.25 som er en annen måte å uttrykke 25% på. I et øyeblikk skal vi multiplisere denne verdien med nummeret som er lagret i doc_height variabel, dvs. høyden på bakgrunnsbildet. Ved å gjøre dette vil vi si at vi vil ha ufo_section panelet til å være 25% av den nåværende høyden av "background.svg".

For eksempel, hvis høyden på "background.svg" var 1000px høyden på ufo_seksjonen skulle komme ut som 250px:

 1000 * 0,25 = 250

Nå som vi har gått gjennom hvordan dette objektet vil fungere, la vi legge til noen oppføringer for de andre elementene vi vil sette høyder på. Oppdater objektet ditt på følgende måte:

var section_heights = "ufo_section": 0.25, "spacer_one": 0.03, "comet_section": 0.36, "spacer_two": 0,06, "landing_section": 0.298

Merk: Jeg valgte disse verdiene basert på prøve og feil, så vær så snill å leke med tallene etter å ha fullført denne veiledningen for å se effektene.

Iterere section_heights Gjenstand

Med vårt objekt fullført er vi klare til å starte iterering gjennom det og endre størrelsen på panelene våre.

Først trenger vi en $ .Hver () funksjon for å iterere section_heights objekt og trekk ut indeksen og verdien (henholdsvis klassenavn og høyde), fra hver oppføring den inneholder.

Legg til denne koden etter din section_heights gjenstand:

$ .each (section_heights, funksjon (indeks, verdi) console.log ("Index:" + index, "| Value:" + value););

For å tillate deg å se hvordan den ovennevnte iterasjonsfunksjonen utdataer index og verdi variabler, bruker vi console.log () å skrive en liten melding til konsollen for hver oppføring i section_heights gjenstand.

Oppdater nettstedet ditt, åpne Chrome Web Developer Tools (eller tilsvarende i din foretrukne nettleser), og se på konsollen. Du bør se dette:

Til venstre for hver melding etter indeks: du kan se index for hver oppføring, det vil si klassenavnene til elementene vi ønsker å endre størrelse på.

Til høyre for hver melding etter Verdi: du kan se verdi for hver oppføring, dvs. brøkdel av totalhøyde hvert panel skal være.

Beregn og sett seksjonshøyder

Nå, i stedet for å bare logge disse dataene til konsollen, la oss bruke den til å angi størrelsen på forgrunnsdelene våre. Slett console.log () linje og erstatt den med dette:

$ ("." + indeks) .height (Math.floor (verdi * doc_height));

La oss bryte ned hva denne linjen gjør.

Først har vi $ ("." + indeks). Vi bruker dette for å finne elementet vi ønsker å endre størrelse på. For eksempel, med den første oppføringen i objektet vårt index er satt til ufo_section. I så fall vurderer den første delen av koden vår å bli $. (".ufo_section"). Med denne koden blir jQuery bedt om å søke på siden for elementet med klassen ufo_section.

Neste legger vi til .høyde (...). Med denne koden vil jQuery sette høyden på elementet den har funnet, endre den til verdien som er sendt inn mellom parentesene.

I mellom brakettene vil du se verdi * doc_height. Det er her vi gjør multiplikasjonen vi tidligere nevnte for å beregne den planlagte panelhøyden. For eksempel har den første oppføringen til objektet verdien 0.25. Dette nummeret blir multiplisert med nummeret som er lagret i doc_height variabel.

Rundt multiplikasjonen av de to variablene vil du se Math.floor (). Dette runder resultatet av vår multiplikasjon ned til nærmeste hele tall. 

Så setter alt sammen, hvis verdien av doc_height er 5197, den første oppføringen i vårt objekt vil multiplisere det ved 0.25 gir oss et resultat av 1299,25

Math.floor () vil rundt det beløpet ned til 1299. Dette betyr at vår kode nå skal vurderes til å bli: $. (".ufo_section") .height (1299);

Med denne linjen vil jQuery finne elementet med klassen ufo_section og sett høyden til 1299px.

Din fullførte HTML og JavaScript

Det bryter opp HTML og JavaScript. Din ferdige "index.html" -fil skal nå inneholde denne koden:

    Scrolling Alien Lander      

Oppdater siden din nå for å se koden i bruk, og når du inspiserer HTML-en din, bør du se de nylig beregnede størrelsene vises inline:

Endre størrelsen på nettleservinduet ditt, og du bør se disse verdiene omberegne og oppdatere, for eksempel:

Og du er ferdig!

Ta en titt på sluttresultatet! Nå når du starter helt opp på siden og begynner å rulle vil du se at UFO begynner å synke. Når den når atmosfæren, forsvinner den litt, og en "fremmede komet" tar sin plass og fortsetter nedstigningen. På toppen av trærne forsvinner det igjen, og en "liten grønn mann" fullfører reisen til bakken.

Som jeg nevnte tidligere, er det en god ide å ha en lek med de verdiene som er angitt i section_heights objekt slik at du kan se hvordan de påvirker flytningen av landmannen gjennom sine ulike stadier.

Jeg håper du likte denne opplæringen og fikk noen nye ideer til kule ting du kan gjøre med SVG-bilder og faste bakgrunner.

Takk igjen til Yulia for den opprinnelige vektorillustrasjonen, takket være deg for å lese, og jeg ser deg igjen snart!