149

I need to center align a horizontal menu.
I've tried various solutions, including the mix of inline-block / block / center-align etc., but haven't succeeded.

Here is my 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>

UPDATE

I know how to center align the ul within the div. That can be accomplished using Sarfraz's suggestion. But the list items are still floated left within the ul.

Do I need Javascript to accomplish this?

Saurav Rastogi
  • 9,575
  • 3
  • 29
  • 41
Steven
  • 19,224
  • 47
  • 152
  • 257

17 Answers17

130

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

The premise is simple and basically just involves a widthless float wrapper that is floated to the left and then shifted off screen to the left width position:relative; left:-50%. Next the nested inner element is reversed and a relative position of +50% is applied. This has the effect of placing the element dead in the center. Relative positioning maintains the flow and allows other content to flow underneath.

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>
Community
  • 1
  • 1
reisio
  • 3,242
  • 1
  • 23
  • 17
  • 9
    Could you please add some code or context to this answer to prevent link rot? – Nightfirecat Nov 15 '11 at 03:34
  • The solution works great and I'm sorry to ask this after such a long time, but what if I have a css drop down? I can't use overflow:hidden in the parent then. But it'll still overflow like here: http://homeafrika.com . – Samia Ruponti Mar 28 '12 at 18:26
  • Don't actually see any overflow on that site. I'm not sure you need the overflow: hidden; bit anyways, though since it's for horizontal overflow, you could always try overflow-x: hidden; instead. http://webchat.freenode.net/?nick=oerflowono&channels=#websites for real-time assistance. – reisio Mar 28 '12 at 22:31
  • 1
    The solution centers the menu nicely, but if you have submenus that should open at a certain fixed position on hover, you're doomed since the `position: relative` of the main menu changes the behavior of the `position:absolute` of the sub menu. – cweiske Apr 24 '12 at 05:53
  • I'm afraid it's still quite hard to know what you're talking about. If you can't IRC, I'd be happy to address a separate question you might create if you link to it from here. – reisio Apr 24 '12 at 19:29
  • 1
    @reisio Where there is `#buttons` id in OP's question? Where there is notice, in your answer, that he have to use it? How can this be accepted and top-voted answer, if you're actually **not** answering the question, only citing some off-topic blah-blah from some link? – trejder Aug 09 '13 at 11:43
  • @trejder: Don't know, don't care; but it does answer the question, so that's probably why it was accepted and upvoted. – reisio Dec 12 '13 at 14:24
  • Have you noticed that your grouping is not centered in the container? – Robusto Jun 11 '18 at 12:29
  • @Robusto I'm not sure what random editors have added to this answer. Stick with the original link and you should be good, although this approach is probably a little more work than you should bother with these days. – reisio Jul 31 '18 at 17:30
94

This works for me. If I haven't misconstrued your question, you might give it a try.

    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>
Robusto
  • 31,447
  • 8
  • 56
  • 77
84

With CSS3 flexbox. Simple.

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

ul li {
  padding: 0 8px;
}
the
  • 21,007
  • 11
  • 68
  • 101
Daishi Nakajima
  • 1,932
  • 18
  • 26
20

This is the simplest way I found. I used your html. The padding is just to reset browser defaults.

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>
Shawin
  • 211
  • 2
  • 2
9

Here's a good article on how to do it in a pretty rock-solid way, without any hacks and full cross-browser support. Works for me:

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

michaeldwp
  • 431
  • 5
  • 10
2

Like so many of you, I've been struggling with this for a while. The solution ultimately had to do with the div containing the UL. All suggestions on altering padding, width, etc. of the UL had no effect, but the following did.

It's all about the margin:0 auto; on the containing div. I hope this helps some people, and thanks to everyone else who already suggested this in combination with other things.

.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;
}
karthikr
  • 97,368
  • 26
  • 197
  • 188
Neal Ganslaw
  • 81
  • 1
  • 7
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 so much cleaner.

grantex
  • 21
  • 3
2

Try this:

div.topmenu-design ul
{
  display:block;
  width:600px; /* or whatever width value */
  margin:0px auto;
}
Sarfraz
  • 377,238
  • 77
  • 533
  • 578
  • 1
    That works to center the UL. But the
  • is still float left. I want the
  • to be centered inside the
      . Is it possible?
  • – Steven May 19 '10 at 12:31