Come posso allineare al centro il menu <UL> orizzontale?


148

Devo allineare al centro un menu orizzontale.
Ho provato varie soluzioni, incluso il mix di inline-block/ block/ center-alignecc., Ma non ci sono riuscito.

Ecco il mio codice:

<div class="topmenu-design">
    <!-- Top menu content: START -->
    <ul id="topmenu firstlevel">                                                                                       
      <li class="firstli" id="node_id_64"><div><a href="#"><span>Om kampanjen</span></a></div></li>
      <li id="node_id_65"><div><a href="#"><span>Fakta om inneklima</span></a></div></li>
      <li class="lastli" id="node_id_66"><div><a href="#"><span>Statistikk</span></a></div></li>
    </ul>
    <!-- Top menu content: END -->
</div>

AGGIORNARE

So allineare al centro l' ulinterno div. Ciò può essere realizzato usando il suggerimento di Sarfraz. Ma gli elementi dell'elenco vengono comunque spostati a sinistra all'interno di ul.

Ho bisogno di Javascript per raggiungere questo obiettivo?


Centrare il testo in ogni LI o centrare l'UL all'interno del DIV?
Joop,

Risposte:


130

Da http://pmob.co.uk/pob/centred-float.htm :

La premessa è semplice e fondamentalmente implica solo un involucro float senza larghezza che viene spostato a sinistra e quindi spostato dallo schermo alla posizione di larghezza sinistra: relativo; sinistra: -50%. Successivamente l'elemento interno nidificato viene invertito e viene applicata una posizione relativa di + 50%. Ciò ha l'effetto di posizionare l'elemento morto al centro. Il posizionamento relativo mantiene il flusso e consente agli altri contenuti di fluire al di sotto.

Codice

#buttons{
    float:right;
    position:relative;
    left:-50%;
    text-align:left;
}
#buttons ul{
    list-style:none;
    position:relative;
    left:50%;
}

#buttons li{float:left;position:relative;}/* ie needs position:relative here*/

#buttons a{
    text-decoration:none;
    margin:10px;
    background:red;
    float:left;
    border:2px outset blue;
    color:#fff;
    padding:2px 5px;
    text-align:center;
    white-space:nowrap;
}
#buttons a:hover{ border:2px inset blue;color:red;background:#f2f2f2;}
#content{overflow:hidden}/* hide horizontal scrollbar*/
<div id="buttons">
    <ul>
        <li><a href="#">Button 1</a></li>
        <li><a href="#">Button 2's a bit longer</a></li>
        <li><a href="#">Butt 3</a></li>
        <li><a href="#">Button 4</a></li>
    </ul>
</div>


9
Potresti per favore aggiungere un po 'di codice o contesto a questa risposta per prevenire la putrefazione dei link?
Nightfirecat,

La soluzione funziona alla grande e mi dispiace chiederlo dopo così tanto tempo, ma se avessi un css drop down? Non posso usare l'overflow: nascosto nel genitore allora. Ma continuerà a traboccare come qui: homeafrika.com .
Samia Ruponti,

In realtà non vedi alcun overflow su quel sito. Non sono sicuro che sia necessario l'overflow: nascosto; bit comunque, sebbene dato che è per overflow orizzontale, puoi sempre provare overflow-x: hidden; anziché. webchat.freenode.net/?nick=oerflowono&channels=#we website per assistenza in tempo reale.
reisio,

1
La soluzione centra bene il menu, ma se hai dei sottomenu che dovrebbero aprirsi in una certa posizione fissa al passaggio del mouse, sei condannato poiché il position: relativemenu principale cambia il comportamento del position:absolutemenu secondario.
cweiske,

1
@reisio Dov'è l' #buttonsID nella domanda di OP? Dove c'è avviso, nella tua risposta, che deve usarlo? Come può essere accettata e la risposta più votata, se in realtà non stai rispondendo alla domanda, citando solo alcuni blah-blah fuori tema da qualche link?
trejder

90

Questo funziona per me. Se non ho frainteso la tua domanda, potresti provarla.

    div#centerDiv {
        width: 100%;
        text-align: center;
        border: 1px solid red;
    }
    ul.centerUL {
        margin: 2px auto;
        line-height: 1.4;
        padding-left: 0;
    }
    .centerUL li {
        display: inline;
        text-align: center;
    }
