我正在构建一个像这样的jsfiddle的css菜单:http://jsfiddle.net/YXT7j/48/
HTML:
<ul id="nav">
<li><a>item 1</a>
<ul class="sub" style="width: 200px;">
<li><a>item 1.1</a>
<ul>
<li><a>item 1.1.1</a></li>
<li><a>item 1.1.2</a></li>
<li><a>item 1.1.3</a></li>
</ul>
</li>
<li><a>item 1.2</a>
<ul>
<li><a>item 1.1.1</a></li>
<li><a>item 1.1.2</a></li>
<li><a>item 1.1.3</a></li>
</ul>
</li>
</ul>
</li>
<li><a>item 2</a>
<ul class="sub">
<li><a>item 2.1</a></li>
<li><a>item 2.2</a></li>
<li><a>item 2.3</a></li>
</ul>
</li>
<li><a>item 3</a>
<ul class="sub">
<li><a>item 3.1</a></li>
<li><a>item 3.2</a></li>
<li><a>item 3.3</a></li>
</ul>
</li>
</ul>
CSS:
#nav>li {
float: left;
margin: 0 10px;
position: relative;
}
.sub {
display: none;
position: absolute;
top: 1em;
left: 0;
}
.sub>li {
float: left;
width: 100px;
}
#nav>li:hover .sub {
display: block;
}
在第1项下,您可以看到彼此相邻的2个列表。同样在html中,您会看到内联宽度设置。如果没有内联宽度(或等效的css),列表将显示在彼此之下,而不是彼此相邻(http://jsfiddle.net/YXT7j/34/)。
现在子菜单中的列表数量是动态的。这就是为什么我不能在css中设置宽度而我现在使用内联样式(100 * numlists +'px')。但那只是丑陋的。 我希望子菜单像任何其他元素一样调整其子项。遗憾的是,如果没有设置宽度,则子菜单将遵循其父菜单项的宽度。
所以,tl / dr:如果没有在ul.sub上设置显式宽度,我如何获得http://jsfiddle.net/YXT7j/48/。
谢谢!
答案 0 :(得分:5)
这是我的解决方案的小提琴:http://jsfiddle.net/YXT7j/66/
您必须在子菜单内联块中创建列表,而不是浮动它们。然后你告诉子菜单不要用white-space包装内联项:nowrap;
这是我之前看到的其他问题的类似答案。虽然这些答案是为了防止文本(标准是内联的)包装,而不是完整的块元素。
所以,为了完整起见,代码:
<ul id="nav">
<li><a>item 1</a>
<ul class="sub multi">
<li><a>item 1.1</a>
<ul>
<li><a>item 1.1.1</a></li>
<li><a>item 1.1.2</a></li>
<li><a>item 1.1.3</a></li>
</ul>
</li>
<li><a>item 1.2</a>
<ul>
<li><a>item 1.1.1</a></li>
<li><a>item 1.1.2</a></li>
<li><a>item 1.1.3</a></li>
</ul>
</li>
</ul>
</li>
<li><a>item 2</a>
<ul class="sub">
<li><a>item 2.1</a></li>
<li><a>item 2.2</a></li>
<li><a>item 2.3</a></li>
</ul>
</li>
<li><a>item 3</a>
<ul class="sub">
<li><a>item 3.1</a></li>
<li><a>item 3.2</a></li>
<li><a>item 3.3</a></li>
</ul>
</li>
</ul>
#nav>li {
float: left;
margin: 0 10px;
position: relative;
}
.sub {
display: none;
position: absolute;
top: 1em;
left: 0;
white-space: nowrap;
}
.sub>li {
width: 100px;
}
.multi.sub>li {
display: inline-block;
}
#nav>li:hover .sub {
display: block;
}
答案 1 :(得分:2)
当你等待更好的答案时,一个hacky解决方案就是这样做:
#nav>li:hover .sub {
display: block;
width:1000%;
}