In questo tutorial passeremo attraverso un metodo semplice ma efficace per la creazione di un menu off-canvas con HTML, CSS e JavaScript.
Per avere un'idea iniziale di ciò che costruiremo, dai un'occhiata alla relativa demo CodePen (controlla la versione più grande per un'esperienza migliore):
Nota: Questo tutorial non si focalizzerà su come rendere accessibile o reattivo il menu fuori-quadro, quindi quelli sarebbero sicuramente i prossimi passi validi.
Il nostro markup consiste di due elementi wrapper:
.top-banner
elemento.top-nav
elementoEcco il codice HTML:
Con la marcatura pronta, esaminiamo gli stili più importanti che sono richiesti per il nostro menu.
Nota: Per motivi di leggibilità, questo codice CSS non è ottimizzato: noterai proprietà duplicate che potresti voler eliminare nella tua versione.
Il .top-banner
l'elemento è simile a questo:
Per quanto riguarda i suoi stili, facciamo quanto segue:
.menù-wrapper
elemento.Ecco gli stili di cui avremo bisogno per ottenere tutto ciò:
.top-banner display: flex; larghezza: calc (100% - 150px); altezza: 100 vh; transform: translateX (150px); background: url (IMAGE_PATH) no-repeat center / fixed; .top-banner-overlay display: flex; direzione della flessione: colonna; justify-content: center; larghezza: 350 px; imbottitura: 20px; transizione: trasformare .7s; colore bianco; background: rgba (0, 0, 0, .7);
Il .top-nav
l'elemento è simile a questo:
In questo caso, faremo quanto segue:
.-Menù fisso
elemento..menù-wrapper
elemento per impostazione predefinita. Per fare ciò, non gli diamo un valore di proprietà come display: nessuno
. In effetti, usiamo il tradurre()
funzione per spostarlo di 200px a sinistra. Tieni presente che la larghezza dell'elemento è 350 px, quindi parte di essa è ancora all'interno del viewport. Tuttavia, non è visibile perché l'elemento è posizionato sotto il .-Menù fisso
elemento.Dai uno sguardo agli stili CSS corrispondenti di seguito:
.top-nav .menu-wrapper position: fixed; inizio: 0; a sinistra: 0; fondo: 0; larghezza: 350 px; imbottitura: 20px; transform: translateX (-200px); transizione: trasformare .7s; sfondo: # B1FFE5; .top-nav .menu-wrapper .menu opacità: 0; transizione: opacità .4s; .top-nav .fixed-menu position: fixed; inizio: 0; a sinistra: 0; fondo: 0; display: flex; direzione della flessione: colonna; larghezza: 150 px; imbottitura: 20px; sfondo: acquamarina;
A questo punto, utilizzeremo un semplice codice JavaScript per manipolare lo stato del menu fuori quadro.
Descriviamo le azioni necessarie:
.menu aperto
viene cliccato il pulsante, il menu dovrebbe apparire con un buon effetto slide-in e l'overlay dovrebbe essere spinto simultaneamente a destra. Opzionalmente, possiamo fare molte più cose durante questo stato. Nel nostro esempio, aggiungiamo un'ombra di casella al ::prima
pseudo-elemento dell'overlay e rivela l'elenco dei menu usando un effetto fade-in..menu vicino
viene cliccato il pulsante, il menu dovrebbe scomparire con un buon effetto slide-out e l'overlay dovrebbe essere spinto simultaneamente a sinistra.Ecco il codice JavaScript che implementa questo comportamento:
const menuOpen = document.querySelector (". top-nav .menu-open"); const menuClose = document.querySelector (". top-nav .menu-close"); const menuWrapper = document.querySelector (". top-nav .menu-wrapper"); const topBannerOverlay = document.querySelector (". top-banner-overlay"); function toggleMenu () menuOpen.addEventListener ("click", () => menuWrapper.classList.add ("is-opened"); topBannerOverlay.classList.add ("is-moved");); menuClose.addEventListener ("click", () => menuWrapper.classList.remove ("is-opened"); topBannerOverlay.classList.remove ("is-moved");); toggleMenu ();
E sotto troverai gli stili CSS associati:
.top-banner-overlay.is-moved transform: translateX (350px); .top-banner-overlay.is-move :: before content: "; position: absolute; top: 0; bottom: 0; right: 100%; width: 20px; box-shadow: 0 0 10px black; .top-nav .menu-wrapper.is-opened transform: translateX (150px); .top-nav .menu-wrapper.is-opened .menu opacità: 1; ritardo di transizione: .6s;
Questa demo funzionerà bene solo sui browser desktop. I dispositivi mobili richiedono un layout di pagina diverso, ma questo va oltre lo scopo di questo tutorial. Come al solito, usiamo Babel per compilare il codice ES6 fino a ES5.
L'unico piccolo problema che ho riscontrato durante il test è la modifica del rendering del testo che si verifica quando viene animato l'overlay. Anche se ho provato vari approcci proposti in diversi thread Stack Overflow, non sono riuscito a trovare una soluzione semplice per tutti i sistemi operativi e browser. Quindi tieni a mente che potresti vedere piccoli problemi di rendering dei caratteri mentre viene animato l'overlay.
Questo è tutto, gente! Siamo riusciti a creare un utile menu off-canvas con un codice relativamente semplice.
Spero che il risultato finale ti sia piaciuto e lo utilizzerai come fonte di ispirazione per la creazione di menu off-canvas ancora più potenti. E, naturalmente, se ne costruisci qualcuno, non dimenticare di condividerli con noi!