Come creare un menu css dropdown orizzontale di base
In questo tutorial, vediamo come creare un menu css dropdown orizzontale di base usando liste non ordinate e liste innestate.
Userò la proprietà css visibility per nascondere i sub item del menu e renderli visibile sullo stato :hover.
Il menu css funziona per i maggiori browser di recente edizione.
Alla fine dell’ articolo, spiegherò come farlo funzionare anche per Internet Explorer 6.
Inizio con la marcatura html di base che consista in una lista non ordinata contenendo lei stessa un’ altra lista per i sub elementi:
<div id=”menu”>
<ul>
<li><a href=”#nogo”>Link 1</a>
<ul>
<li><a href=”#nogo”>Link 1-1</a></li>
<li><a href=”#nogo”>Link 1-2</a></li>
<li><a href=”#nogo”>Link 1-3</a></li>
</ul>
</li>
<li><a href=”#nogo”>Link 2</a>
<ul>
<li><a href=”#nogo”>Link 2-1</a></li>
<li><a href=”#nogo”>Link 2-2</a></li>
<li><a href=”#nogo”>Link 2-3</a></li>
</ul>
</li>
<li><a href=”#nogo”>Link 3</a>
<ul>
<li><a href=”#nogo”>Link 3-1</a></li>
<li><a href=”#nogo”>Link 3-2</a></li>
<li><a href=”#nogo”>Link 3-3</a></li>
</ul>
</li>
</ul>
</div>
Nel seguente preview, possiamo vedere il nostro menu prima di applicare uno stile css :

Siccome i browsers hanno diversi modi di interpretare il margine (margin) e spazio ‘cuscinetto’ (padding), azzerò il tutto per il menu (#menu), ul (lista non ordinata) e li (item della lista).
Applico il float:left; per creare un menu orizzontale di base e la posizione relativa che ci permetterà di seguito di porre i sub elementi in modo assoluto. Tolgo anche la marcatura della lista con list-style:none;:
#menu{
padding:0;
maragin:0;
}
#menu ul{
padding:0;
margin:0;
}
#menu li{
position: relative;
display: left;
list-style: none;
margin: 0;
padding:0;
}
Il risultato fine adesso:

Posso adesso dare un pò di stile ai links:
- larghezza width:100px;
- altezza height:30px;
- dichiaro come blocco display:block;
- tolgo la sotto lineatura dei links text-decoration:none;
- allineo il testo sia orizzontalmente text-align: center; che verticalmente line-height:30px;
- colore di sfondo nero background-color:black; e un colore di testo bianco color:white;
#menu li a{
width:100px;
height: 30px;
display: block;
text-decoration:none;
text-align: center;
line-height: 30px;
background-color: black;
color: white;
}
Per avere un minimo d’effetto visivo, cambio il colore di sfondo (da nero a rosso) allo stato :hover del link contenuti negli items della lista (li):
#menu li a:hover{
background-color: red;
}
Dettaglio del risultato:

Adesso, posiziono i sub elementi:
Uso la proprietà css position:absolute; per rimuovere i ’sub’ ul del flusso della pagina, li sposto di 30px partendo dalla parte superiore in maniera che si ritrovano sotto
il primo elemento con top:30px; (30px essendo l’altezza impostata per prima)
#menu ul ul{
position: absolute;
top: 30px;
Il risultato:

