I menu sono da sempre parte integrante e fondamentale delle pagine web. Con il passare degli anni e grazie alle moderne tecniche CSS e Javascript si è assistito ad un radicale cambiamento di questo componente verso una forma sempre più dinamica e flessibile.
In questo post ti spiego una tecnica molto semplice per realizzare un menu dropdown a tre livelli (ma potrebbero essere a due o più) con il solo uso dei fogli di stile CSS.

I menu a tendina (dropdown menu) imitano in un certo senso il comportamento del tag select (quello che viene spesso usato per inserire la nazione in una form).
Passiamo al codice…
L’unica pecca di questa tecnica, a cui rimedieremo in un post successivo, è la mancata compatibilità con Internet Explorer 6 il quale non supporto la proprietà hover per elementi che non siano i link.
per prima cosa vediamo la struttura dell’html. Si tratta di una semplice lista non numerata con 2 sotto livelli in html:

Senza applicare stili la resa di questo codice è la seguente:

Applichiamo ora il seguente CSS:
#menu{
padding:0;
maragin:0;
font-family:Verdana,Arial;
font-size:0.70em;
}
#menu ul{
padding:0;
margin:0;
}
#menu li{
position: relative;
float: left;
list-style: none;
margin: 0;
padding:0;
border-bottom: 1px solid #ddd;
border-left: 1px solid #ddd;
}
#menu li a{
width:150px;
height: 30px;
display: block;
text-decoration:none;
text-align: center;
line-height: 30px;
color: #333;
background: #EDEDED;
}
#menu li a:hover{
background: #CCC;
}
#menu ul ul{
position: absolute;
top: 30px;
visibility: hidden;
}
#menu ul li:hover ul {
visibility:visible;
}
#menu ul ul ul li {
visibility: hidden;
left:150px;
top:-30px;
}
#menu ul ul li:hover ul li {
visibility:visible;
}
facendo sapiente uso della proprietà Visibility e dell’attributo hover è possibile rendere visibili le liste in conseguenza al passaggio del mouse sulla lista superiore.
Il risultato che ne consegue è il seguente:

Questa soluzione è stata testata ed perfettamente compatibile con Internet Explorer (esclusa versione 6), Firefox, Safari e Chrome.
Potete scaricare il codice sorgente per esaminarlo da qui:
Webquadro CSS Dropdown Menu (download)
AGGIORNAMENTO
In risposta a Frulli aggiungo il CSS necessario per un ‘uteriore livello:
#menu ul ul ul ul li{
display:none;
left:150px;
top:-30px;
}
#menu ul ul ul li:hover ul li {
display:block;
}
In pratica non fai altro aggiungere un UL ogni volta che utilizzi un sottolivello.
Allego per completezza l’esempio aggiornato:
Webquadro CSS Dropdown Menu V2 (download)
Se stai cercando nuove risorse sui fogli di stile visita il canale CSS di webquadro o puoi abbonarti gratuitamente al feed RSS di webquadro per non perdere nemmeno un articolo.
Ecco una lista di altre risorse che potrebbero interessarti:





ciao, innanzitutto complimenti per il css,
fatto davvero bene!
stavo provando ad estenderlo per menu di 3° e 4° livello ma ho dei problemi con l’hover e le proprietà hidden e visible…
mi daresti una mano??
Grazie del commento frulli.
Visto che può essere utile ho aggiornato il post con un secondo esempio che fa uso di un ulteriore livello. Come vedi è molto semplice
Grazie mille, veramente molto utile!
Ciao
molto ben fatta questa lezioncina sui menu a discesa con i css.
Volevo chiederti…
Se io volessi implementarlo facendo aprire le sottovoci della voce “Menu 3-3″ alla sua sinistra anziche alla sua destra come si aprono ora che propietà nel css dovrei aggiungere o modificare?
grazie
simone
basta cambiare la proprietà left della lista interessata (#menu ul ul ul li) da 150px a -150px. Non ho fatto test di compatibilità cross browser ma sembra tenere.
Naturalmente la modifica va apportata anche nelle sottoliste.
ciao mi servirebbe estenderlo a un 5 livello….
ho messo un ul come hai detto ma continua a darmi visibile la tendina di 5 livello. allego il codice css
#menu ul ul ul ul ul li {
display:none;
left:152px;
top:-30px;
}
#menu ul ul ul ul ul li:hover li {
display:block;
}
ti metto il link al sito cosi vedi di che menù si tratta. grazie http://test.clcwebdesigner.it/tps/tecnofluid.html
ciao grazie per il css
stavo provando il menu e volevo far si che le tendine fossero semi trasparenti
mi daresti una mano???
grz
Ciao Flavio,
leggiti questo contenuto:
CSS Opacity
Tieni conto che IE lavora in modo diverso.
Ciao, scusa l’ignoranza, sto incominciando coi css, ma non capisco cosa significa:
#menu ul
cioè #menu crea un id di nome menu coi suoi parametri, ma ul?ù
Ciao grazie per la lezione, molto interessante
L’argomento è abbastanza esteso ma cerco di spiegarlo nel modo più semplice.
# è il selettore. Identifica un elemento in maniera univoca.
).
In questo caso l’elemento si chiama menu e può essere usato una sola volta.
UL sta per unordered list (lista non ordinata o elenco in wordese
Premesso questo…
con questa dichiarazione lo stile viene applicato a tutte le liste non ordinate incluse in un elemento che è stato dichiarato con id menu.
Ti consiglio comunque questa guida che chiarisce questi punti e anche molti altri:
Guida CSS di base
ok grazie più che esauriente.