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

这是我目前所得到的:fiddle

虽然有 2 个问题:

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

#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:尽可能多,虽然我不太关心旧浏览器。

标签: html css navigation html-lists


【解决方案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 水平项之间的空白”有点无关紧要,因为我已经用浮点数解决了这个问题,你刚刚告诉我要删除它,因此你添加了一个问题但没有解决。
猜你喜欢
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多