【问题标题】:How do I center align horizontal <UL> menu?如何居中对齐水平 <UL> 菜单?
【发布时间】:2011-02-21 08:44:06
【问题描述】:

我需要居中对齐水平菜单。
我尝试了各种解决方案,包括inline-block/block/center-align等的组合,但都没有成功。

这是我的代码:

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

更新

我知道如何在div 中居中对齐ul。这可以使用 Sarfraz 的建议来实现。 但是列表项仍然在ul 中向左浮动。

我需要 Javascript 来完成这项工作吗?

【问题讨论】:

  • 将每个 LI 中的文本居中或将 UL 置于 DIV 中?

标签: css xhtml menuitem


【解决方案1】:

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

前提很简单,基本上只涉及一个无宽度的浮动包装器,它向左浮动,然后移出屏幕到左侧宽度位置:相对;左:-50%。接下来,反转嵌套的内部元素并应用 +50% 的相对位置。这具有将元素放置在中心的效果。相对定位保持流动,并允许其他内容在下方流动。

代码

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

【讨论】:

  • 您能否在此答案中添加一些代码或上下文以防止链接失效?
  • 该解决方案效果很好,很抱歉这么长时间后问这个问题,但是如果我有一个 CSS 下拉菜单怎么办?我不能在父级中使用溢出:隐藏。但它仍然会像这里一样溢出:homeafrika.com .
  • 实际上在该站点上看不到任何溢出。我不确定您是否需要溢出:隐藏;无论如何,虽然它是用于水平溢出,但您总是可以尝试 overflow-x: hidden;反而。 webchat.freenode.net/?nick=oerflowono&channels=#websites 获取实时帮助。
  • 该解决方案很好地将菜单居中,但是如果您有子菜单应该在悬停时在某个固定位置打开,那么您注定要失败,因为主菜单的 position: relative 会改变 @ 的行为987654327@子菜单。
  • @reisio OP 的问题中有#buttons id 在哪里?在您的回答中,哪里有通知他必须使用它?如果您实际上没有回答这个问题,只是从某个链接中引用了一些离题的废话,这怎么能被接受和获得最高票数的答案?
【解决方案2】:

这对我有用。如果我没有误解你的问题,你可以试一试。

    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>

【讨论】:

  • 同意@cweiske。简单地使用 text-align: center on 包含的 div 为我解决了这个问题
  • 你只需要确保里面的任何文本都得到text-align: left;
  • 这太可爱了!但是, ul 在左侧有默认填充,这意味着菜单被轻推到中心的右侧。您需要使用 padding-left: 0; 从 ul 中删除默认填充
  • 完美的答案比公认的解决方案更好,使用 display:inline 就可以了。不要使用浮点数,它过于复杂。感谢@Robusto 的见解
  • li 中的文本对齐中心是不必要的
【解决方案3】:

使用 CSS3 弹性框。很简单。

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

ul li {
  padding: 0 8px;
}

【讨论】:

  • 我肯定会推荐这种方法
  • 我也会推荐这种方法而不是选择的答案。
  • 我不得不说我在 justify-content 之前从未使用过 flex。很好的答案
  • justify-content: center; 是解决问题所需要的。
  • 添加 flex-wrap:wrap 使其可以多行移动分辨率
【解决方案4】:

这是我找到的最简单的方法。我用了你的html。填充只是为了重置浏览器默认值。

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>

【讨论】:

    【解决方案5】:

    这是一篇很好的文章,介绍了如何以坚如磐石的方式做到这一点,没有任何技巧和完整的跨浏览器支持。为我工作:

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

    【讨论】:

    • 您能否发布一个摘要以防链接失效?
    【解决方案6】:

    试试这个:

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

    【讨论】:

    • 这可以使 UL 居中。但是
    • 仍然向左浮动。我希望
      • 内居中。有可能吗?
    【解决方案7】:

    这样做:

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

    还有 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;
    }
    

    【讨论】:

      【解决方案8】:

      像你们中的许多人一样,我已经为此苦苦挣扎了一段时间。该解决方案最终与包含 UL 的 div 有关。所有关于更改 UL 的 padding、width 等的建议都没有效果,但以下建议有效果。

      这都是关于包含 div 上的 margin:0 auto; 的。我希望这对某些人有所帮助,并感谢其他已经提出此建议的其他人。

      .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;
      }
      

      【讨论】:

        【解决方案9】:

        演示 - 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%;
        }
        

        天哪,干净多了。

        【讨论】:

          【解决方案10】:

          一般来说,使黑色电平元素(如&lt;ul&gt;)居中的方法是使用margin:auto; 属性。

          要在块级元素中对齐文本和内联级元素,请使用text-align:center;。所以所有的东西都像......

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

          ...应该可以工作。

          不使用&lt;!DOCTYPE&gt; 时,边缘情况是Internet Explorer6... 甚至是其他IE。 IE6 使用text-align 错误地对齐块级元素。因此,如果您希望支持 IE6(或不使用 &lt;!DOCTYPE&gt;),您的完整解决方案是......

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

          作为脚注,我认为id="topmenu firstlevel" 无效,因为id 属性不能包含空格...?事实上w3c recommendation definesid 属性作为'name' type...

          ID 和 NAME 令牌必须以 字母 ([A-Za-z]) 并且可以跟随 由任意数量的字母、数字 ([0-9])、连字符 ("-")、下划线 ("_")、冒号 (":") 和句点 (".")。

          【讨论】:

            【解决方案11】:

            我使用了 display:inline-block 属性:解决方案在于使用固定宽度的包装器。在内部,带有 inline-block 的 ul 块用于显示。使用这个,ul 只取真实内容的宽度!最后是margin: 0 auto,使这个内联块居中=)

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

            【讨论】:

              【解决方案12】:

              我为此使用 jquery 代码。 (替代方案)

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

              【讨论】:

                【解决方案13】:
                div {
                     text-align: center;
                }
                div ul {
                     display: inline-table;
                }
                

                ul as inline-table 修复了 with 问题。我使用父 div 将文本对齐到中心。 这样即使在其他语言中也看起来不错(翻译,不同的宽度)

                【讨论】:

                  【解决方案14】:

                  @Robusto 的解决方案是我尝试做的最简单的,我建议你使用它。我试图对无序列表中的图像做同样的事情来制作画廊......我做了一个 js fiddle 来玩弄它。欢迎随时try it here.

                  [它是使用 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;
                  }
                  

                  【讨论】:

                    【解决方案15】:
                    ul{margin-left:33%}
                    

                    在大屏幕上是一个不错的近似值。它不是很好,但是一个很好的肮脏修复。

                    【讨论】:

                      【解决方案16】:

                      对我有用的只是将li 项目的display 属性设置为inline-flex

                      li {
                        display: inline-flex;
                      }
                      <ul>
                        <li>Item 1</li>
                        <li>Item 1</li>
                      </ul>

                      您可以选择将justify-content: center 添加到lis,并将padding: 0 添加到ul 以解决问题。

                      【讨论】:

                        【解决方案17】:
                        .topmenu-design
                        {
                            display: inline-table;
                        }
                        

                        就是这样!

                        【讨论】:

                          猜你喜欢
                          相关资源
                          最近更新 更多
                          热门标签