【问题标题】:How to keep nested <li> from expanding parent <li> width?如何防止嵌套 <li> 扩展父 <li> 宽度?
【发布时间】:2018-03-27 22:40:26
【问题描述】:
我的 CMS 通过如下方式嵌套处理下拉菜单:
body {
text-align: center;
}
ul.nav {
margin: 0;
padding: 0;
display: inline-block;
list-style-type: none;
}
li.top-item {
margin: 0;
padding: 0;
float: left;
padding: .5em;
}
ul.dropdown-list {
margin: 0 0 -8em;
padding: 0;
display: none;
list-style-type: none;
background: #eee;
position: relative;
}
a.dropdown:hover+ul.dropdown-list {
display: block;
}
<ul class="nav">
<li class="top-item"><a href="#">home</a></li>
<li class="top-item"><a href="#" class="dropdown">dropdown</a>
<ul class="dropdown-list">
<li class="dropdown-item">item 1</li>
<li class="dropdown-item">item 2 expands parent :(</li>
<li class="dropdown-item">item 3</li>
</ul>
</li>
<li class="top-item"><a href="#">about</a></li>
</ul>
<p>Lorem ipsum and such...</p>
问题在于,如果子链接的名称/标题比其父链接长,则将鼠标悬停在父链接上会使父链接展开以适应最宽子链接的宽度。此链接中的示例:https://codepen.io/ivorytux/pen/PObemb
有什么好的方法可以解决这个问题,让顶级菜单保持一致的宽度,并且只有下拉菜单适合其链接的宽度?
【问题讨论】:
标签:
html
css
drop-down-menu
html-lists
【解决方案1】:
您应该将顶部项目设置为相对位置:
li.top-item {
position: relative;
...
}
并将子菜单项置于绝对位置:
ul.dropdown-list {
position: absolute;
...
}
除此之外,还可以设置:
ul.dropdown-list {
position: absolute;
white-space: nowrap; /* no wrapping */
left: 50%; /* horizontal center */
transform: translateX(-50%); /* horizontal center */
}
最后,您需要将悬停对象更新为:
li.top-item:hover ul.dropdown-list {
display: block;
}
正如您在问题中的示例,您无法选择子菜单。
完整代码sn-p:
body {
text-align: center;
}
ul.nav {
margin: 0;
padding: 0;
display: inline-block;
list-style-type: none;
}
li.top-item {
margin: 0;
padding: 0;
float: left;
padding: 0.5em;
position: relative;
}
ul.dropdown-list {
margin: 0 0 -8em;
padding: 0;
display: none;
list-style-type: none;
background: #eee;
position: absolute;
white-space: nowrap;
left: 50%;
transform: translateX(-50%);
}
li.top-item:hover ul.dropdown-list {
display: block;
}
<ul class="nav">
<li class="top-item"><a href="#">home</a></li>
<li class="top-item"><a href="#" class="dropdown">dropdown</a>
<ul class="dropdown-list">
<li class="dropdown-item">item 1</li>
<li class="dropdown-item">item 2 this is a long item</li>
<li class="dropdown-item">item 3</li>
</ul>
</li>
<li class="top-item"><a href="#">about</a></li>
</ul>
<p>Lorem ipsum and such...</p>
【解决方案2】:
我的建议是给你隐藏的ul 元素position: absolute 让它脱离流程。这将防止它弄乱父母的宽度,但会稍微“偏移”它。这可以用否定的 margin-left 来抵消。在此示例中,我使用了 margin-left: 45px,但您可能需要尝试一下。如果需要,您还可以使用 top 偏移下拉菜单的高度。
body {
text-align: center;
}
ul.nav {
margin: 0;
padding: 0;
display: inline-block;
list-style-type: none;
}
li.top-item {
margin: 0;
padding: 0;
float: left;
padding: 0.5em;
}
ul.dropdown-list {
margin: 0 0 -8em;
padding: 0;
display: none;
list-style-type: none;
background: #eee;
position: relative;
}
a.dropdown:hover+ul.dropdown-list {
display: block;
position: absolute;
margin-left: -45px;
/* top: 90px; */
}
<ul class="nav">
<li class="top-item"><a href="#">home</a></li>
<li class="top-item"><a href="#" class="dropdown">dropdown</a>
<ul class="dropdown-list">
<li class="dropdown-item">item 1</li>
<li class="dropdown-item">item 2 expands parent :(</li>
<li class="dropdown-item">item 3</li>
</ul>
</li>
<li class="top-item"><a href="#">about</a></li>
</ul>
<p>Lorem ipsum and such...</p>