如何创建一个水平菜单,每个项目之间的宽度和间距相等?

Posted

技术标签:

【中文标题】如何创建一个水平菜单,每个项目之间的宽度和间距相等?【英文标题】:How can I create a horizontal menu with each item being equal width and spacing inbetween? 【发布时间】:2011-10-16 16:18:31 【问题描述】:

这是我目前所得到的:fiddle

虽然有 2 个问题:

    我已将每个 li 的宽度硬编码为 33%,我不想这样做,以便可以轻松添加更多项目。 我想在每个项目之间放置一些间距(背景颜色的间隙),但是一旦我添加了边距,一个项目就会被撞到一行。我该如何解决?

#main-nav 
    list-style: none;
    margin: 0;
    padding: 0;
    width: 100%;
    overflow:  auto;

#main-nav li 
    float: left;
    width: 33%;
    height: 25px;
    text-align: center;

#main-nav li a 
    width: 100%;
    display: block;
    height: 100%;
    line-height: 25px;
    text-decoration: none;
    background-color: #e0e0f0;
    font-weight: bold;
    color: #021020;

#main-nav li a:hover 
    background-color: #498cd5;
    color: #ddeeee;
<ul id="main-nav">
    <li><a href="#">one</a></li>
    <li><a href="#">two</a></li>
    <li><a href="#">three</a></li>
</ul>

【问题讨论】:

您需要支持哪些浏览器/版本? IE7? @thirtydot:尽可能多,虽然我不太关心旧浏览器。 【参考方案1】:

见:http://jsfiddle.net/f6qmm/

display: table 用于均匀分布动态数量的lis。不幸的是,在 IE7 中使用了 doesn't work,因此使用了 *float: left(仅适用于 IE7 及更低版本),因此至少它们都在一条线上——尽管它看起来仍然很可怕。

padding-left: 5px 应用于每个li,然后li:first-child padding-left: 0 仅删除第一个li

#main-nav 
    list-style: none;
    margin: 0;
    padding: 0;
    width: 100%;
    display: table;
    table-layout: fixed;
    overflow: hidden

#main-nav li 
    display: table-cell;
    *float: left; /* improve IE7 */
    height: 25px;
    text-align: center;
    padding-left: 5px

#main-nav li:first-child 
    padding-left: 0

#main-nav li a 
    width: 100%;
    display: block;
    height: 100%;
    line-height: 25px;
    text-decoration: none;
    background-color: #e0e0f0;
    font-weight: bold;
    color: #021020;

#main-nav li a:hover 
    background-color: #498cd5;
    color: #ddeeee;
<ul id="main-nav">
    <li><a href="#">one</a></li>
    <li><a href="#">two</a></li>
    <li><a href="#">three</a></li>
</ul>

<hr />

<ul id="main-nav">
    <li><a href="#">one</a></li>
    <li><a href="#">two</a></li>
    <li><a href="#">three</a></li>
    <li><a href="#">four</a></li>
    <li><a href="#">five</a></li>
</ul>

【讨论】:

不错!我更喜欢#main-nav li+li padding-left: 3px; 而不是:first-child。我认为它得到了更好的支持,并且需要更少的代码。不过,我从未见过或听说过其他人使用这种方法...... +:first-child 具有几乎相同的浏览器支持。两者都不能在 IE6 中工作,而在 IE7 中工作。虽然+ 解决方案短了一行:) 刚刚注意到这种方法使第一个元素比其他元素大几个像素。 表格布局:固定; ...这是我缺少的部分【参考方案2】:

试试这个小提琴:http://jsfiddle.net/Nk2Wy/1/。

这种方法允许您添加任意数量的项目。如果它们不再适合该行,因为它们太多或因为浏览器窗口很小,它们会显示在更多的行中。

如果您将width: 50px 添加到a 样式,则所有这些项目的宽度都相同。目前,宽度取决于实际文本。

也可以查看问题(和答案)How to get rid of white space between css horizontal list items?。

因此,我再次更新了小提琴:http://jsfiddle.net/Nk2Wy/3/。

【讨论】:

好的...这似乎创建了 1 个空格的任意间隙,在这种情况下这对我来说没问题,但是...我想以像素为单位实际定义空间。 编辑: 实际上,我认为这仅适用于剩余未使用的 1%。 项目应该填满容器的整个宽度并且宽度相同,而不仅仅是一些预设的像素宽度。 “css 水平项之间的空白”有点无关紧要,因为我已经用浮点数解决了这个问题,你刚刚告诉我要删除它,因此你添加了一个问题但没有解决。

以上是关于如何创建一个水平菜单,每个项目之间的宽度和间距相等?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局来布局三个项目水平相等

是否可以在 flexbox 项目之间创建灵活的间距?

具有相等项目间距的自定义 UICollectionViewLayout

相等的水平间距UICollectionView,包括插图 - UICollectionViewFlowLayout?

水平对齐父 div 中的 UL 项目,两边都没有空格?

Xcode 7 - 约束 - 按钮之间的相等间距