<li> 列表项和 <a> 锚标记之间的菜单交互不一致

Inconsistent interaction in menu between <li> list item and <a> anchor tag

为什么 'Menu Item 2' 中的下拉列表 ul 没有与其父 li 元素的顶部绝对对齐?

将下拉列表 ul CSS 设置为:

position:absolute;
top:0;
left:0;

我希望它从父元素的左上角开始覆盖,即完全覆盖它。

一些令人困惑的症状:

我希望父菜单可以点击并且在某些情况下有一个下拉菜单。因此,在有下拉菜单的地方,父菜单 <li> 有一个 <a> 被填充以增加可点击区域。这也增加了包含 <li>,因为 li:hover 显示相同的填充区域。这按需工作。

但是,当显示下拉菜单并与 <li> 对齐时,<li> 似乎位于 之前 的位置,它被扩展了 <a>.当我在浏览器(Chrome 和 Firefox)中签入时,<li> 元素实际上并未填充与 <a> 相同的 space,因此下拉列表显示了一些 低于我想要的位置。

我知道我可以在绝对定位的下拉菜单中使用 top:SOME_NEGATIVE_OFFSET,但这感觉很麻烦,我想了解发生了什么?

这是我的第一个post,请放轻松:)

<!DOCTYPE html>
<html>
<head>
<title>DropDownTest</title>
<style>
ul{
  list-style:none;
  margin:0;
  padding:0;
}
li{
  display:block;
  position:relative;
}
li>a{
  padding:1rem;
  background-color:grey;
}
li>a:hover{
  background-color:lightgray;
}
.mainbar>li{
 float:left;
}
li.hasDrop:hover>ul{
  display:block;
}
.dropContent{
  display:none;
  position:absolute;
  top:0; /*not working as expected*/
  left:0;
  margin:0;/*thought this might have helped but no*/
  padding:0;
  z-index:1;
  list-style:none;
  min-width:100%;
}
.dropContent>li>a{
  display:block;
}
</style>
</head>
<body>
<div>
<ul class="mainbar">
  <li><a href="#">Menu Item 1</a></li>
    <li class="hasDrop">
      <a href="#">Menu Item 2</a>
      <ul class="dropContent">
        <li><a href="#">Sub 1</a></li>
        <li><a href="#">Sub 2</a></li>
        <li><a href="#">Sub 3</a></li>
      </ul>
  </li>
  <li><a href="#">Menu Item 3</a></li>
</ul>
</div>
</body>
</html>

发生这种情况是因为您的 a 元素正在作为内联元素进行填充。

修改这条规则:

li>a {
  padding: 1rem;
  background-color: grey;
  display: block; /* this*/
}

ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

li {
  display: block;
  position: relative;
}

li>a {
  padding: 1rem;
  background-color: grey;
  display: block; /* this*/
}

li>a:hover {
  background-color: lightgray;
}

.mainbar>li {
  float: left;
}

li.hasDrop:hover>ul {
  display: block;
}

.dropContent {
  display: none;
  position: absolute;
  top: 0;
  /*not working as expected*/
  left: 0;
  margin: 0;
  /*thought this might have helped but no*/
  padding: 0;
  z-index: 1;
  list-style: none;
  min-width: 100%;
}

.dropContent>li>a {
  display: block;
}
<div>
  <ul class="mainbar">
    <li><a href="#">Menu Item 1</a></li>
    
    <li class="hasDrop">
      <a href="#">Menu Item 2</a>
      <ul class="dropContent">
        <li><a href="#">Sub 1</a></li>
        <li><a href="#">Sub 2</a></li>
        <li><a href="#">Sub 3</a></li>
      </ul>
    </li>
    
    <li><a href="#">Menu Item 3</a></li>
  </ul>
</div>