Creazione di un menu a discesa per pagine mobili

Questo tutorial ti insegnerà come creare e animare un'icona del menu di un hamburger e quindi collegare un listener di eventi tramite jQuery per attivare un menu a discesa.

Userò Jade (Pug) e Sass invece di vaniglia HTML e CSS. Quindi dovresti almeno avere una conoscenza di base di questi motori di modelli.

Creazione del campo da giuoco

Inizieremo con l'implementazione di un semplice parco giochi. Fornirò il modello Jade solo con lo stile Sass, dal momento che questo non è lo scopo del tutorial. Puoi prenderlo e usarlo o puoi inventare il tuo design.

File di giada:

body #container #header #body .content .left .right - for (i = 1; i <= 5 ; i++ ) div( + i ) .content .left .right - for (j=6; j <= 10 ; j++ ) div( + j ) .content .left .right - for (k=11; k <= 15 ; k++ ) div( + k )

File Sass:

= display flex (): display -webkit-box: -moz-box display: -ms-flexbox display: -webkit-flex display: flex = transition ($ time) -webkit-transition: all $ time ease -moz-transition : all $ time ease -ms-transition: tutto $ time ease -o-transition: tutto $ time ease transition: all $ time ease html, body margin: 0 padding: 20px 0 + flex () justify-content: center // ---------------------------------- // larghezza #container: 320px altezza: 550px background-color: #ebebeb overflow: nascosto altezza #header: 45px background-color: # 9b9b9b posizione: relativa #body padding: 0 20px padding-top: 40px + flex () flex-direction: colonna justify-content: flex-start .content + flex () flex-direction: riga justify-content: flex-start margin-bottom: 25px. larghezza: 100px height: 100px margin-right: 15px background-color: # e1e1e1 .right @for $ i da 1 a 15 # text #  $ i margin-top: 10px width: 50 + random (100) + px height: 10px background-color: # e1e1e1

Nota: qui ho creato due mixin chiamati fletteretransizione. I missaggi semplificano il riutilizzo di alcune regole CSS raggruppandole. Ogni volta che ho bisogno di aggiungere Display: flettere con tutti i prefissi dei fornitori, posso solo usare +flettere() invece, grazie al mixin.

Useremo questa struttura e costruiremo su di essa per il resto del tutorial.

Il risultato finale dovrebbe assomigliare a questo:

Visualizza il codice corrente

Icona del menu di hamburger

Ora è il momento di creare un menu hamburger semplice ma attraente e animarlo attraverso i CSS.

Aggiungi un nuovo div all'interno #intestazione e nominalo #Hamburger. Quindi crea due bambini div all'interno #Hamburger. Dovrebbero avere una classe comune e ID individuali.

#hamburger .strip # top .strip # bottom

Ora dobbiamo dare uno stile al genitore #Hamburger div e i bambini div con la classe comune di .striscia.

#hamburger height: 100% width: 45 + flex () flex-direction: colonna justify-content: space-between padding-left: 20px

Impostiamo l'altezza del div uguale alla sua div genitrice, che è #intestazione, definendo il altezza: 100%. Inoltre, impostiamo un valore di larghezza per questo div padre, che definirà la sua regione "cliccabile".

Successivamente, aggiungiamo flexbox con tutti i prefissi dei fornitori utilizzando i mixin, che abbiamo creato in precedenza.

Dal momento che vogliamo il nostro .striscia divs per essere posizionati verticalmente, abbiamo impostato direzione della flessione: colonna e quindi usare justify-content: space-between al fine di mettere lo spazio tra il .striscia div.

Quindi dobbiamo spingere questi div uno verso l'altro aggiungendo il fondo e il pad superiore ai rispettivi div.

#top margin-top: 17px #bottom margin-bottom: 17px

Abbiamo anche aggiunto padding-left: 20px per spostare il .striscia si tuffa ulteriormente a destra.

La prossima cosa è modellare le strisce. Questo è relativamente facile semplicemente definendo la dimensione e il colore delle div.

.larghezza della striscia: 25px altezza: 2px background-color: #ffffff

Il risultato finale con l'icona del menu dell'hamburger dovrebbe essere simile a questo:

La prossima cosa è animare l'icona del menu in modo che quando viene cliccato, dovrebbe animare in un segno incrociato.