<div id="centerDiv">
    <ul class="centerUL">
        <li><a href="http://www.amazon.com">Amazon 1</a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com">Amazon 2</a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com">Amazon 3</a></li>
    </ul>
</div>


2
d'accordo con @cweiske. Semplicemente usando un text-align: al centro del div contenitore ho risolto il problema per me
Kim Stacks

Devi solo assicurarti che qualsiasi testo all'interno ottenga untext-align: left;
Juan Mendes,

È adorabile! Ma l'ul ha un'imbottitura predefinita a sinistra, il che significa che il menu è spostato a destra del centro. Dovrai rimuovere il padding predefinito da ul con padding-left: 0;
Iterative Gypsy,

1
Perfettamente una risposta migliore della soluzione accettata, l'uso del display: inline fa il trucco. non usare float, è troppo complicato. Grazie per gli approfondimenti @Robusto
Clain Dsilva,

il centro di allineamento del testo in li non è necessario
Aminah Nuraini,

75

Con flexbox CSS3. Semplice.

ul {
  display: flex;
  justify-content: center;
}

ul li {
  padding: 0 8px;
}

6
Consiglio vivamente questo metodo
caras,

1
Anch'io consiglierei questo metodo sulla risposta scelta.
mickburkejnr,

Ti possiedo una birra!
Suyash Dixit,

Devo dire che non ho mai usato il flex prima di giustificare il contenuto. Risposta eccellente
Gman,

Grande risposta Beero
Ilyas karim il

20

Questo è il modo più semplice che ho trovato. Ho usato il tuo HTML. Il riempimento serve solo per ripristinare le impostazioni predefinite del browser.

ul {
  text-align: center;
  padding: 0;
}
li {
  display: inline-block;
}
<div class="topmenu-design">
  <!-- Top menu content: START -->
  <ul id="topmenu firstlevel">
    <li class="firstli" id="node_id_64">
      <div><a href="#"><span>Om kampanjen</span></a>
      </div>
    </li>
    <li id="node_id_65">
      <div><a href="#"><span>Fakta om inneklima</span></a>
      </div>
    </li>
    <li class="lastli" id="node_id_66">
      <div><a href="#"><span>Statistikk</span></a>
      </div>
    </li>
  </ul>
  <!-- Top menu content: END -->
</div>



2

Prova questo:

div.topmenu-design ul
{
  display:block;
  width:600px; /* or whatever width value */
  margin:0px auto;
}

1
Questo funziona per centrare l'UL. Ma <LI> è ancora galleggiante a sinistra. Voglio che <LI> sia centrato all'interno di <UL>. È possibile?
Steven,

2

Fai cosi :

   <div id="footer">
        <ul>
            <li><a href="/1.html">Link 1</a></li>
            <li><a href="/2.html">Link 2</a></li>
            <li><a href="/3.html">Link 3</a></li>
            <li><a href="/4.html">Link 4</a></li>
            <li><a href="/5.html">Link 5</a></li>
        </ul>
   </div>

E il CSS:

#footer {
    background-color:#ccc;
    height:39px;
    line-height:36px;
    margin:0 auto;
    text-align:center;
    width:950px;
}

#footer ul li {
    display:inline;
    font-family:Arial,sans-serif;
    font-size:1em;
    padding:0 2px;
    text-decoration:none;
}

2

Come molti di voi, ho lottato con questo per un po '. Alla fine la soluzione aveva a che fare con il div contenente l'UL. Tutti i suggerimenti su come alterare l'imbottitura, la larghezza, ecc. Dell'UL non hanno avuto alcun effetto, ma lo hanno fatto.

Si tratta solo margin:0 auto;del div contenente. Spero che questo aiuti alcune persone e grazie a tutti coloro che l'hanno già suggerito in combinazione con altre cose.

.divNav
{
    width: 99%;
    text-align:center;
    margin:0 auto; 
}

.divNav ul
{ 
    display:inline-block; 
    list-style:none;
    zoom: 1;
}

.divNav ul li 
{
    float:left;
    margin-right: .8em;       
    padding: 0; 
}

.divNav a,  #divNav a:visited
{
    width: 7.5em;
    display: block; 
    border: 1px solid #000;
    border-bottom:none;
    padding: 5px; 
    background-color:#F90;
    text-decoration: none;
    color:#FFF;
    text-align: center;
    font-family:Verdana, Geneva, sans-serif;
    font-size:1em;
}

2

