【问题标题】: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>

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 2023-03-10
      • 2021-11-14
      • 1970-01-01
      • 2013-10-02
      相关资源
      最近更新 更多