Laten we verder gaan met de vorige zelfstudie, laten we wat toevoegen aan onze build.
We gaan in op CSS3-animaties en maken een eenvoudige draaiende animatie voor ons laadpictogram. We hebben al de markup die we nodig hebben op de pagina, dus laten we direct naar de CSS gaan.
div.loading kleur: donkerder ($ grijs, 20%); positie: absoluut; breedte: 100 px; onderaan: 15px; links: 50%; margin-left: -50px; img vertical-align: middle; & .rotate -webkit-animation-naam: roteren; -ms-animation-naam: roteren; animatie-naam: roteren; -webkit-animatie-duur: 1s; animatie-duur: 1s; -webkit-animatie-iteratie-telling: oneindig; -ms-animatie-iteratie-telling: oneindig; animatie-iteratie-telling: oneindig; -webkit-animatie-timing-functie: lineair; -ms-animation-timing-functie: lineair; animatie-timing-functie: lineair;
Plaats deze code direct na de portfolio-post
blokkeren in ons Sass-bestand. Om te beginnen stellen we hier enkele stijlen voor de laaddiv zelf. We positioneren het absoluut en zorgen ervoor dat het gecentreerd is door a te gebruiken -Marge
van -50px, dat is de helft van de breedte van het element. Dit is om het feit goed te maken dat CSS elementen in de linkerbovenhoek plaatst.
De volgende sectie is veel interessanter. Zoals je misschien in de HTML hebt gezien, hebben we een klasse van toegewezen draaien
naar het laden tag die we als haak gebruiken om een CSS-animatie uit te voeren. De stijlen hier zijn ingesteld voor onze animatie.
We vertellen CSS in feite wat onze animatiefunctie heet (we zullen dat in een oogwenk creëren), hoe lang de animatie moet lopen, hoe vaak deze moet worden uitgevoerd en de timing- of versmallingsfunctie die moet worden gebruikt. Voor ons project willen we een mooie soepele 360 graden rotatie die nooit stopt. De bovenstaande code zal precies dat bereiken.
Notitie: We moeten browser-voorverklarende verklaringen opnemen zodat niemand het mist - en we kunnen dit verbeteren door een Sass-mixin te gebruiken om het zware werk voor ons te doen.
Laten we een kijkje nemen in de browser.
OK, het ziet er goed uit, maar er ontbreekt één ding. Het is niet aan het animeren! Laten we dit nu oplossen met de volgende code:
@ -webkit-hoofdframes roteren 100% -webkit-transform: roteren (360 graden); transformeren: roteren (360 graden); -webkit-transform-origin: middencentrum; transformatie-oorsprong: middelpunt; @keyframes draaien 100% -webkit-transform: roteren (360 graden); -ms-transformatie: roteren (360 graden); transformeren: roteren (360 graden); -webkit-transform-origin: middencentrum; -ms-transform-origin: middencentrum; transformatie-oorsprong: middelpunt;
Dus hier is het draaien
functie. De manier waarop dit werkt, is door belangrijke punten in de animatie in te stellen om het element te veranderen. Je zou iets kunnen laten gebeuren op 0%, 25%, 50% enzovoort. Onze animatie is heel eenvoudig, dus we hebben alleen een verklaring nodig van 100%, waarin staat dat het element 360 graden moet worden gedraaid. Dit betekent dat ons element een hele draai zal maken en terug zal eindigen waar het begon. Onze eerdere set-up zorgt ervoor dat het voor onbepaalde tijd blijft draaien. De transformatie-oorsprong
property vertelt CSS waar het middelpunt voor de animatie is. We zouden het kunnen instellen om te draaien met de linkerbovenhoek als middelpunt (dat ziet er misschien interessant uit!) Maar we willen gewoon het exacte midden van ons element hier gebruiken. Bewaar dit bestand en kijk in de browser!
Het zou op het bovenstaande lijken, maar een stuk soepeler en sneller.
Dat pakt onze Timeline Portfolio-pagina op, maar er is één ding dat we hieraan kunnen toevoegen voor de doeleinden van deze tutorial.
Nu, in de echte wereld zou dit type lay-out / thema waarschijnlijk een soort van oneindige scroll-functie bevatten waarin meer items verschijnen als u de pagina afrolt, zodat u niet hoeft te klikken om door pagina's te bladeren.
We kunnen simuleren dit gedrag hier met een paar regels jQuery. Doe open app.js en begin met het toevoegen van het volgende hierboven waar we onze menu-titelklikbehandelaar hebben geschreven.
var visibleHeight = $ (document) .height () - $ (window) .height (); var items;
Allereerst moeten we twee variabelen declareren die we later kunnen gebruiken. De tweede is louter een verklaring en krijgt later een waarde toegewezen. De eerste, visibleHeight
, pakt de venster
hoogte en trekt dit af van het totaal document
hoogte. Dit laat ons achter met de hoogte van het gebied dat momenteel zichtbaar is in de browser van de gebruiker.
storeElements (); $ (window) .on ('resize', functie (e) updateHeight ();); $ (window) .on ('scroll', functie (e) loadContent (););
Voeg vervolgens het bovenstaande fragment toe. U zult een paar functie-aanroepen zien voor functies die nog niet bestaan, wat OK is, want we zullen ze vervolgens creëren.
function storeElements () items = $ ('. portfolio-item: lt (3)'). clone (); // Strip de eerste klas uit selectie-items.removeClass ('first');
De storeElements
functie dient als een manier om onze te vullen items
variabele met enkele DOM-elementen. In ons geval willen we de eerste drie pakken portfolio-items
. Het gebruik van jQuery's lt ()
stelt ons in staat om selectief de elementen te kiezen die we willen. Zodra we de selectie hebben, zouden we dat moeten doen clone ()
ze, dus we gebruiken niet de feitelijke elementen maar een kopie. De laatste stap is het verwijderen van eerste
klasse als deze bestaat, omdat geen van onze nieuwe elementen de eerste in de lijst is.
functie updateHeight () visibleHeight = $ (document) .height () - $ (window) .height ();
Plaats deze functie hierboven storeElements
. Dit is waarschijnlijk de eenvoudigste functie omdat het alleen doet wat we deden klaar voor document
. De reden dat ik een functie heb gebruikt om dit te doen, is het herbruikbaar te houden.
Nu komen we bij de functie die het werk doet ...
function loadContent () if ($ (window) .scrollTop ()> = visibleHeight) $ (window) .unbind ('scroll'); var loadingWrap = $ ('. loading-wrap'); loadingWrap.fadeIn (function () setTimeout (function () loadingWrap.before (items); loadingWrap.hide (function () updateHeight (); storeElements (); $ (window) .on ('scroll', functie ( ) loadContent ();););, 500););
OK, stap voor stap wat we hier doen:
visibleHeight
.venster
dus we kunnen de inhoud verwerken.loading-wrap
voor later gebruik.loading-wrap
in en zodra de vervaging is voltooid ... Time-out
om het laden van de inhoud te simuleren.items
voor de loading-wrap
. Dit zal mooi aansluiten tussen het laadpictogram en de huidige portfolio-items
.loading-wrap
en eenmaal verborgen updateHeight
, storeElements
en bevestig de scroll-gebeurtenis opnieuw aan de venster
met instructies om deze functie opnieuw uit te voeren.Phew! Dat lijkt veel, dus loop er nog een keer doorheen als dat nodig is. Een ding dat je misschien opvalt, als je een blik in de ogen hebt, is dat we vervagen in de loading-wrap
wat eigenlijk al zichtbaar is in onze HTML. Los dit op door een inline stijl toe te voegen aan dat element ...
Dus als we nu onze bestanden opslaan en ons werk in de browser bekijken, zou u meer inhoud moeten zien "laden" zodra u naar de onderkant van de pagina scrolt. Oh wacht, er is nog iets dat we moeten toevoegen ...
$ ('.menu's h3'). on ('klik', functie (e) $ (this) .next ('ul'). toggleClass ('open'); updateHeight (); e.preventDefault (); false;);Binnen in de
h3
klikhandler die we aan het begin hebben gemaakt, moeten we toevoegen aanupdateHeight ()
, op deze manier wanneer we klikken om een menu te openen, worden de variabelen bijgewerkt om de hoogte van het document te wijzigen. Zonder dit, als u een menu op mobiel opent, zou de "laad" -functionaliteit gebroken zijn als devisibleHeight
variabele zou onjuist zijn.Conclusie
We zijn aan het einde gekomen! We kunnen waarschijnlijk het JavaScript opschonen dat we zojuist hebben geschreven en in een echte wereld zou het waarschijnlijk worden veranderd in een AJAX-gesprek ofzo.
Ik hoop dat je samen met deze tutorial een aantal verschillende technieken hebt geleerd. Het was leuk om te bouwen en ik ben blij om het proces met u te delen om dit zeer mooie ontwerp tot leven te brengen. Ik weet zeker dat er voldoende manieren zijn om dit te verbeteren, dus als je suggesties hebt, laat het me dan alsjeblieft weten in de comments!