Animare l'icona del menu Hamburger

A questo punto, useremo jQuery di base per attivare alcune classi CSS.

Iniziamo con la creazione delle classi CSS da attivare.

Utilizzeremo le impostazioni di traduzione e rotazione di trasformare proprietà dei CSS insieme a transizione proprietà.

Innanzitutto, aggiungi le transizioni a entrambi #superiore#parte inferiore div usando mixin con un parametro temporale specifico.

#top margin-top: 17px + transition (.25s) #bottom margin-bottom: 17px + transition (.25s)

Ora dobbiamo definire lo stile delle classi da attivare.

Roteremo e tradurremo ciascuno .striscia div individualmente, quindi abbiamo bisogno di attivare diverse classi sia per il #superiore#parte inferiore div.

#top margin-top: 17px + transition (.25s) & .topRotate transform-origin: center transform: translateY (4px) rotateZ (45deg) #bottom margin-bottom: 17px + transition (.25s) e .bottomRotate transform-origin : center transform: translateY (-5px) rotateZ (-45deg)

Qui abbiamo definito lo stile per due classi diverse nominate .bottomRotate.topRotate, che verranno aggiunti e rimossi dalle rispettive div di riferimento, #superiore#parte inferiore.

Si noti che il diverso dimensionamento del .striscia la classe risulterebbe in un bisogno di diverso translateYrotateZ valori per animare in un vero segno incrociato.

Cambio di classe con jQuery

Abbiamo definito come ciascuno .striscia div si animerà quando il topRotatebottomRotate le classi sono presenti Tuttavia, dobbiamo ancora associare un listener di eventi per attivare tali classi.

Creare un nuovo file JavaScript e utilizzare il seguente codice per alternare il topRotatebottomRotate classi di immersioni con #superiore#parte inferiore ID rispettivamente.

$ (document) .ready (function () $ ("# hamburger"). click (function () $ ("# top"). toggleClass ("topRotate"); $ ("# bottom"). toggleClass ( "bottomRotate"););)

Abbiamo inserito tutto il nostro codice $ (Document) .ready (function () ) per aspettare che l'intera pagina venga caricata prima di intraprendere qualsiasi azione. 

Quando clicchiamo sul #Hamburger div, alternerà le classi per le div con ID specifici.

Nota: non dimenticare di aggiungere il file sorgente jQuery nel progetto.

Visualizza il codice corrente

Creare la lista dei menu

Il prossimo passo è creare un menu con voci di elenco.

Usa la seguente struttura sotto il #intestazione:

#dropDown #background ul li Home li Blog li Progetti li Autori li Jobs li Contatti

Quindi qui abbiamo usato il ul tag come genitore per raggruppare gli oggetti con Li tag come bambini. Inoltre, al fine di creare un'animazione in background in espansione, abbiamo aggiunto anche un div con l'ID di #sfondo.

Diamo uno stile al ulLi elementi prima.

ul stile elenco: nessuna spaziatura: 0 margine: 0

Impostare il list-stylenessuna al fine di rimuovere i proiettili dal ul elementi e anche impostare entrambi imbottituramargine a 0 per rimuovere tutti i valori predefiniti.

Adesso stile lo Li elementi:

li // display: none background-color: # 9b9b9b color: #ffffff font-family: 'Quicksand', sans-serif font-weight: più leggero font-size: 15px padding: 20px padding-left: 60px &: after position: contenuto assoluto: "left: 60px width: 60% height: 1px bottom: 4px background: rgba (255, 255, 255, 0.25) e: last-child: after width: 0

Qui ho commentato il display: none per poter vedere il risultato. Tuttavia, durante l'animazione, lo useremo per nascondere inizialmente gli elementi della lista.

Ho anche aggiunto il dopo pseudo-elemento e lo styled di conseguenza per separare ciascuno Li elemento con una linea retta. : Last-child: dopo rimuove questa linea per l'ultimo Li elemento.

Visualizza il codice corrente 

Animare la lista dei menu

Ora useremo alcune direttive di controllo Sass per aggiungere animazioni keyframe CSS con attributi diversi a ciascuna Li elemento.

@keyframes drop 0% opacity: 0 transform: scale (1.3) 100% opacity: 1 transform: scale (1) @keyframes fold 0% opacity: 1 transform: scale (1) 100% opacità: 0 transform: scale (0.7)

