În acest tutorial vom construi un site web cu pagini de tranziție frumoase, fără reîmprospătarea obișnuită a paginii agresive. Navigați prin paginile din demo pentru a vedea ce vreau să spun.
Pentru a realiza acest efect, vom folosi API-ul Web History. Pe scurt, acest API este folosit pentru a modifica istoricul browserului. Aceasta ne permite să încărcăm o nouă adresă URL, să modificăm titlul paginii, apoi să o înregistrăm în același timp ca o nouă vizită în browser fără a fi necesară încărcarea efectivă a paginii.
Acest lucru pare confuz, dar deschide o serie de posibilități - cum ar fi posibilitatea de a servi tranziții mai fine ale paginii și de a da un sentiment de viteză care îmbunătățește experiența utilizatorului. Probabil că ați asistat deja la API-ul Web History în acțiune pe un număr de site-uri Web și aplicații web, cum ar fi Trello, Quartz și Privacy.
Site-ul destul de abstract (și destul de frumos) cu cuarțÎnainte de a merge mai departe, să examinăm mai întâi într-un anumit API pe care o vom implementa pe site.
Pentru a accesa API-ul Web History, mai întâi scrieți window.history
apoi urmați acest lucru cu unul dintre API-urile; o metodă sau o proprietate. În acest tutorial ne vom concentra pe pushState ()
astfel:
window.history.pushState (stat, titlu, url);
După cum puteți vedea din fragmentul de mai sus, pushState ()
metoda are trei parametri.
stat
, ar trebui să fie un obiect care conține date arbitrare. Aceste date vor fi apoi accesibile prin intermediul window.history.state
. Într-o aplicație din lumea reală, vom transmite date precum un ID de pagină, o adresă URL sau intrări serializate derivate dintr-un formular. titlu
șiURL-ul
. Acestea două schimbă URL-ul și titlul documentului în browser, precum și le înregistrează ca o intrare nouă în istoricul browser-ului. Să examinăm următorul exemplu pentru a înțelege mai bine cum pushState ()
Metoda funcționează.
(functie ($) $ ("a") .on ("click", functie (eveniment) event.preventDefault (); window.history.pushState /)););) (jQuery);
În codul de mai sus, o legătură atașată la clic
evenimentul apoi pune în aplicare pushState ()
metodă. Pe măsură ce faceți clic pe link, așteptăm ca codul să schimbe titlul documentului și adresa URL:
Și asta se întâmplă; screenshotul arată că adresa URL este schimbată în "about /" așa cum este definită în pushState ()
metodă. Și din moment ce pushState ()
metoda creează o nouă înregistrare în istoricul browser-ului, putem reveni la pagina anterioară prin intermediul browserului Înapoi buton.
Cu toate acestea, toate browserele din acest exemplu ignoră în prezent titlu
parametru. Puteți vedea din ecranul pe care documentul nu se schimbă Despre - Acme așa cum se specifică. În plus, apelarea pushState ()
metoda nu va declanșa de asemenea popstate
eveniment; un eveniment expediat de fiecare dată când se schimbă istoria - ceva de care avem nevoie! Există câteva discrepanțe privind modul în care browserele gestionează acest eveniment, după cum se menționează în MDN:
"Navigatorii tind să se ocupe depopstate
eveniment diferit la încărcarea paginii. Chrome (înainte de v34) și Safari emit întotdeauna apopstate
eveniment la pagina de încărcare, dar Firefox nu. "
Vom avea nevoie de o bibliotecă ca o rezervă pentru a face API-urile Istoric Web să funcționeze în mod consecvent în browser fără nici un fel de obstacole.
Din moment ce pushState ()
metoda nu funcționează la întregul său potențial, în acest tutorial ne vom ocupa de History.js. După cum sugerează și numele, această bibliotecă JavaScript este a polyfill, replicând API-urile de Istorie Nativă care funcționează în diferite browsere. De asemenea, expune un set de metode similare API-urilor native, deși cu puține diferențe.
După cum am menționat mai devreme, API-ul nativ al browserului este apelat prin istorie
obiect fereastră cu litera "h", în timp ce este accesat API-ul History.js Istorie
cu majusculă "H". Având în vedere exemplul anterior și presupunând că avem fișierul history.js încărcat, putem revizui codul, după cum urmează (din nou, observați majusculă "H").
window.History.pushState (, titlu, url);
Sper că această scurtă explicație este ușor de înțeles. Altfel, iată câteva referințe suplimentare dacă doriți să aflați mai multe despre API-ul Web History.
În această secțiune nu vom discuta fiecare pas necesar pentru a construi în detaliu un site web static. Site-ul nostru este simplu simplu, după cum se arată în următoarea imagine:
Pagina de pornire a site-uluiNu trebuie să creați un site care să pară exact același; aveți libertatea de a adăuga orice conținut și de a crea cât mai multe pagini de care aveți nevoie. Cu toate acestea, există câteva puncte particulare pe care trebuie să le luați în considerare în ceea ce privește structura HTML și utilizarea id
și clasă
atribute pentru unele elemente.
cap
. Poate fi încărcat ca o dependență de proiect prin Bower sau printr-un CDN cum ar fi CDNJS sau JSDelivr.div
cu ID-ul împacheta
;
link-ul paginii
clasa pe care o vom folosi pentru selectarea acestor meniuri.titlu
atributul la care vom trece la pushState ()
pentru a determina titlul documentului.Luând în considerare toate acestea, marcajul nostru HTML va arăta aproximativ după cum urmează:
Când ați terminat construirea site-ului dvs. static, putem trece în secțiunea principală a acestui tutorial.
Înainte de a începe scrierea oricărui cod, trebuie să creați un nou fișier pentru a ține JavaScript; o vom numi script.js și încărcați fișierul în document înainte de corp
tag-ul de închidere.
Să adăugăm prima noastră bucată de cod pentru a modifica titlul documentului și adresa URL după ce faceți clic pe navigarea prin meniu:
// 1. var $ wrap = $ ("#wrap"); // 2. $ wrap.on ("clic", ".page-link", funcție (eveniment) // 3. event.preventDefault (); // 4. if (window.location === this.href ) retur; // 5. var pageTitle = (this.title)? this.title: this.textContent; pageTitle = (this.getAttribute ("rel") === "home")? pageTitle: pageTitle + - "Acme"; // 6. History.pushState (null, pageTitle, this.href););
Am împărțit codul separat în mai multe secțiuni numerotate. Acestea vă vor face mai ușor să identificați codul cu următoarea referință:
, care împachetează tot conținutul site-ului nostru.#wrap
în loc să atașați evenimentul direct pe fiecare navigare de meniu. Această practică este cunoscută sub numele de eveniment delegare. Cu alte cuvinte, ale noastre #wrap
elementul este responsabil pentru ascultarea de evenimente click în numele .link-ul paginii
.event.preventDefault ()
astfel încât utilizatorii să nu fie direcționați spre pagina în cauză.titlul paginii
variabila conține formatul titlului, derivat din atributul titlul linkului sau din textul linkului. Fiecare titlu al paginii urmează Pagina Titlu - Acme
convenție, cu excepția paginii de pornire. "Acme" este numele companiei noastre fictive.titlul paginii
și adresa URL a paginii la History.js pushState ()
metodă.În acest moment, când faceți clic pe navigarea din meniu, titlul și adresa URL ar trebui să se modifice în consecință, după cum se arată mai jos:
Titlul paginii și adresa URL sunt modificateCu toate acestea, conținutul paginii rămâne același! Nu este actualizat pentru a se potrivi cu noul titlu și noua adresă URL.
Trebuie să adăugăm următoarele linii de cod pentru a înlocui conținutul propriu-zis al paginii.
// 1. History.Adapter.bind (fereastra, "statechange", function () // 2. var state = History.getState (); // 3. $ .get (state.url, function (res) // $ $. ($ (Res), function (index, elem) if ($ wrap.selector! == "#" + elem.id) return; $ wrap.html .html ()););););
Din nou, codul este împărțit în mai multe secțiuni numerotate.
pushState ()
și execută funcția atașată..obține()
metodă vom prelua conținutul de la adresa URL dată.id
numit împacheta
din conținutul preluat și, eventual, să înlocuiți conținutul curent al paginii cu acesta.Odată ce a fost adăugat, conținutul ar trebui să fie actualizat atunci când faceți clic pe navigarea din meniu. Așa cum am menționat, putem accesa și paginile vizitate înainte și înapoi prin browser Înapoi și Redirecţiona butoane.
Site-ul nostru este prezent în acest moment. Cu toate acestea, dorim să mergem mai departe adăugând o mică animație pentru a aduce pagina la viață și, în cele din urmă, site-ul nostru se simte mai convingător.
Animația în această situație trebuie să fie simplă, așa că vom scrie totul pentru zgârieturi, în loc să încărcăm animații printr-o bibliotecă cum ar fi Animate.css, Motion UI din ZURB sau Effeckt.css. Vom numi animația slideInUp
, după cum urmează:
@frame cheie slideInUp de la transform: translate3d (0, 10px, 0); opacitate: 0; pentru a transforma translate3d (0, 0, 0); opacitate: 1;
După cum sugerează și numele, animația va glisa conținutul paginii de jos în sus împreună cu opacitatea elementului. Aplicați animația la elementul care înfășoară conținutul principal al paginii, după cum urmează.
.secțiune animație-durată: .38s; animație-umplere-mod: ambele; animație-nume: slideInUp;
Trecerea de la o pagină la alta ar trebui să se simtă acum mai ușoară odată ce animația este aplicată. Aici, puteți opri și o numiți o zi! Site-ul nostru este realizat și suntem gata să îl implementăm pentru a vedea lumea.
Cu toate acestea, există încă un lucru pe care ar trebui să îl adăugați, mai ales pentru cei care doresc să monitorizeze numărul de vizite și comportamentul vizitatorilor pe site-ul dvs..
Trebuie să adăugăm Google Analytics pentru a urmări fiecare vizualizare pagina.
Deoarece paginile noastre vor fi încărcate în mod asincron (cu excepția iniţială pagina încărcată) urmărirea numărului de vizualizare a paginii ar trebui să se facă și în mod asincron.
Pentru început, asigurați-vă că ați adăugat standardul Google Analytics în document cap
. De obicei, codul arată după cum urmează:
Apoi, trebuie să modificăm codul nostru JavaScript pentru a include codul de urmărire Google Analytics astfel încât fiecare pagină încărcată în mod asincron să fie, de asemenea, măsurată ca vizualizare pagina.
Avem mai multe opțiuni. În primul rând, putem începe să numărăm când utilizatorul face clic pe un link de navigare sau când schimbă titlul paginii și adresa URL sau când conținutul paginii a fost încărcat complet.
Vom opta pentru acesta din urmă, care este, probabil, cel mai autentic și, în acest mod, vom folosi efectul jQuery promisiune()
după modificarea conținutului paginii, după cum urmează:
$ wrap.html ($ (elem) .html ()) .promise () .done (funcția (res) // Asigurați-vă că noul conținut este adăugat și că metoda "ga () ga === "funcția" && res.length! == 0) ga ('set', page: window.location.pathname, title: state.title); ;);
Asta este tot ce este, vom avea acum vizualizare pagina înregistrată în Google Analytics.
În acest tutorial am îmbunătățit un site web static simplu cu API-ul Web History pentru a ușura trecerea la pagini, încărcarea mai rapidă și, în general, pentru a oferi o experiență mai bună utilizatorilor noștri. La sfârșitul acestui tutorial, am implementat și Google Analytics pentru a înregistra utilizatori vizualizare pagina asincronă. În plus, site-ul nostru este perfect târască-able de către motoarele de căutare, deoarece este, după cum sa menționat, doar un simplu site HTML.
Acesta a fost un tutorial de mâncare, explicând multe lucruri precum CSS Animation, jQuery Ajax și Promise jQuery. Iată câteva referințe pe care trebuie să le priviți pentru a vă consolida ceea ce ați învățat.
În cele din urmă, nu uitați să vizitați site-ul demo al acestui tutorial, precum și codul sursă din depozit.