如何在指定容器上均匀且完全地拉伸固定数量的水平导航项
我想在 900px 容器上均匀拉伸 6 个导航项目,并在其之间留出均匀的空白。例如......
---| 900px Container |---
---| HOME ABOUT BASIC SERVICES SPECIALTY SERVICES OUR STAFF CONTACT US |---
目前,我能找到的最好方法如下:
nav ul {
width: 900px;
margin: 0 auto;
}
nav li {
line-height: 87px;
float: left;
text-align: center;
width: 150px;
}
这个问题有两个方面。首先,它并没有真正证明它的合理性,而是将 li 标签均匀地分布在整个 ul 标签中。在较小的菜单项(如“主页”或“关于”)和较大的菜单项(如“基本服务”)之间创建不均匀的空白。
第二个问题是,如果导航项大于 150 像素(即专业服务),布局就会中断 - 即使整个导航有足够的空间。
谁能帮我解决这个问题吗?我一直在网上寻找解决方案,但它们似乎都不够。如果可能的话,只使用 CSS / HTML...
谢谢!
更新(2013 年 7 月 29 日):使用表格单元格是实现此布局的最佳现代方法。请参阅下面菲利克斯的回答。 表格单元格
属性目前适用于 94% 的浏览器。你必须对 IE7 及以下版本做一些处理,但其他应该没问题。
更新(2013 年 7 月 30 日):不幸的是,如果您将此布局与媒体查询相结合,则存在一个 webkit 错误会影响这一点。现在您必须避免更改“显示”属性。 查看 Webkit Bug。
更新 (7/25/14):有一个更好的下面的解决方案现在涉及 text-align: justify。 使用它更简单,并且您将避免 Webkit 错误。
I'd like to stretch 6 nav items evenly across a 900px container, with an even amount of white space between. For instance...
---| 900px Container |---
---| HOME ABOUT BASIC SERVICES SPECIALTY SERVICES OUR STAFF CONTACT US |---
Currently, the best method I can find to do this is the following:
nav ul {
width: 900px;
margin: 0 auto;
}
nav li {
line-height: 87px;
float: left;
text-align: center;
width: 150px;
}
The PROBLEM with this is two fold. First of all, it doesn't truly justify it, but rather spreads the li tags evenly throughout the ul tag.. creating uneven white-space between smaller menu items like "HOME" or "ABOUT" and larger ones like "BASIC SERVICES".
The second problem is that the layout breaks if a nav item is larger than 150px, which SPECIALTY SERVICES is - even though there is more than enough space for the whole nav.
Can anyone solve this for me? I've been scouring the web for solutions, and they all seem to come up short. CSS / HTML only if possible...
Thanks!
UPDATE (7/29/13): Using table-cell is the best modern way to implement this layout. See felix's answer below. The table cell
property works on 94% of browsers currently. You'll have to do something about IE7 and below, but otherwise should be ok.
UPDATE (7/30/13): Unfortunately, there is a webkit bug that impacts this if you're combining this layout with Media Queries. For now you'll have to avoid changing the 'display' property. See Webkit Bug.
UPDATE (7/25/14): There is a better solution to this below now involving text-align: justify.
Using this is simpler and you'll avoid the Webkit bug.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(12)
均匀分布项目的现代方法是在容器元素上设置以下两个声明:
用于
justify-content
的值取决于需要哪种类型的均匀分布。请参阅MDN
Here's my original answer - if for some reason using a flex container isn't viable
在容器上使用
text-align:justify
,这样无论列表中有多少元素,它都会起作用(您不必计算每个列表项的宽度百分比FIDDLE
The modern way to distribute items evenly is to set the following two declarations on the container element:
The value to use for
justify-content
depends on which kind of even distribution is needed.See MDN
Here's my original answer - if for some reason using a flex container isn't viable
Use
text-align:justify
on the container, this way it will work no matter how many elements you have in your list (you don't have to work out % widths for each list itemFIDDLE
这个确实有效。还有一个好处是,您可以使用媒体查询轻松关闭水平样式 - 例如,如果您想在手机上垂直堆叠它们。
HTML
CSS
http://jsfiddle.net/timshutes/eCPSh/416/
This one really works. Also has the benefit that you can use media queries to easily turn off the horizontal style — for instance if you want to stack them vertically when on mobile phone.
HTML
CSS
http://jsfiddle.net/timshutes/eCPSh/416/
如果可以的话,使用flexbox:
jsfiddle: http://jsfiddle.net/RAaJ8/
浏览器支持实际上相当好(前缀为其他讨厌的东西):http://caniuse.com/flexbox
if you can, use flexbox:
jsfiddle: http://jsfiddle.net/RAaJ8/
Browser support is actually quite good (with prefixes an other nasty stuff): http://caniuse.com/flexbox
理想的解决方案将:
使用
nav
容器内的简单ul
菜单,我们可以构建满足上述要求的解决方案。HTML
首先,我们需要强制
ul
具有其nav
容器的完整宽度。为了实现这一点,我们将使用:after
伪元素和width: 100%
。这完美地实现了我们的目标,但添加了伪元素的尾随空白。我们可以通过 IE8 在所有浏览器中删除此空白,方法是将
ul
的line-height
设置为 0,并将其li
设置回 100%代码>孩子。请参阅下面的示例 CodePen 和解决方案:CSS
An ideal solution will:
Using a simple
ul
menu inside of annav
container, we can build a solution that meets the above requirements.HTML
First, we need to force the
ul
to have the full width of itsnav
container. To accomplish this, we will use the:after
psuedo-element withwidth: 100%
.This achieves our goal perfectly, but adds trailing whitespace from the psuedo-element. We can remove this whitespace across all browsers through IE8 by setting the
line-height
of theul
to 0 and setting it back to 100% on itsli
children. See the example CodePen and solution below:CSS
我尝试了以上所有方法,发现它们都不够。这是我能想到的最简单、最灵活的解决方案(感谢以上所有内容的启发)。
HTML
CSS
显然,您可以删除第一个/最后一个子圆角末端,但我认为它们是真正的purdy(您的客户也是如此;)
容器宽度限制了水平列表,但您可以放弃它并只应用绝对值如果您愿意,请向 UL 提供价值。
如果你愿意的话,可以摆弄它..
http://jsfiddle.net/tobyworth/esehY/1/< /a>
I tried all the above and found them wanting. This is the simplest most flexible solution I could figure out (thanks to all of the above for inspiration).
HTML
CSS
You can drop the first/last child-rounded ends, obviously, but I think they're real purdy (and so does your client ;)
The container width limits the horizontal list, but you can ditch this and just apply an absolute value to the UL if you like.
Fiddle with it, if you like..
http://jsfiddle.net/tobyworth/esehY/1/
这应该适合你。
This should do it for you.
您是否尝试过将 li 宽度设置为 16%,边距为 0.5%?
编辑:我会将 UL 设置为 100% 宽度:
nav ul {
宽度:100%;
保证金:0 自动;
}
Have you tried setting the li width to, say, 16% with a margin of 0.5%?
edit: I would set the UL to 100% width:
nav ul {
width: 100%;
margin: 0 auto;
}
CSS flexbox 模型将解决这种问题,因为它可以让您指定每个 li 将接收相同比例的剩余宽度。
This is the sort of thing that the CSS flexbox model will fix, because it will let you specify that each li will receive an equal proportion of the remaining width.
我尝试了很多不同的事情,最后发现最适合我的就是简单地添加
padding-right: 28px;
我尝试使用填充来获得适当的填充量以均匀地间隔项目。
I tried so many different things and finally found what worked best for me was simply adding in
padding-right: 28px;
I played around with the padding to get the right amount to evenly space the items.
您可以不定义宽度,而是在 li 上放置一个 margin-left ,以便间距一致,并确保 margin(s)+li 适合在 900px 之内。
希望这有帮助。
Instead of defining the width, you could just put a margin-left on your li, so that the spacing is consistent, and just make sure the margin(s)+li fit within 900px.
Hope this helps.
我很犹豫是否提供这个,因为它滥用了旧的 html。这不是一个好的解决方案,但它是一个解决方案:使用表格。
CSS:
HTML:
这不是创建表格的目的,而是直到我们能够可靠地执行相同的操作以更好的方式我想这只是允许的。
I'm hesitant to offer this as it misuses ye olde html. It's not a GOOD solution but it is a solution: use a table.
CSS:
HTML:
This is not what tables were created to do but until we can reliably perform the same action in a better way I guess it is just about permissable.