Demo - http://codepen.io/grantex/pen/InLmJ

<div class="navigation">
    <ul>
        <li><a href="">Home</a></li>
        <li><a href="">About</a></li>
        <li><a href="">Contact</a></li>
        <li><a href="">Menu</a></li>
        <li><a href="">Others</a></li>
    </ul>
</div>


.navigation {
    max-width: 700px;
    margin: 0 auto;
}
.navigation ul {
    list-style: none;
    display: table;
    width: 100%;
}
.navigation ul li {
    display: table-cell;
    text-align: center;
}
.navigation ul li a {
    padding: 5px 10px;
    width: 100%;
}

Omg molto più pulito.


1

In generale, il modo per centrare un elemento di livello nero (come a <ul>) sta usando la margin:auto;proprietà.

Per allineare testo e incorporare elementi di livello all'interno di un elemento di livello blocco, utilizzare text-align:center;. Quindi tutti insieme qualcosa come ...

ul {
    margin:auto;
}
ul li {
    text-align:center;
    list-style-position:inside; /* so that the bullet points are also centered */
}
ul li div {
    display:inline; /* so that the bullet points aren't above the content */
}

... dovrebbe funzionare.

Il caso marginale è Internet Explorer6 ... o anche altri IE quando non si utilizza a <!DOCTYPE>. IE6 allinea erroneamente gli elennts a livello di blocco usando text-align. Quindi se stai cercando di supportare IE6 (o non usi a <!DOCTYPE>) la tua soluzione completa è ...

div.topmenu-design {
    text-align:center;
}
div.topmenu-design ul {
    margin:auto;
}
div.topmenu-design ul li {
    text-align:center;
    list-style-position:inside; /* so that the bullet points are also centered */
}
div.topmenu-design ul li div {
    display:inline; /* so that the bullet points aren't above the content */
}

Come nota a piè di pagina, penso che id="topmenu firstlevel"non sia valido in quanto un idattributo non può contenere spazi ...? In effetti la raccomandazione di W3C definisce l' idattributo come un tipo di 'nome' ...

I token ID e NAME devono iniziare con una lettera ([A-Za-z]) e possono essere seguiti da un numero qualsiasi di lettere, cifre ([0-9]), trattini ("-"), caratteri di sottolineatura ("_") , due punti (":") e punti (".").


1

Ho usato il display: proprietà inline-block: la soluzione consiste nell'utilizzare un wrapper con larghezza fissa. All'interno, il blocco ul con il blocco in linea per la visualizzazione. Usando questo, l'ul prende solo la larghezza per il vero contenuto! e infine margin: 0 auto, per centrare questo blocco inline =)

/*ul wrapper*/
.gallery_wrapper{
        width:          958px;
        margin:         0 auto;
  }
/*ul list*/
ul.gallery_carrousel{
        display:        inline-block;
        margin:         0 auto;
}
.contenido_secundario li{
        float:          left;
}

0

io uso il codice jquery per questo. (Soluzione alternativa)

    $(document).ready(function() { 
       var margin = $(".topmenu-design").width()-$("#topmenu").width();
       $("#topmenu").css('margin-left',margin/2);
    });

0
div {
     text-align: center;
}
div ul {
     display: inline-table;
}

ul come inline-table risolve il problema con. Ho usato il div genitore per allineare il testo al centro. in questo modo sembra buono anche in altre lingue (traduzione, larghezza diversa)


0

La soluzione di @ Robusto è stata la più semplice per quello che stavo cercando di fare, ti suggerisco di usarla. Stavo cercando di fare la stessa cosa per le immagini in un elenco non ordinato per creare una galleria ... Ho fatto un violino per scherzare con esso. Sentiti libero di provarlo qui.

[è stato impostato usando il codice di esempio robusto]
HTML:

<div id="centerDiv">
    <ul class="centerUL">
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150>         </a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150"></a>&nbsp;&nbsp;</li>
        <li><a href="http://www.amazon.com"><img src="http://placehold.it/200x150"></a></li>
    </ul>
</div>


CSS:

div#centerDiv {
    width: 700px;
    text-align: center;
    border: 1px solid red;
}
ul.centerUL {
    margin: 2px auto;
    line-height: 1.4;
}
.centerUL li {
    display: inline;
    text-align: center;
}

0
ul{margin-left:33%}

È un'approssimazione decente su grandi schermi. Non è buono, ma è una buona soluzione sporca.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.