Hoe u een doorbladerende 'Alien Lander'-website kunt coderen

In deze tutorial, de tweede in een reeks van twee delen, nemen we de geweldige vectorgebaseerde illustratie die is geproduceerd in Yulia Sokolova's "Hoe maak je een lange scrollachtergrond voor een website" en codeer hem in een live-site.

Wat we gaan bouwen

We zullen dingen samenvoegen, zodat je naar beneden scrolt vanaf de bovenkant van de pagina, een "Alien Lander" die zijn weg naar beneden vindt. In het begin zullen we een UFO zien zweven in de ruimte.

Als we naar beneden scrollen, zal de UFO de atmosfeer bereiken en een "buitenaardse komeet" worden. 

En ten slotte, wanneer het door de boomgrens gaat, zal het veranderen in een "kleine groene man" die zijn landing op de grond maakt.

Bekijk de live demo!

SVG-afbeeldingen

In dit project gebruiken we SVG-afbeeldingen, zodat we kunnen profiteren van hun vermogen om vloeiend in te schalen en hun kleine bestandsgrootte.

Voordat we beginnen met coderen, hebt u de afbeelding nodig die is gemaakt in deel een van deze zelfstudieserie, die is onderverdeeld in vier SVG-bestanden:

  1. De UFO als een bestand met de naam "ufo.svg"
  2. De "buitenaardse komeet" als een bestand met de naam "alien_comet.svg"
  3. De "kleine groene man" als een bestand met de naam "alien_landing.svg"
  4. De achtergrondafbeelding met de bovenstaande drie items verwijderd, als een bestand met de naam "background.svg"

Je kunt deze SVG-afbeeldingen zelf exporteren vanuit je favoriete grafische app als je dat wilt, of je kunt alle vier afbeeldingen vinden voor gebruik in de bronbestanden op GitHub.

Basisstructuur instellen

Maak een nieuwe map voor uw project en maak daarbinnen een submap met de naam "css" en een andere met de naam "images".

Kopieer en plak uw vier SVG-afbeeldingen in de nieuwe map "images".

Maak in de map "css" een bestand met de naam "style.css".

Maak in de hoofdmap een nieuw bestand met de naam "index.html".

Uw mappenstructuur zou er nu als volgt uit moeten zien:

Voeg in het bestand "index.html" de volgende eenvoudige HTML toe om de hoofdzaken op te halen en laad de stylesheet:

    Scrollen door Alien Lander     

Voeg de achtergrond toe

Het lijkt misschien contra-intuïtief, maar we gaan onze achtergrondafbeelding eigenlijk gebruiken met een img element in plaats van als een CSS-achtergrondafbeelding. We doen dit omdat:

  1. We willen profiteren van het vermogen van SVG om het formaat aan te passen en het hele kijkvenster te vullen met onze "background.svg" -afbeelding, ongeacht de afmetingen van het browservenster.
  2. Om de schuiftechniek te laten werken, moeten we de hoogte van de achtergrondafbeelding weten.
  3. Omdat we onze achtergrondafbeelding een vloeiende grootte geven, kunnen we niet vooraf weten wat de hoogte is.
  4. Omdat we de hoogte van de achtergrondafbeelding niet van tevoren weten, moeten we deze detecteren na de afbeelding nadat deze is geladen.
  5. Als we "background.svg" instellen als een CSS-achtergrondafbeelding, heeft de hoogte geen effect op de sitelay-out, waardoor de hoogte moeilijk te detecteren is.
  6. Door "background.svg" in plaats daarvan als normale afbeelding in te voegen zullen de lay-out van de site beïnvloeden, waardoor de hoogte relatief eenvoudig te detecteren is met jQuery.

Nu je begrijpt waarom we deze aanpak volgen, laten we beginnen met coderen!

Voeg in je bestand "index.html" deze code toe:

Als u nu een voorbeeld van uw bestand in een browser bekijkt, ziet u de afbeelding die het kijkvenster vult. Er zal echter nog steeds wat witte ruimte rond de randen zijn. 

Dit komt omdat browsers een kleine marge op de lichaam element standaard. Om dit te overschrijven, voegt u in het bestand "style.css" deze CSS toe:

body marge: 0; 

Er is ook een andere standaardinstelling voor de browser die we moeten negeren, die van de tonen eigenschap op afbeeldingen die zijn ingesteld op in lijn. Als u naar de onderkant van uw pagina bladert, ziet u dat er momenteel een kleine witte ruimte onder de afbeelding is vanwege deze standaardinstelling. Wijzig dit door toe te voegen:

img weergave: blok; 

Je zou nu moeten zien dat de "background.svg" afbeelding het venster gelijk met de randen vult, en als je de breedte van het venster aanpast, zie je de SVG-afbeelding zelf herschalen om het nieuwe formaat aan te passen. De hoogte van de sitelay-out wordt ook gewijzigd om de juiste beeldverhouding voor de afbeelding "background.svg" te behouden.

Voeg een voorgrondcontainer toe

Om de afbeelding die we zojuist hebben geplaatst, als achtergrondafbeelding te laten werken, hebben we een manier nodig waarop de rest van onze inhoud er op de voorgrond op kan worden geplaatst. We kunnen dit bereiken door een div element dat als een container zal fungeren en dan de inhoud ervan zal aanpassen positie en z-index eigenschappen.

Voeg in je "index.html" -bestand na de afbeelding die je zojuist hebt toegevoegd deze nieuwe div in:

 

En voeg in "style.css" deze CSS toe:

.voorgrond positie: absoluut; boven: 0; links: 0; hoogte: 100%; breedte: 100%; z-index: 1; 

Laten we doornemen wat we doen met de bovenstaande code.

Ten eerste door in te stellen positie naar absoluut we nemen het element uit de normale documentstroom (die het anders onder de achtergrondafbeelding zou plaatsen), waardoor we het overal kunnen plaatsen waar we maar willen.

Vervolgens hebben we de top en links eigenschappen voor 0 waarbij het element naar de bovenkant van het venster wordt verplaatst en horizontaal wordt uitgelijnd met onze achtergrondafbeelding.

Daarna geven we het element een hoogte en breedte van 100%. Dit zorgt ervoor dat het element niet in elkaar klapt en niets verbergt.

Ten slotte hebben we de z-index naar 1 die het element naar voren brengt, zodat het voor onze achtergrondafbeelding (die standaard is geplaatst) zit z-index van auto). Hiermee wordt voorkomen dat inhoud in het element wordt verdoezeld door de achtergrondafbeelding.

Onze voorgrondcontainer is nu klaar om inhoud te laten toevoegen.

Voeg het UFO-paneel toe

De manier waarop we onze UFO "land" op de grond gaan maken, is door drie panelen te maken, één voor elke "landing" -fase. Vervolgens voegen we de bijbehorende SVG-afbeelding voor elk paneel, bijvoorbeeld het bestand "ufo.svg", toe als achtergrondafbeelding met vaste positie. Het beeld blijft dan op zijn plaats tijdens het scrollen terwijl de achtergrond erachter beweegt, waardoor de illusie van afdaling wordt gecreëerd.

In je "voorgrond" div, voeg dit nieuw toe div:

Voeg nu de volgende code toe aan uw CSS:

.ufo_section height: 100%; achtergrond: url (... /images/ufo.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 40% automatisch; achtergrond-bijlage: vast; 

In de eerste regel van onze bovenstaande code geven we het element een hoogte van 100% om ervoor te zorgen dat de inhoud zichtbaar is. Vervolgens voegen we onze "ufo.svg" -afbeelding toe als achtergrond. We gaan zitten achtergrond herhaling naar no-repeat omdat we slechts één UFO willen laten verschijnen, en dat doen we dan background-position plaats het beeld in het midden, zowel horizontaal als verticaal.

Met onze background-size property, stellen we de breedte in op een percentage gebaseerde waarde en laten we de hoogte automatisch berekenen. Deze breedte wordt afgeleid van de originele vectorafbeelding waarin de breedte van de UFO ongeveer 40% van de breedte van de algehele afbeelding is.

Door de breedte van ons "ufo.svg" -afbeelding in te stellen als een percentage, zal het UFO-beeld ook de breedte aanpassen om de beoogde verhoudingen te behouden wanneer het formaat van het venster verandert en het "background.svg" -beeld hiermee verandert.

Op de laatste regel die we instellen background-attachment naar vast, wat betekent dat het beeld gefixeerd blijft terwijl we scrollen, en ons de illusie van afkomst geeft.

Probeer je pagina opnieuw op te frissen en te scrollen - je zou de UFO verticaal tussen de planeten moeten zien bewegen.

Voeg de komeet en landingspanelen toe

Terwijl je naar beneden scrolt op je site, zul je merken dat de UFO verdwijnt zodra je ver genoeg naar beneden gaat. Dit gebeurt omdat we voorbij de hoogte van de schuifbalk scrollen ufo_section paneel dus op dat moment kunnen we de achtergrond niet meer zien. 

We gaan drie panelen zoals deze op elkaar stapelen, zodat wanneer we langs een en de achtergrond ervan scrollen, de achtergrond van het volgende paneel verdwijnt komt naar voren, het effect creëren van het ene beeld dat wordt vervangen door het andere.

Dus we zullen nu het proces herhalen dat we hierboven gebruikten om de "alien_comet.svg" en "alien_landing.svg" afbeeldingen in te voegen.

Voeg aan uw HTML het volgende toe net na uw ufo_section div en nog steeds in je voorgrond div:

Voeg vervolgens aan je CSS deze nieuwe klassen toe:

.comet_section height: 100%; achtergrond: url (... /images/alien_comet.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 15% automatisch; achtergrond-bijlage: vast;  .landing_section height: 100%; achtergrond: url (... /images/alien_landing.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 15% automatisch; achtergrond-bijlage: vast; positie: relatief; 

We gebruiken hier allemaal dezelfde code en technieken, met alleen de namen van afbeeldingsbestanden en de breedte op de background-size eigenschap ingesteld op 15% om te passen bij de smallere afbeeldingen die we zojuist hebben toegevoegd.

Uw voltooide CSS

Uw "style.css" -bestand is nu klaar en zou de volgende code moeten bevatten:

body marge: 0;  img display: block;  .voorgrond positie: absoluut; boven: 0; links: 0; hoogte: 100%; breedte: 100%; z-index: 1;  .ufo_section height: 100%; achtergrond: url (... /images/ufo.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 40% automatisch; achtergrond-bijlage: vast;  .comet_section height: 100%; achtergrond: url (... /images/alien_comet.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 15% automatisch; achtergrond-bijlage: vast;  .landing_section height: 100%; achtergrond: url (... /images/alien_landing.svg); achtergrondherhaling: geen herhaling; achtergrond-positie: midden; achtergrondformaat: 15% automatisch; achtergrond-bijlage: vast; positie: relatief; 

Ga nu terug naar je site, scroll naar beneden en je zou de UFO in de komeet zien veranderen, dan een beetje verder naar beneden in de "kleine groene man".

Voeg paneelhoogteberekeningen toe

Op dit moment zul je merken dat we een aantal problemen moeten oplossen bij het scrollen en ze zijn:

  1. De drie panelen zijn elk niet hoog genoeg. Hierdoor lijkt het alsof de buitenaardse lander te snel van de ene vorm in de andere overgaat, zodat hij nooit de grond raakt.
  2. Je kunt zien dat de "alien_comet.svg" afbeelding begint te verschijnen voordat de "ufo.svg" afbeelding volledig is verdwenen, wat vreemd lijkt.

Omdat onze "background.svg" -afbeelding geen vaste grootte heeft, weten we niet de exacte pixelhoogte die elk paneel moet hebben voordat het wordt geladen. Wat we van tevoren kunnen beslissen, is echter de hoogte die elk paneel moet hebben als een percentage van de hoogte van "background.svg".

Met behulp van jQuery kunnen we dit proces implementeren:

  1. Definieer de hoogte die we willen dat elk paneel is als een percentage (of fractie) van de hoogte van de "background.svg" afbeelding.
  2. Detecteer de hoogte van "background.svg" nadat deze is geladen.
  3. Bereken en stel de hoogtes van de panelen in op basis van de bovenstaande twee stukjes informatie.

Terwijl we bezig zijn, zullen we ook een paar extra lege div's toevoegen om op te treden als spacers tussen elk paneel en hun hoogte ook instellen met jQuery. Het toevoegen van ruimte tussen de panelen zorgt voor een vloeiendere overgang, waardoor het probleem van het zien van de "alien_comet.svg" afbeelding wordt opgelost voordat de "ufo.svg" afbeelding weg is.

Update je HTML zodat er een spacer-div is tussen elke bestaande div zoals:

En in het hoofdgedeelte laadt u in jQuery het volgende:

Stel de JavaScript-functie in

Voor het sluiten tag, maak er een paar van tags en stel een nieuwe functie in, zoals zo:

We willen dat deze functie wordt geactiveerd wanneer de pagina voor het eerst wordt geladen en op elk moment wanneer de grootte wordt gewijzigd, dus om dit te bereiken, voegt u ook de volgende code toe na uw opening script label:

$ (document) .ready (function () set_section_heights ();); $ (venster) .resize (function () set_section_heights (););

Verkrijg de hoogte van de achtergrondafbeelding

Binnen in de set_section_heights () functie, het eerste wat we moeten doen is uitvinden welke hoogte onze achtergrondafbeelding momenteel is en deze opslaan als een variabele. Voeg hiervoor deze code toe:

var doc_height = $ (". background"). height ();

Met het eerste deel van de code, $ ( "Background"), jQuery vindt het element met de klassenaam achtergrond. De bijgevoegde .hoogte() functie krijgt dan de pixelhoogte van dat element als een geheel getal. Dit vertelt ons hoe hoog onze "background.svg" -afbeelding is en slaat dat aantal op in de variabele doc_height.

Definieer beoogde sectiehoogtes

Nu gaan we een object opzetten waarin we kunnen definiëren:

  1. De klassenaam van elk element waarvoor we een hoogte willen instellen.
  2. Hoe hoog dat element zou moeten zijn als een fractie van de hoogte van de achtergrond. 

We gaan dit object doorlopen en gebruiken de waarden die het bevat om de secties op onze voorgrond te verkleinen.

Laten we beginnen met slechts één item in het object:

var section_heights = "ufo_section": 0.25

Hier hebben we de index (de waarde aan de linkerkant) ingesteld op ufo_section om de klassenaam van onze eerste sectie te evenaren.

Dan hebben we de waarde ingesteld op 0.25 wat een andere manier is om 25% uit te drukken. Binnenkort gaan we deze waarde vermenigvuldigen met het nummer dat is opgeslagen in de doc_height variabele, dat wil zeggen de hoogte van de achtergrondafbeelding. Door dit te doen zeggen we dat we het willen ufo_section deelvenster is 25% van de huidige hoogte van "background.svg".

Bijvoorbeeld, als de hoogte van "background.svg" was 1000px de hoogte van de ufo_section zou eruit komen als 250px:

 1000 * 0,25 = 250

Nu we hebben doorgenomen hoe dit object zal werken, laten we wat ingangen toevoegen voor de andere elementen waarop we hoogten willen instellen. Werk uw object bij naar het volgende:

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

Notitie: Ik heb deze waarden op basis van vallen en opstaan ​​geselecteerd, dus voel je vrij om met de cijfers te spelen na het voltooien van deze tutorial om de effecten te zien.

Herhaal de section_heights Voorwerp

Met ons object compleet zijn we klaar om te beginnen met itereren en onze panelen te vergroten of verkleinen.

Eerst hebben we een $ .Each () functie om het te herhalen section_heights object en extraheer de index en waarde (die respectievelijk de klassenaam en hoogte vertegenwoordigen) uit elke vermelding die deze bevat.

Voeg deze code toe na uw section_heights voorwerp:

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

Om u te laten zien hoe de bovenstaande iteratiefunctie de. Uitvoert inhoudsopgave en waarde variabelen die we gebruiken console.log () om een ​​klein bericht naar de console te schrijven voor elk item in de section_heights voorwerp.

Laad uw site opnieuw, open Chrome Web Developer Tools (of het equivalent daarvan in de browser van uw voorkeur) en bekijk de console. Je zou dit moeten zien:

Aan de linkerkant van elk bericht na Inhoudsopgave: je kan de ... zien inhoudsopgave voor elke vermelding, dat wil zeggen de klassenamen van de elementen die we willen wijzigen.

Aan de rechterkant van elk bericht na Waarde: je kan de ... zien waarde voor elke invoer, d.w.z. de fractie van de totale hoogte die elk paneel zou moeten zijn.

Bereken en stel sectiehoogtes in

In plaats van alleen deze gegevens naar de console te loggen, laten we deze gebruiken om de grootte van onze voorgrondsecties in te stellen. Verwijder de console.log () regel en vervang dit door:

$ ("." + index) .hoogte (Math.floor (waarde * doc_height));

Laten we opsplitsen wat deze regel doet.

Eerst hebben we $ ("." + index). We gebruiken dit om het element te vinden waarvan we de grootte willen wijzigen. Met de eerste vermelding in ons object bijvoorbeeld inhoudsopgave is ingesteld op ufo_section. In dit geval zal het eerste deel van onze code evalueren om te worden $. (".ufo_section"). Met deze code wordt jQuery gevraagd om op de pagina naar het element met de klasse te zoeken ufo_section.

Vervolgens voegen we toe .hoogte(… ). Met deze code stelt jQuery de hoogte in van het element dat het heeft gevonden, en verandert het in de waarde die tussen de haakjes is doorgegeven.

Tussen de haakjes zul je zien waarde * doc_height. Hier doen we de vermenigvuldiging die we eerder noemden om de beoogde paneelhoogte te berekenen. De eerste invoer van ons object heeft bijvoorbeeld de waarde 0.25. Dit aantal wordt vermenigvuldigd met het aantal dat is opgeslagen in de doc_height veranderlijk.

Rond de vermenigvuldiging van die twee variabelen zul je zien Math.floor (). Dit rondt het resultaat van onze vermenigvuldiging af naar het dichtstbijzijnde hele getal. 

Dus alles bij elkaar, als de waarde van doc_height is 5197, de eerste vermelding in ons object zou dat vermenigvuldigen met 0.25 ons een resultaat geven van 1299,25

Math.floor () zal dat bedrag naar beneden afronden 1299. Dit betekent dat onze code nu zou evalueren om: $. (".ufo_section") .hoogte (1299);

Met deze regel vindt jQuery het element met de klasse ufo_section en stel de hoogte in op 1299px.

Uw voltooide HTML & JavaScript

Dat omvat uw HTML en JavaScript. Het voltooide "index.html" -bestand zou nu deze code moeten bevatten:

    Scrollen door Alien Lander      

Laad uw site nu opnieuw om de code in actie te zien en wanneer u uw HTML inspecteert, ziet u dat de nieuw berekende formaten inline worden weergegeven:

Verklein je browservenster en je zou deze waarden opnieuw moeten berekenen en bijwerken, bijvoorbeeld:

En je bent klaar!

Bekijk het eindresultaat! Als je helemaal bovenaan de pagina begint en begint te scrollen, zie je dat de UFO begint af te dalen. Wanneer het de atmosfeer bereikt verdwijnt het voor een klein beetje en een "buitenaardse komeet" neemt zijn plaats in en vervolgt de afdaling. Aan de top van de bomen verdwijnt het weer en een "kleine groene man" voltooit de reis naar de grond.

Zoals ik eerder al zei, is het een goed idee om een ​​beetje te spelen met de waarden die zijn ingesteld in de section_heights object zodat je kunt zien hoe ze de stroom van de lander door de verschillende stadia beïnvloeden.

Ik hoop dat je deze tutorial leuk vond en hebt nieuwe ideeën gekregen voor leuke dingen die je kunt doen met SVG-afbeeldingen en vaste achtergronden.

Nogmaals bedankt aan Yulia voor de originele vectorillustratie, dankzij jou om te lezen, en ik zie je binnenkort weer!