Uso la proprietà css visibility:hidden; (visibilita nascosta) per nasconderli:
visibility: hidden;
}
Finalemente, finisco il nostro menu css dropdown, facendo il modo che on :hover, i ’sub’ ul sono visibile, cambiando semplicemente la sua proprietà visibility a visible (visibile) invece di hidden (nascosto):
#menu ul li:hover ul{
visibility:visible;
}
Il risultato finale dal vivo (passa sopra con il mouse):
Dopo avere provato questo menu css dropdown orizzontale di base con i maggiori browsers, funziona benissimo per IE7, Firefox, Opera e Safari.
Il problema trovato è con IE6.
Con Internet Explorer 6, non funziona proprio e lo stato :hover è ignorato.
Anche se personalmente, lo lascerei a perdere completamente, ancora tanti utenti lo usano per quello ho cercato una soluzione facile da implementare senza dovere modificare tutta la marcatura html e css.
Ho trovato una soluzione nel libro Eric Meyer on CSS che usa un file .htc creato da Peter Nederloff.
L’articolo è in inglese. In breve, IE6 non supporta il :hover su altri elementi che il tag <a>, il quale rende questo menu dropdown completamente inutile.
Pero IE supporta i cosi chiamati ‘behaviors’ (ignorati da FF e altri browsers ‘moderni’ ma per quelli il menu funziona com’ è).
Questo ‘behaviors’ permette di caricare un file tipo .htc che cambia il comportamento degli elementi a quali sono impostati lo stato :hover con l’uso d’ eventi onmouse.
Non sono programmatrice, per quello non mi sono messa a studiare il script incluso in questo file .htc che può essere scaricato gratuitamente dal sito di Peter Nederloff.
Ho usato la versione 2 del file .htc per il mio esempio (csshover2.htc).
Ritornando all’esempio, il file .htc che ci permetterà di fare funzionare questo menu anche per IE6 viene inserito nel foglio di stile all’ elemento body, in questa maniera;
body{
behavior: url(csshover2.htc);
}
PS: per utenti di IE6, questo file .htc non è applicato a l’esempio di sopra
Registrati al nostro Rss Feed e rimani sempre aggiornati con i nuovi articoli...















bello come menu! però mi potresti dire come faccio a centrarlo orizzontalmente nella pagina?
Ciao, dai una larghezza fissa al menu e imposta margin:auto; invece di margin:0;
Esempio:
#menu{
margin: auto;
padding:0;
width: 610px;
}
Carino e ben spiegato, però non sono riuscito ad adattarlo alla mia esigenza: 3 livelli.
voce1 voce2
s_voce1
s_voce2 -> s_s_voce1
E’ fattibile? avete un’idea o visto qualcosa da studiarci sopra?
Grazie.Paolo.
Ciao Paolo,
da provare:
<li><a href=”#nogo”>Link 1-1</a>
<ul><li><a href=”#”>Link1-1-1</a></li></ul>
</li>
Per il css:
nascondi la sub lista sul hover del item principale:
#esempio ul li:hover ul ul{
position: absolute;
top:0;
left:100px;
width: 100px;
visibility:hidden;
}
Rende il ul visibile sul stato hover del li:
#esempio ul ul li:hover ul{
visibility:visible;
}
La scheda esplicativa è in assoluto la migliore sino ad ora consultata.
Non essendo esperto, ho un problema col file csshover2 (utilizzo Explorer6). L’ho scaricato sul desktop, ma il menù mi dà: Errore nello scrippt di Internet Explorer -Access is denied to: file: ///C:/Documents and Settings/Administrator/Desktop/csshover2.htc.
Ti ringrazio se puoi darmi una mano per fare funzionare il menù
Ciao Vanni (ma sei il Vanni che conosco???)
ho provato io stesso il menu con IE6 in locale è non mi da nessun tipo di errore. Il tutto sta dentro una cartella, non sul desktop (non so se cambia qualche cosa).
Dal ‘access is denied’ sembra un problema di sicurezza. Puoi provarlo online?
Ciao, sto usando questo menu che trovo veramente fantastico. Io uso Firefox e provandolo con IE 6.0 mi sono accorto che non funziona. Dipendesse da me, data la considerazione che ho del browser MS, non mi importerebbe, ma come puoi immaginare, la maggior parte dell’utenza usa IE. Non mi è chiaro, nemmeno dal sito di Peter Nederloff, come modificare lo script per poter usare questo menu. Non esiste una descrizione più semplice e megli interpretabile e applicabile? Mi dispiacerebbe davvero dover abbandonare questo progetto. Grazie milla per il prezioso supporto
Buonasera Andrea,
altro scaricare il file .htc e aggiungere il
body{
behavior: url(csshover2.htc);
}
nel css c’è poco altro da fare.
Nota bene pero che non funzionerà se aggiunge il css direttamente nei tag style della pagina , deve essere messo dentro un css esterno.
Vedi se l’esempio online di questo tutorial ti funziona per IE6 (in fine pagina si trova):
http://www.onsitus.it/css-tutorials/css-dropdown-orizzontale/