Crea una fantastica navigazione animata con CSS e jQuery

L'animazione e il feedback visivo sono ottimi modi per assistere un utente nella navigazione e nell'interazione con un sito web. Mentre tradizionalmente Adobe Flash era il goto per qualsiasi cosa animata, in questi giorni con la magia di javascript possiamo evitare del tutto il Flash. Oggi costruiremo un fantastico menu di navigazione animata usando solo CSS e jQuery.

Demo e codice sorgente


Panoramica

Il menu che stiamo costruendo può essere visto nello screenshot qui sotto. Puoi anche vedere la versione finale funzionante qui.

Ho intenzione di rompere questo tutorial in cinque sezioni come segue:

  • Schizzo
  • Creare risorse
  • Scrivere l'HTML
  • Annotare il CSS
  • Creare l'animazione usando jQuery

Step 1: Rough Sketch

Prima di tutto vediamo cosa dobbiamo fare qui.

Quindi ecco un'idea approssimativa di cosa dovremmo fare:

  • Divideremo la pagina in 4 parti, intestazione, navigazione e intestazione del contenuto e il resto del contenuto
  • L'area dell'intestazione sarà semplice
    contenitore
  • L'area di navigazione sarà divisa in più parti
    contenitore che corrisponde alla voce di menu.
  • Ora la maggior parte delle volte usiamo

    • contenitore ma poiché ogni voce di menu è unica,
      Non vedo i vantaggi dell'uso
      • quindi userò
        contenitore invece.

      • Il contenuto sarà un semplice
        contenitore

      Quindi, per riassumere

       
      casa
      di
      Servizi
      soluzioni
      contatto

      Potrebbe aiutare a mostrare la struttura delle directory che sono. La struttura della directory è la seguente:

      Passaggio 2: risorse

      Presumo che tu abbia una conoscenza di base nel trattare con Photoshop, quindi non darò istruzioni troppo dettagliate sulla creazione delle risorse.
      Ci sono molte cose che dobbiamo creare.

      • Intestazione di fondo
      • Titolo del contenuto
      • Navigazione
      • Striscia di sfondo

      Si noti che se si desidera saltare questo passaggio è possibile scaricare il file zip completo dei file alla fine del tutorial ed estrarre le mie copie!

      Ok, creiamo lo sfondo dell'intestazione. Apri Photoshop e crea una tela di 1x180 px, oppure puoi ingrandirla e ritagliare l'immagine.
      Crea un livello e assegnagli un gradiente lineare con Preset in primo piano su Sfondo per 171 px, questo sarà il gradiente principale.
      Crea un altro livello e dargli un gradiente lineare con Preset in primo piano trasparente per circa 10px nella parte inferiore del primo livello per un effetto ombra.

      Ecco come dovrebbe essere, è 100x181 px che successivamente ritagliamo a 1x181 px.

      Salva questo come 'Hdr-bkg.png' nel nostro 'IMG' cartella.

      Successivamente, creeremo il titolo del contenuto. Ancora una volta, apri Photoshop e crea 934x284 px.
      Crea un rettangolo arrotondato usando lo strumento appropriato, seleziona la forma creata, crea un nuovo livello, aggiungi un gradiente e dona un po 'di ombra.
      Quindi avremo qualcosa di simile a questo:

      Salva questo come 'Content-title.png' nel 'IMG' cartella.

      Ora creiamo le risorse necessarie per la navigazione. Abbiamo bisogno di due set di navigazione e una scatola bianca.

      La scatola bianca è semplice. Basta creare un rettangolo arrotondato di circa 98 px x 58 px e dipingerlo con il bianco. Assicurati che lo sfondo sia trasparente.

      Salva questo come 'White.jpg' nel 'IMG' cartella.

      Per l'elemento di navigazione, apri Photoshop e crea un documento 490 x x 58 px.
      Crea un rettangolo arrotondato con circa 98 px x 58 px e inseriscici del testo. Avremo bisogno di due copie di ogni testo.
      Ho applicato una piccola ombra su ogni testo, ovviamente questo è facoltativo. Puoi scegliere i tuoi colori da mettere qui.

      Ora basta duplicare questo strato lungo la linea orizzontale. Applica colori e testo diversi.

      Salva questo come 'Nav.jpg' nel 'IMG' cartella.

      Infine, per la striscia di sfondo ho semplicemente usato uno strumento online chiamato Stripe Generator. L'output è simile a questo:

      Puoi vedere le mie impostazioni qui.
      Ovviamente potresti creare la striscia da solo in Photoshop, ma perché non usare invece un piccolo e semplice strumento web :-)

      Passaggio 3: codice HTML

      Ora buttiamo giù il nostro codice HTML.

         menu animato lucido           
      casa
      di
      Servizi
      soluzioni
      contatto

      Questo è molto pratico secondo la nostra gameplan spiegata al punto 1.

      Ho aggiunto un collegamento a un file 'main.css' che deve ancora essere creato e
      Ho anche aggiunto alcuni riferimenti ad alcuni file javascript. Poiché ogni elemento di navigazione è unico, ho assegnato a ciascun elemento un ID.
      Avremo ancora bisogno di uno stile comune per ciascuna voce del menu, questo renderà più facile per noi gestire lo stile nelle fasi successive.

      Avremo anche una casella bianca sopra ogni voce di navigazione, quando passiamo il mouse sopra il menu o una voce di menu viene selezionata, quindi avremo bisogno di un'altra

      contenitore per quello. L'HTML finale sarà simile a questo:

         menu animato lucido       
      casa
      di
      Servizi
      soluzioni
      contatto

      Salva questo come 'Index.html'. Fino a questo punto abbiamo questa come nostra pagina HTML:

      Passaggio 4: CSS

      Applichiamo uno stile di base alla pagina Web. Inizieremo definendo lo sfondo e aggiungendo un'area di intestazione.

      body background: url (... /img/body-bkg.jpg) scroll di ripetizione; margine: 0; padding: 0;  .containe r margin: 0pt auto; larghezza: 950 px;  #header background: url (... /img/hdr-bkg.jpg) scroll-x scroll; altezza: 181px; 

      Salva questo come 'Main.css' nel 'Css' cartella.

      Ora abbiamo qualcosa che assomiglia a:

      Ora aggiungiamo lo stile a ciascuna voce del menu. Ricorda che vogliamo la casella bianca nella parte superiore di ciascuna voce di menu,
      quindi la posizione deve essere impostata su assoluto. Aggiungi il seguente stile nel nostro file 'main.css'.

      #navigation height: 60px;  #home, #home div, #about, #about div, #services, #services div, #solutions, #solutions div, #contact, #contact div height: 80px; position: absolute; larghezza: 97px; float: sinistra;  #home, #about, #services, #solutions, #contact background-image: url (... /img/nav.jpg); background-attachment: scroll; background-repeat: no-repeat; top: 171px;  #home background-position: 0px -25px; margin-left: 6px;  #about background-position: -98px -25px; margin-left: 105px;  #services background-position: -196px -25px; margin-left: 204px;  #solutions background-position: -294px -25px; margin-left: 303px;  #contact background-position: -392px -25px; margin-left: 402px;  #home div, #about div, #services div, #solutions div, #contact div background-image: url (... /img/white.jpg); background-attachment: scroll; background-repeat: no-repeat; background-position: 0px -60px; 

      Ora abbiamo :

      Un problema, il link appare in cima alle voci del menu, rimuoviamolo con un enorme rientro del testo, eliminandolo efficacemente dallo schermo.
      Aggiungi questo al nostro foglio di stile.

      .pri-nav a display: block; text-decoration: none; text-trattino: -30000px; 

      Ora sarà simile a questo:

      Abbiamo ancora un problema, vorremmo che il menu di navigazione appaia sotto l'ombra dell'intestazione. Possiamo ottenere ciò modificando il nostro stile di intestazione.

      #header background: url (... /img/hdr-bkg.jpg) scroll-x scroll; altezza: 181px; position: absolute; z-index: 100; / * assicurati che l'intestazione sia sopra l'area di navigazione * / top: 0px; a sinistra: 0px; width: 100%; 

      Ora, dato che abbiamo usato un file .png con trasparenza, dovrebbe apparire così:

      Perfezionare! Aggiungiamo il contenuto in modo che possiamo ottenere il nostro script di animazione.

      .content margin-top: 160px;  # content-title background: url (... /img/content.jpg) scroll no-repeat; altezza: 323px; position: absolute; width: 100%; 

      Passaggio 5: script di animazione

      Per prima cosa scarica l'ultimo script jQuery e inseriscilo nel 'Js' cartella.

      L'animazione è fondamentalmente una manipolazione dello stile di posizione in background.
      Sfortunatamente jQuery ha un bug nell'animazione dello stile di posizione in background. Ma non preoccuparti! Alexander Farkas ha creato un plugin che risolve questo problema.
      Scarica il file e rinominalo jquery-bp.js e conservarlo nel 'Js' cartella.

      C'è qualcosa che dobbiamo capire prima di procedere. Cito dalla documentazione del plugin:

      A causa di alcuni bug del browser (ad esempio Firefox, devi impostare la tua posizione iniziale (iniziale) in linea:


      - Ovviamente puoi farlo anche con JavaScript (jQuery):
      $ ('# background'). css (backgroundPosition: '10px 20px');

      Va bene ora che lo capiamo, iniziamo. Imposteremo lo stile della posizione del backgroud per ogni oggetto all'inizio del nostro script.

      // id per ciascuna delle voci di menu var nav = ['#home', '#about', '#services', '#solutions', '#contact']; $ (document) .ready (function () setBkgPos ();); function setBkgPos () for (i = 0; i < nav.length; i++ ) $(nav[i]).css(backgroundPosition: i*(-98) + 'px -25px'); $(nav[i] + ' div').css( backgroundPosition: '0px -60px');  

      Salva questo come '' Navigation.js nel 'Js' cartella.

      Ora legheremo 3 eventi a ciascuna delle voci del menu. Possiamo farlo invocando la funzione bind.

      $ (document) .ready (function () setBkgPos (); // associa l'evento a funzionare qui per (i = 0; i < nav.length; i++ )  $(nav[i]).bind( 'mouseover', mMouseOver ); $(nav[i]).bind( 'mouseout', mMouseOut ); $(nav[i]).bind( 'click', mClick );  );

      Ogni volta che un utente passa sopra l'elemento di navigazione, il nostro script chiamerà la funzione 'mMouseOver'.
      Quando l'utente esce dall'elemento di navigazione, il nostro script chiamerà la funzione 'mMouseOut'.
      E quando l'utente fa clic sull'elemento di navigazione, il nostro script chiamerà la funzione 'mClick'.

      Passo 5.1: Mouse sopra

      Creiamo una "story board" per il nostro mouse sull'animazione.

      Su 'Mouse Over':

      • Cambia l'immagine del menu di navigazione (illuminazione) e cambia il cursore sul puntatore.
      • La navigazione si solleverà un po '.
      • La casella bianca si sposterà verso il basso.
      • La casella bianca e il menu di navigazione saranno entrambi in giù.
      • Il menu di navigazione e il riquadro bianco si sposteranno fino alla sua posizione finale.
      • E cambia l'immagine del menu di navigazione al suo stato originale.

      Okay aggiungiamo queste funzioni sotto lo script precedente:

      function _getHPos (id) for (i = 0; i < nav.length; i++ ) if ( '#' + id == nav[i] ) return i*(-98);   return 0;  function mMouseOver(e)  $(this) // stop any animation that took place before this .stop() // step 1. change the image file and change the cursor .css(backgroundImage: 'url('+site_url+'img/nav-over.jpg)',cursor: 'pointer') // step.2 move up the navigation item a bit .animate( backgroundPosition:'(' + _getHPos( this.id ) +'px -30px',"fast", // this section will be executed after the step.2 is done function() $(this) .children() // step. 3 move the white box down .animate(backgroundPosition:'(0px -40px)',20) // step 4. move the white box down .animate(backgroundPosition:'(0px -20px)',"fast"); $(this) // step 4. move the navigation item down .animate(backgroundPosition:'(' + _getHPos( this.id ) +'px 50px)',"fast") // step 5. move the navigation item to its final position .animate(backgroundPosition:'(' + _getHPos( this.id ) +'px 25px)',"fast"); // store the parent element id for later usage var parent = this; $(this) .children() // step 5. move the white box to its final position .animate( backgroundPosition:'(0px -45px)',"fast", // this section will be executed after the step.2 is done function() // step.6 change the image to its original image $(parent).css(backgroundImage: 'url(img/nav.jpg)'); ); ); 

      Devo spiegare diverse cose qui:

      1. Il comando _getHPos viene utilizzato per regolare la navigazione della posizione dello sfondo orizzontale per ciascun elemento.
        Ad esempio, lo sfondo dell'elemento "Inizio" inizierà da 0, la posizione dello sfondo orizzontale "Informazioni" inizia da -98 px e così via.
      2. Notate anche che all'inizio della funzione invochiamo la funzione 'stop'. Lo facciamo per garantire che l'animazione sia in esecuzione prima che l'evento "mouse over" si sia arrestato.
        Perché? In seguito aggiungeremo un'altra animazione per l'evento "mouse out".
        Ora supponiamo che l'utente passi con il mouse su un oggetto e poi sposta rapidamente il puntatore del mouse in un'altra posizione e di nuovo rapidamente passa il mouse sopra lo stesso oggetto.
        Se non interrompiamo l'animazione prima di ogni evento, ci sarà un ritardo perché una parte dell'animazione verrà accodata o, peggio ancora, l'animazione diventerà incoerente e infastidirà l'utente.

      Passaggio 5.2: Mouse fuori

      Ora è fatto. Creiamo "story board" per l'evento "mouse out"

      Su 'Mouse Out':

      • Sposta giù la voce di navigazione.
      • Sposta la scatola bianca verso il basso.
      • Sposta la navigazione verso l'alto.
      • Sposta l'elemento di navigazione nella sua posizione originale.
      • Sposta il riquadro bianco nella sua posizione originale (invisibile).
      • Ritorna il cursore alla normalità.

      Il codice:

      function mMouseOut (e) $ (this) // interrompe qualsiasi animazione che abbia avuto luogo prima di questo .stop () // step.1 sposta in giù l'elemento di navigazione .animate (backgroundPosition: '(' + _getHPos (this.id) + 'px 40px)', "fast", // questa sezione verrà eseguita dopo che il passaggio 1 è stato eseguito function () // step.2 white box move veramente fast $ (this) .children (). animate ( backgroundPosition: '(0px 70px)', "veloce"); // passaggio 3. sposta l'elemento di navigazione su $ (this) .animate (backgroundPosition: '(' + _getHPos (this.id) + 'px -40px ) ', "veloce", // questa sezione sarà eseguita dopo che il punto 3 è stato eseguito function () // step 4. sposta l'oggetto di navigazione nella sua posizione originale $ (this) .animate (backgroundPosition:' ( '+ _getHPos (this.id) +' px -25px) ', "fast", // questa sezione sarà eseguita dopo che il punto 4 è stato eseguito function () // sposta la casella bianca nella sua posizione originale, pronta per la prossima animazione $ (this) .children (). css (backgroundPosition: '0px -60px');))) .css (backgroundImage: 'url (img / nav.jpg)', cursore: ");

      Passaggio 5.3: Fare clic

      Quasi lì! Ora dobbiamo gestire quando un utente fa clic sull'elemento di navigazione.

      function mClick (e) location.href = this.id; 

      Ovviamente puoi indicare dovunque ti trovi in ​​questa posizione. Questa particolare funzione indirizzerà il tuo browser a [current_url] / [navigation_id] così per 'home' sarà '[current_url] / home', per 'about' sarà '[current_url] / about' e così via.

      Passaggio 5.4: Indicatore della pagina corrente

      Certo, abbiamo bisogno di un indicatore quando siamo già su una pagina. Per questo abbiamo bisogno di un'altra classe CSS.
      Chiameremo quella classe 'attiva'. Ad esempio, se ora siamo a "casa", il file HTML diventerà:

      casa

      O se siamo a "circa" diventerà:

      di

      e così via.

      Quindi ora l'idea è che dopo che una pagina è stata caricata, il nostro script controllerà per vedere quale elemento di navigazione ha la classe 'attiva'.
      Applichiamo quindi un effetto di animazione. E dobbiamo assicurarci che ogni altro evento ('mouseover', 'mouseout', 'click') non causerà alcun effetto di animazione su questo oggetto 'attivo'.

      Per questo abbiamo bisogno di cambiare il nostro codice un po '. Ecco il codice completo dopo le modifiche:

      var site_url = "; var nav = ['#home', '#about', '#services', '#solutions', '#contact']; $ (document) .ready (function () setBkgPos (); per (i = 0; i < nav.length; i++ )  $(nav[i]).bind( 'mouseover', mMouseOver ); $(nav[i]).bind( 'mouseout', mMouseOut ); $(nav[i]).bind( 'click', mClick );  for ( i = 0; i < nav.length; i++ )  // element with 'active' class will start animation if ( $(nav[i]).get(0).className.indexOf('active') >= 0) $ (nav [i]) .animate (backgroundPosition: '(' + _getHPos (nav [i]) + 'px -30px', "fast", function () $ (this). children () .animate (backgroundPosition: '(0px -40px)', 20) .animate (backgroundPosition: '(0px -20px)', "fast"); $ (this) .animate (backgroundPosition: '(' + _getHPos (nav [i]) + 'px 50px)', "fast") .animate (backgroundPosition: '(' + _getHPos (nav [i]) + 'px 25px)', "veloce "); var parent = this; $ (this) .children () .animate (backgroundPosition: '(0px -45px)'," fast ", function () $ (parent) .animate (backgroundPosition: ' ('+ _getHPos (parent.id) +' px 25px) ', "fast"); $ (parent) .css (backgroundImage:' url (img / nav.jpg) '););) ; rompere;   );

      Finito!

      E con questo abbiamo tutto il nostro piccolo menu.

      Scarica una ZIP del sito

      Visualizza una demo!