如何创建一个水平菜单,每个项目之间的宽度和间距相等?
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
用于均匀分布动态数量的li
s。不幸的是,在 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 水平项之间的空白”有点无关紧要,因为我已经用浮点数解决了这个问题,你刚刚告诉我要删除它,因此你添加了一个问题但没有解决。以上是关于如何创建一个水平菜单,每个项目之间的宽度和间距相等?的主要内容,如果未能解决你的问题,请参考以下文章
具有相等项目间距的自定义 UICollectionViewLayout