Qui abbiamo definito le animazioni dei fotogrammi chiave far caderepiegare.

far cadere è per animare l'apertura della lista dei menu. Il ridimensionamento iniziale è del 30% in più e ridimensiona alla dimensione originale mentre la trasparenza passa da 0 a 1. L'azione opposta si svolge in piegare.

Ora dobbiamo attaccare quei fotogrammi chiave a Li elementi. Questa parte è dove il Sass è utile.

@for $ i da 1 a 6 li: nth-child (# $ i) animazione: nome: fold durata: 80ms * (6- $ i) + 1ms timing-function: modalità fill-in-out facilitato: inoltra li.anim: nth-child (# $ i) animazione: name: drop durata: 100ms * $ i timing-function: easy-in-out fill-mode: forward

Qui ho usato un per ciclo che va da 1 a 6 con l'indice di $ i.

Ora dobbiamo usare questo indice per allegare ogni animazione a Li elementi con durate diverse.

Innanzitutto, considera il li.anim: nth-child (# $ i) linea.

Qui stiamo afferrando il $ ifiglio del Li elemento con classe di anim.

Lo cambieremo anim classe. Quindi, quando viene aggiunto a Li elementi, l'animazione del fotogramma chiave con il nome di far cadere agirà. Quando viene rimosso, il piegare l'animazione prenderà provvedimenti.

La prossima cosa importante è la durata attributo.

durata: 100 ms * $ i per il far cadere l'animazione sta estendendo la durata dell'animazione per ogni numero di bambino incrementale. Quindi, quando questo codice è compilato, il primo Li il bambino avrà durata: 100ms, e l'ultimo bambino avrà durata: 600ms.

Questo darà il senso di animare ogni elemento uno dopo l'altro.

Facciamo la stessa cosa per il piegare animazione. Questa volta, l'ultimo elemento dovrebbe essere animato più velocemente, quindi durata: 80 ms * (6- $ i) + 1 ms. L'1ms aggiunto alla durata è dovuto al fatto che quando si imposta la durata su 0, è probabile che si verifichino alcuni problemi e l'animazione potrebbe non funzionare correttamente.

Quando stavamo disegnando il Li elemento, ho detto che dovevamo usare display: none per evitare giochi di animazione indesiderati. Se non lo si imposta nessuna, vedrai che il piegare l'animazione viene riprodotta una volta quando viene caricata la pagina.

Se impostiamo il display proprietà a nessuna, non lo vedremo, e quindi dovremo farlo mostrare il Li elemento prima di attivare il anim classe.

Vogliamo che le animazioni vengano riprodotte quando facciamo clic sull'icona dell'hamburger. Quindi usiamo alcuni jQuery per impostare il display proprietà di ciascuno Li articolo a bloccare e anche attivare il anim classe.

$ (document) .ready (function () $ ("# hamburger"). click (function () $ ("# top"). toggleClass ("topRotate"); $ ("# bottom"). toggleClass ( "bottomRotate"); $ ("li"). show (); $ ("li"). toggleClass ("anim"););)

Visualizza il codice corrente

Noterai che possiamo vedere l'animazione di ciascuno Li elemento individualmente. Tuttavia, preferiremmo avere una sensazione di menu in espansione.

Per risolvere ciò, abbiamo semplicemente bisogno di espandere l'altezza di un div. Quel div è #sfondo, che inizialmente abbiamo aggiunto durante la creazione di ulLi elementi.

Larghezza #background: 100% altezza: 0 colore di sfondo: posizione # 9b9b9b: assoluta + transizione (.45s) e altezza .expand: 550px

Attiveremo il espandere classe per impostare il altezza attribuire a 550px entro .45s. Nota che ho usato il transizione mixin per definire la transizione con un parametro temporale specifico.

Risultato finale 

Conclusione

Nel corso di questo tutorial, ci siamo esercitati su come utilizzare i loop all'interno di HTML e CSS attraverso i motori di template di Jade e Sass. Inoltre, abbiamo creato animazioni di fotogrammi chiave CSS e le abbiamo associate con attributi di durata diversi a specifici elementi HTML. Quindi abbiamo attivato le classi con jQuery per controllare quelle animazioni.