In questo tutorial costruiremo un sito Web con pagine di transizione meravigliosamente fluide, senza il solito aggiornamento aggressivo della pagina. Naviga tra le pagine nella demo per vedere cosa intendo.
Per ottenere questo effetto useremo l'API Web di cronologia. In poche parole, questa API viene utilizzata per modificare la cronologia del browser. Ci consente di caricare un nuovo URL, modificare il titolo della pagina, quindi registrarlo come una nuova visita nel browser senza dover effettivamente caricare la pagina.
Questo suona confuso, ma apre una serie di possibilità, come essere in grado di servire transizioni di pagina più fluide e dare un senso di rapidità che migliori l'esperienza dell'utente. Probabilmente hai già assistito all'API della cronologia Web in azione su numerosi siti Web e applicazioni Web, come Trello, Quartz e Privacy..
Il sito web del Quartz piuttosto astratto (e piuttosto bello)Prima di andare oltre, esaminiamo innanzitutto una particolare API che verrà distribuita sul sito Web.
Per accedere all'API della cronologia Web, prima scriviamo window.history
quindi segui questo con una delle API; un metodo o una proprietà. In questo tutorial ci concentreremo sul pushState ()
metodo, quindi:
window.history.pushState (stato, titolo, url);
Come puoi vedere dallo snippet sopra, il pushState ()
il metodo richiede tre parametri.
stato
, dovrebbe essere un oggetto contenente dati arbitrari. Questi dati saranno quindi accessibili attraverso window.history.state
. In un'applicazione del mondo reale, dovremmo trasmettere dati come un ID di pagina, un URL o input serializzati derivati da un modulo. titolo
eurl
. Questi due cambiano l'URL e il titolo del documento nel browser, oltre a registrarli come una nuova voce nella cronologia del browser. Analizziamo il seguente esempio per capire meglio come pushState ()
Il metodo funziona.
(function ($) $ ("a") .on ("click", function (event) event.preventDefault (); window.history.pushState (ID: 9, "About - Acme", "about / "););) (jQuery);
Nel codice precedente, un collegamento collegato con clic
evento quindi distribuisce il pushState ()
metodo. Quando clicchiamo sul link, ci aspettiamo che il codice cambi il titolo del documento e l'URL:
E lo fa; lo screenshot mostra che l'URL è cambiato in "circa /" come definito nella pushState ()
metodo. E dal momento che pushState ()
metodo crea un nuovo record nella cronologia del browser, siamo in grado di tornare alla pagina precedente attraverso il browser Indietro pulsante.
Tuttavia, tutti i browser in questo esempio stanno attualmente ignorando il titolo
parametro. Puoi vedere dallo screenshot che il documento non cambia A proposito - Acme come specificato. Inoltre, chiamando il pushState ()
il metodo non attiverà anche il popstate
evento; un evento che viene inviato ogni volta che la storia cambia, qualcosa di cui abbiamo bisogno! Ci sono alcune discrepanze su come i browser gestiscono questo evento, come dichiarato in MDN:
"I browser tendono a gestire ilpopstate
evento in modo diverso al caricamento della pagina. Chrome (precedente alla v34) e Safari emettono sempre apopstate
evento al caricamento della pagina, ma Firefox no. "
Avremo bisogno di una libreria come fallback per far sì che le API Web di History funzionino in modo coerente attraverso il browser senza ostacoli.
Dal momento che il pushState ()
il metodo non funziona al massimo del suo potenziale, in questo tutorial utilizzeremo History.js. Come suggerisce il nome, questa libreria JavaScript è a polyfill, replicare le API native della cronologia che funzionano su browser diversi. Espone anche un insieme di metodi simili alle API native, anche se con poche differenze.
Come accennato in precedenza, l'API nativa del browser viene chiamata attraverso storia
oggetto della finestra con la "h" minuscola, mentre si accede all'API History.js Storia
con la "H" maiuscola. Dato l'esempio precedente e supponendo di avere caricato il file history.js, possiamo revisionare il codice, come di seguito (di nuovo, si noti la "H" maiuscola).
window.History.pushState (, titolo, url);
Spero che questa breve spiegazione sia facile da capire. Altrimenti, ecco alcuni ulteriori riferimenti se vuoi saperne di più sull'API della Cronologia web.
In questa sezione non discuteremo ogni passo necessario per costruire un sito web statico in dettaglio. Il nostro sito Web è semplice, come mostrato nello screenshot seguente:
La homepage del sitoNon è necessario creare un sito Web che abbia esattamente lo stesso aspetto; sei libero di aggiungere qualsiasi contenuto e creare tutte le pagine di cui hai bisogno. Tuttavia, ci sono alcuni punti particolari che devi considerare riguardo la struttura HTML e l'uso di id
e classe
attributi per alcuni elementi.
capo
. Puoi caricarlo come dipendenza del progetto tramite Bower o tramite un CDN come CDNJS o JSDelivr.div
con l'ID avvolgere
;
Pagina-link
classe che useremo per selezionare questi menu.titolo
attributo a cui passeremo pushState ()
per determinare il titolo del documento.Tenendo conto di tutto ciò, il nostro markup HTML avrà approssimativamente il seguente aspetto:
Quando hai finito di costruire il tuo sito web statico, possiamo spostarci nella sezione principale di questo tutorial.
Prima di iniziare a scrivere qualsiasi codice, dobbiamo creare un nuovo file per contenere il nostro JavaScript; lo chiameremo script.js e caricare il file nel documento prima del corpo
tag di chiusura.
Aggiungiamo il nostro primo pezzo di codice per modificare il titolo del documento e l'URL facendo clic sul menu di navigazione:
// 1. var $ wrap = $ ("#wrap"); // 2. $ wrap.on ("click", ".page-link", function (event) // 3. event.preventDefault (); // 4. if (window.location === this.href ) return; // 5. var pageTitle = (this.title)? this.title: this.textContent; pageTitle = (this.getAttribute ("rel") === "home")? pageTitle: pageTitle + " â € "Acme"; // 6. History.pushState (null, pageTitle, this.href););
Ho diviso il codice in diverse sezioni numerate. Ciò ti renderà più facile individuare il codice con il seguente riferimento:
, che avvolge tutto il contenuto del nostro sito.#wrap
elemento invece di allegare l'evento direttamente su ogni menu di navigazione. Questa pratica è conosciuta come delegazione di eventi. In altre parole, il nostro #wrap
l'elemento è responsabile dell'ascolto degli eventi click per conto di .Pagina-link
.event.preventDefault ()
in modo che gli utenti non vengano indirizzati alla pagina in questione.titolo della pagina
variabile contiene il formato del titolo, derivato dall'attributo titolo del collegamento o dal testo del collegamento. Segue il titolo di ogni pagina Pagina Titolo - Acme
convenzione, ad eccezione della pagina iniziale. "Acme" è il nostro nome fittizio.titolo della pagina
e l'URL della pagina su History.js pushState ()
metodo.A questo punto, quando clicchiamo sulla navigazione del menu, il titolo e l'URL dovrebbero cambiare di conseguenza come mostrato di seguito:
Il titolo della pagina e l'URL sono cambiatiEppure il contenuto della pagina rimane lo stesso! Non è aggiornato per abbinare il nuovo titolo e il nuovo URL.
Dobbiamo aggiungere le seguenti righe di codice per sostituire il contenuto effettivo della pagina.
// 1. History.Adapter.bind (window, "statechange", function () // 2. var state = History.getState (); // 3. $ .get (state.url, function (res) // 4. $ .each ($ (res), function (index, elem) if ($ wrap.selector! == "#" + elem.id) return; $ wrap.html ($ (elem) .html ()););););
Di nuovo, il codice qui è diviso in diverse sezioni numerate.
pushState ()
metodo e esegue la funzione allegata..ottenere()
metodo recuperiamo il contenuto dall'URL indicato.id
di nome avvolgere
dal contenuto recuperato e infine sostituire il contenuto della pagina corrente con esso.Una volta aggiunto, il contenuto dovrebbe essere aggiornato quando si fa clic sul menu di navigazione. Come accennato, siamo anche in grado di accedere alle pagine visitate avanti e indietro attraverso il browser Indietro e Inoltrare pulsanti.
Il nostro sito Web è presentabile a questo punto. Tuttavia, vorremmo fare un ulteriore passo avanti aggiungendo un po 'di animazione per dare vita alla pagina e, infine, il nostro sito web sembra più avvincente.
L'animazione in questa situazione deve essere semplice, quindi scriveremo tutto da zero, invece di caricare le animazioni attraverso una libreria come Animate.css, Motion UI di ZURB o Effeckt.css. Chiameremo l'animazione slideInUp
, come segue:
@keyframes slideInUp from transform: translate3d (0, 10px, 0); opacità: 0; a transform: translate3d (0, 0, 0); opacità: 1;
Come suggerisce il nome, l'animazione farà scorrere il contenuto della pagina dal basso verso l'alto insieme all'opacità dell'elemento. Applicare l'animazione all'elemento che avvolge il contenuto principale della pagina, come segue.
.sezione durata dell'animazione: .38s; animation-fill-mode: entrambi; nome-animazione: slideInUp;
La transizione da una pagina all'altra dovrebbe ora risultare più fluida una volta applicata l'animazione. Qui, puoi fermarti e chiamarlo un giorno! Il nostro sito Web è completo e siamo pronti a distribuirlo affinché il mondo possa vederlo.
Tuttavia, c'è ancora una cosa che potrebbe essere necessario aggiungere, specialmente per coloro che vogliono monitorare il numero di visite e il comportamento dei visitatori sul tuo sito web.
Dobbiamo aggiungere Google Analytics per tenerne traccia visualizzazione della pagina.
Poiché le nostre pagine verranno caricate in modo asincrono (tranne per il iniziale pagina caricata) il tracciamento del numero di visualizzazione della pagina dovrebbe essere eseguito in modo asincrono.
Per iniziare, assicurati di aver aggiunto Google Analytics standard nel documento capo
. Il codice di solito appare come segue:
Quindi dobbiamo modificare il nostro codice JavaScript per includere il codice di monitoraggio di Google Analytics in modo che ogni pagina caricata in modo asincrono venga misurata anche come visualizzazione della pagina.
Abbiamo diverse opzioni. Innanzitutto, possiamo iniziare a contare quando l'utente fa clic su un link di navigazione, o quando si modifica il titolo della pagina e l'URL, o quando il contenuto della pagina è stato completamente caricato.
Opteremo per quest'ultimo, che è probabilmente il più autentico, e così facendo sfruttiamo il jQuery promettere()
metodo dopo aver modificato il contenuto della pagina, come segue:
$ wrap.html ($ (elem) .html ()) .promise () .done (function (res) // Assicurati che il nuovo contenuto sia aggiunto, e che sia disponibile il metodo 'ga ()' if (typeof ga === "funzione" && res.length! == 0) ga ('set', pagina: window.location.pathname, titolo: state.title); ga ('invia', 'visualizzazione di pagina') ;);
Questo è tutto, ora avremo il visualizzazione della pagina registrato in Google Analytics.
In questo tutorial abbiamo migliorato un semplice sito Web statico con l'API della cronologia Web per rendere la transizione della pagina più fluida, il caricamento più veloce e, nel complesso, offrire un'esperienza migliore ai nostri utenti. Alla fine di questo tutorial, abbiamo anche implementato Google Analytics per registrare l'utente visualizzazione della pagina in modo asincrono. Inoltre, il nostro sito Web è perfettamente strisciare-able dai robot dei motori di ricerca poiché è, come detto, solo un semplice sito Web HTML.
Questo è stato un corposo tutorial, che spiega molte cose come CSS Animation, jQuery Ajax e jQuery Promise. Ecco una serie di riferimenti per te da esaminare, per rafforzare ciò che hai imparato.
Infine, non dimenticare di visitare il sito demo di questo tutorial e il codice sorgente nel repository.