我正在尝试实现具有以下功能的菜单:
- 水平的;
- 等宽菜单项;
- 菜单项分布在整个页面宽度上(不仅仅是左侧拥挤);
- 动态的(css 规则不应依赖于预定义的项目数量);
- 带有垂直对齐项目的下拉第二级;
- 纯 CSS(没有 JS!)。
正如我所见,这似乎描述了一个完美的菜单。
我几乎成功地使用了漂亮的display: table-cell;
技术(为简单起见省略了标签):
<ul>
<li>Menu item</li>
<li>
Expandable ↓
<ul>
<li>Menu</li>
<li>Menu item</li>
<li>Menu item long</li>
</ul>
</li>
<li>Menu item</li>
<li>Menu item</li>
</ul>
ul {
display: table;
table-layout: fixed;
width: 100%;
}
li {
display: table-cell;
text-align: center;
}
li:nth-child(even){
background-color: lightblue;
}
li:nth-child(odd){
background-color: lightskyblue;
}
li ul { display: none; }
li:hover ul {
display: block;
position: absolute;
}
li:hover ul li {
display: block;
}
唯一的问题是子菜单项显示为整页宽度并部分显示在浏览器窗口之外,从而强制显示水平滚动条:
呸!StackOverflow 不允许我发布图片。在 JSFiddle 上进行现场测试:http: //jsfiddle.net/6PTpd/9/
float: left; clear: both;
我可以通过添加来克服这个问题li:hover ul li
。但是当我这样做时,子菜单项有不同的宽度:
小提琴:http: //jsfiddle.net/6PTpd/10/
...或宽度width: 15%;
:http: //jsfiddle.net/6PTpd/12/
这两个修复都很丑陋,既不能解决等宽问题,也不能解决水平滚动条问题。
UPD在刷这篇文章时,我发现了滚动条问题的一些解决方案:将li:hover ul
宽度设置为 0。但这会强制以绝对值指定子菜单项的宽度。:(见http://jsfiddle.net/6PTpd/13/
此外,当最后一个菜单项展开时,此解决方案可能会很糟糕。根据屏幕宽度,它可能仍然会使页面比窗口宽:http: //jsfiddle.net/6PTpd/15/
问题:
- 如何在不启用水平滚动条的情况下使子菜单项与其父项显示相同的宽度?
- 是否有另一种 CSS 技术允许创建具有文章开头所述的所有先决条件的菜单?
我找到了很多示例,但它们中的每一个要么是非拉伸的(将项目浮动到左侧)要么是非动态的(使用从预定义数量的项目中获取的大小,例如width: 20%
对于五个一级项目中的每一个或,更糟糕的是,使用绝对大小!)。