带有子菜单的居中 CSS 菜单

Centered CSS menu with submenu

我想要一个带子菜单的居中 CSS 菜单。我可以做一部分(主菜单),但我在显示子菜单时遇到问题。当我悬停主菜单项以显示其子菜单时,问题开始了...

* {
  font-family:arial;
}

#menu {
    height: 65px;
    background: #f3f3f3;
    text-align: center;
}

#menu ul {
    list-style: none;
    text-align: center;
    margin: 0;
    padding: 0;
    position: relative;
    top: 15px
}

#menu ul li {
    list-style: none;
    text-align: center;
    margin-left: 5px;
    margin-right: 5px;
    display: inline;
}

#menu ul li a {
    padding: 4px 10px 6px 10px;
    border-radius: 3px;
    display: inline-block;
    color: #666;
    transition: all 0.3s;
}

#menu ul li a:hover, #menu ul li a:focus, #menu ul li a.active  {
    background: #58c071;
    color: white;
}

.submenu {
  display:none;
  position:absolute;
  top: 5px;
  width: 200px;
  background:white;
}

#menu li:hover > ul {
  display: block
}
<div id="menu" class="text-center">
  <ul>
    <li><a href="">Home</a></li>
    <li><a href="">Products</a>
      <ul class="submenu">
        <li><a href="">Product 1</a></li>
        <li><a href="">Product 2</a></li>
        <li><a href="">Product 3</a></li>
      </ul>
    </li>
    <li><a href="">Contact</a></li>
  </ul>
</div>

https://jsfiddle.net/e8wyp6et/1/

你有什么想法吗?

试试这个:

.submenu 通过 #menu ul li > .submenu 为您的 ul 获得 css 您的目标 .submenu 并将 position:relative 添加到 li

* {
  font-family:arial;
}

#menu {   height: 65px;
  background: #f3f3f3;
  text-align: center;
}

#menu ul {
  list-style: none;
  text-align: center;
  margin: 0;
  padding: 0;
  position: relative;
  top: 15px
}

#menu ul li {
  list-style: none;
  text-align: center;
  margin-left: 5px;
  margin-right: 5px;
  display: inline;
  position: relative;
}

#menu ul li a {
  padding: 4px 10px 6px 10px;
  border-radius: 3px;
  display: inline-block;
  color: #666;
  transition: all 0.3s;
}

#menu ul li a:hover, #menu ul li a:focus, #menu ul li a.active  {
  background: #58c071;
  color: white;
}

#menu ul li > .submenu {
  display:none;
  position:absolute;
  top: 24px;
  width: 200px;
  background:white;
  left:0;
}

#menu li:hover > ul {
  display: block
}
<div id="menu" class="text-center">
  <ul>
    <li><a href="">Home</a></li>
    <li><a href="">Products</a>
      <ul class="submenu">
        <li><a href="">Product 1</a></li>
        <li><a href="">Product 2</a></li>
        <li><a href="">Product 3</a></li>
      </ul>
    </li>
    <li><a href="">Contact</a></li>
  </ul>
</div>

您必须在子菜单的最近父菜单上有 position: relative;left: 0;在 .submenu 选择器上:

在您的问题中,它被添加到 #menu ul 中,该 #menu ul 相对于它定位子菜单。

#menu ul li  {
  position: relative;
}

.submenu {
  display:none;
  position:absolute;
  top: 5px;
  left: 0; /*this is needed to tell the submenu to align to the left of li*/
  width: 200px;
  background:white;
}

https://jsfiddle.net/Kyle_/e8wyp6et/2/

position: relativeli 而不是 ul

Updated code

您的 submenu 属性正在被覆盖,这里的 display: inline 引起了麻烦。

您的 ul li a 代码也在影响 submenu

中的 li a

尝试更改以下代码:

* {
  font-family:arial;
}

#menu {
    height: 65px;
    background: #f3f3f3;
    text-align: center;
}

#menu ul {
    list-style: none;
    text-align: center;
    margin: 0;
    padding: 0;
    position: relative;
    top: 15px
}

#menu ul li {
    list-style: none;
    text-align: center;
    margin-left: 5px;
    margin-right: 5px;
    display: inline-block;
    vertical-align: top;
}

#menu ul li a {
    padding: 4px 30px 6px 30px;
    border-radius: 3px;
    display: inline-block;
    color: #666;
    transition: all 0.3s;
}

.submenu li a {
    padding: 10px 0 !important;
}

#menu ul li a:hover, #menu ul li a:focus, #menu ul li a.active  {
    background: #58c071;
    color: white;
}

.submenu {
  display:none;
    width: 120px;
    background: white;
}

#menu li:hover > ul {
  display: block
}
<div id="menu" class="text-center">
  <ul>
    <li><a href="">Home</a></li>
    <li><a href="">Products</a>
      <ul class="submenu">
        <li><a href="">Product 1</a></li>
        <li><a href="">Product 2</a></li>
        <li><a href="">Product 3</a></li>
      </ul>
    </li>
    <li><a href="">Contact</a></li>
  </ul>
</div>