Comment centrer aligner le menu horizontal?

Je dois centrer un menu horizontal.
J'ai essayé diverses solutions, y compris le mélange de inline-block / block / center-align etc. mais je n'ai pas réussi.

Voici mon code:

<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>

Mise à JOUR

Je sais comment centrer aligner le ul dans le div. Cela peut être accompli en utilisant la suggestion de Sarfraz. Mais les éléments de la liste sont toujours flottés à gauche dans le ul.

Ai - je besoin de Javascript pour accomplir cela?

140
demandé sur Saurav Rastogi 2010-05-19 16:21:51

16 réponses

À Partir de http://pmob.co.uk/pob/centred-float.htm:

La prémisse est simple et implique simplement un wrapper float widthless qui est flotté vers la gauche, puis décalé hors de l'écran vers la position de largeur gauche:relative; left:-50%. Ensuite, l'élément interne imbriqué est inversé et une position relative de +50% est appliquée. Cela a pour effet de placer l'élément mort au centre. Le positionnement relatif maintient le flux et permet à d'autres contenus de circuler en-dessous.

Code

#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>
128
répondu reisio 2015-01-06 10:18:22

Cela fonctionne pour moi. Si je n'ai pas mal interprété votre question, vous pourriez essayer.

    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>
83
répondu Robusto 2016-04-25 02:02:42

Avec CSS3 flexbox. Simple.

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

ul li {
  padding: 0 8px;
}
63
répondu Daishi Nakajima 2016-04-17 15:10:11

C'est le moyen le plus simple que j'ai trouvé. J'ai utilisé votre code html. Le remplissage est juste pour réinitialiser les paramètres par défaut du navigateur.

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>
19
répondu Shawin 2015-03-11 14:07:36

Voici un bon article sur la façon de le faire d'une manière assez solide comme le roc, sans aucun hacks et support multi-navigateur complet. Fonctionne pour moi:

--> http://matthewjamestaylor.com/blog/beautiful-css-centered-menus-no-hacks-full-cross-browser-support

10
répondu michaeldwp 2012-11-28 16:21:05

Faites-le comme ceci:

   <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>

Et le 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
répondu Boris Guéry 2010-05-19 12:52:24

Comme beaucoup d'entre vous, je me bats avec ça depuis un moment. La solution a finalement eu à voir avec la div contenant L'UL. Toutes les suggestions sur la modification du rembourrage, de la largeur,etc. de L'UL n'a eu aucun effet, mais ce qui suit a fait.

, Il est tout au sujet de la margin:0 auto; sur le div contenant. J'espère que cela aide certaines personnes, et merci à tous ceux qui ont déjà suggéré cela en combinaison avec d'autres choses.

.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
répondu Neal Ganslaw 2012-10-20 18:58:01

Essayez ceci:

div.topmenu-design ul
{
  display:block;
  width:600px; /* or whatever width value */
  margin:0px auto;
}
1
répondu Sarfraz 2010-05-19 12:23:46

D'une manière générale, la façon de centrer un élément de niveau noir (comme un <ul>) utilise la propriété margin:auto;.

Pour aligner des éléments de niveau texte et en ligne dans un élément de niveau bloc, utilisez text-align:center;. Donc, tous ensemble quelque chose comme...

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 */
}

... devrait fonctionner.

L'affaire fringe est Internet Explorer6... ou même D'autres IEs lorsque vous n'utilisez pas un <!DOCTYPE>. IE6 aligne incorrectement les éléments de niveau de bloc en utilisant text-align. Donc, si vous cherchez à soutenir IE6 (ou ne pas utiliser un <!DOCTYPE>) votre plein la solution est...

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 */
}

En tant que note de bas de page, je pense que id="topmenu firstlevel" est invalide car un attribut id ne peut pas contenir d'espaces... ? En effet, la recommandation W3C définit l'attribut id comme un type 'name' ...

Les jetons ID et NAME doivent commencer par un lettre ([A-Za-z]) et peut être suivie par n'importe quel nombre de lettres, chiffres ([0-9]), tirets ( " - " ), traits de soulignement ("_"), deux-points ( " :") et points (".").

1
répondu Richard JP Le Guen 2010-05-19 13:04:31

J'ai utilisé la propriété display: inline-block: la solution consiste à utiliser un wrapper avec une largeur fixe. A l'intérieur, le bloc ul avec le bloc en ligne pour l'affichage. En utilisant cela, l'ul prend juste la largeur pour le contenu réel! et enfin margin: 0 auto, pour centrer ce bloc 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;
}
1
répondu David 2013-03-16 04:21:10

Démo - 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 tellement plus propre.

1
répondu grantex 2014-02-20 02:06:34

J'utilise du code jquery pour cela. (Solution Alternative)

    $(document).ready(function() { 
       var margin = $(".topmenu-design").width()-$("#topmenu").width();
       $("#topmenu").css('margin-left',margin/2);
    });
0
répondu nixis 2014-07-01 12:13:54
div {
     text-align: center;
}
div ul {
     display: inline-table;
}

Ul comme inline-table corrige le problème avec. J'ai utilisé le div parent pour aligner le texte au centre. de cette façon, il semble bon même dans d'autres langues (traduction, largeur différente)

0
répondu ruifn 2014-09-02 11:50:05

La solution de@Robusto était la plus simple pour ce que j'essayais de faire, je vous suggère de l'utiliser. J'essayais de faire la même chose pour les images dans une liste non ordonnée pour faire une galerie... J'ai fait un violon js pour m'amuser avec ça. Se sentir libre de essayer ici.

[il a été configuré en utilisant l'exemple de code de 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
répondu xanderoid 2014-09-02 12:11:37
ul{margin-left:33%}

Est une approximation décente sur les grands écrans. Ce n'est pas bon, mais une bonne solution sale.

0
répondu Jon 2015-02-02 14:08:02
.topmenu-design
{
    display: inline-table;
}

C'est tout!

-2
répondu Сатанист Васькин 2014-08-27 16:54:21