Alla fine di questa lezione la navbar desktop statica della Parte 1 diventa un sistema di navigazione pienamente responsive che funziona su tablet, landscape e portrait — menu mobile incluso. Debug del layout strada facendo e approfondimento su unità e quirk che rendono i menu mobile davvero difficili: vh contro dvh, il comportamento dello stato aperto di Webflow e il wrap del flex.
Due problemi valgono da soli l’intera lezione. Il primo è il bug dell’altezza mobile: un menu dimensionato con 100vh viene tagliato dalle barre del browser del telefono. Il secondo è il trucco per “spingere un gruppo in fondo” che misteriosamente smette di funzionare quando il menu si apre. Entrambi hanno soluzioni pulite una volta capito cosa succede davvero.
Chiudiamo con un tocco professionale: poche righe di CSS che bloccano lo scroll della pagina mentre il menu è aperto, così niente si sposta sullo sfondo.
Come funziona
Il bug dell’altezza mobile è il titolo. Vogliamo che il nav menu aperto riempia lo schermo sotto la navbar, quindi l’istinto è calc(100vh - altezzaNavbar). Ma 100vh misura il viewport ignorando la barra indirizzo e la barra di navigazione inferiore del browser mobile, quindi prima di scrollare il fondo del menu resta nascosto dietro. La soluzione è dvh (dynamic viewport height): segue l’area davvero visibile e si aggiorna dal vivo mentre quelle barre appaiono e spariscono. Cambia l’altezza in calc(100dvh - altezzaNavbar) e il menu non viene mai tagliato. (Attenzione ai valori ereditati — se hai duplicato la classe del nav menu su un wrapper interno, resetta l’altezza nel punto giusto.)
Il trucco del gruppo in fondo richiede un workaround. Per fissare il gruppo di pulsanti secondari in fondo al menu, normalmente gli daresti margin-top: auto in una colonna flex. Ma quando il menu è aperto, Webflow forza il nav menu a display: block, quindi non è un vero flex container e l’auto-margin non ha nulla contro cui spingere. La soluzione: avvolgi il contenuto del menu in un div interno, sposta il layout flex (display: flex, direzione, gap, sizing) su quel wrapper e lascia il nav menu esterno solo a tenere la sua dimensione. Poiché aggiungere un wrapper è un cambio strutturale, tocca ogni breakpoint — quindi riporti gli stili e ricontrolli che il desktop sia ancora a posto.
Il wrap del flex ha un tranello. Attivare flex-wrap sembra non fare nulla quando i figli sono impostati su grow if possible, perché preferiscono restringersi piuttosto che scendere a capo. Passali a shrink if needed (o imposta valori flex-grow espliciti) e vanno a capo come previsto — es. due pulsanti su una riga, la CTA su quella dopo.
Il blocco dello scroll è minimo. Poche righe di CSS mettono il body su overflow: hidden mentre il menu è aperto, congelando la pagina dietro. Niente JavaScript. Mettile nel custom code dell’head (così valgono ovunque) o, se la navbar è un componente, in un embed dentro il componente.
Come si usa
- Riposiziona il menu button. Dagli una classe e spingilo a destra con
margin-left: auto. Duplica il link “contact sales” fuori dal menu, nascondilo su desktop con una combo classcc-mobilee mostralo da tablet in giù. - Sistema lo stato aperto. Il menu button cambia colore quando è aperto; seleziona il suo stato open e imposta lo sfondo trasparente e il colore dell’icona sulla tua variabile scura così coincide con lo stato chiuso.
- Dimensiona il menu correttamente. Imposta l’altezza del nav menu su
calc(100dvh - <altezzaNavbar>rem)(calcola l’altezza della navbar dal padding + line-height del link). Dagli lo sfondo giusto. - Vai verticale. Imposta il gruppo di link primario come colonna flex verticale,
align: stretchcosì gli item riempiono la larghezza, passa i dropdown adisplay: blocke allinea a sinistra il testo. Sposta la freccia del dropdown a destra conjustify-content: space-between; aggiungi padding orizzontale e bordi tra gli item (trasparente sull’ultimo con una combocc-last). - Gruppo in fondo + il fix del wrapper. Aggiungi un
navbar_nav-menu-inner-wrapperattorno al contenuto del menu, sposta gli stili flex su di esso (direzione colonna) e dai al gruppo secondariomargin-top: autoper farlo stare in fondo. - Wrap sugli schermi piccoli. In landscape/portrait, attiva
flex-wrapsul gruppo pulsanti e imposta i pulsanti sushrink if needed/flex-grow: 1esplicito così si dispongono in modo pulito su più righe. - Togli l’hover. Rimuovi le transizioni hover, gli underline box-shadow e i cambi di colore aggiunti per il desktop — non c’entrano nel touch.
- Blocca lo scroll. Aggiungi lo snippet CSS che mette
body { overflow: hidden }mentre il menu è aperto (custom code dell’head o un embed nella navbar), pubblica e testa su un dispositivo reale.
Prossimo episodio: costruire il mega menu desktop vero e proprio.