如何使用 CSS 定位下拉菜单?

How do I position a dropdown menu with CSS?

提问人:VeroDet 提问时间:11/14/2023 最后编辑:j08691VeroDet 更新时间:11/14/2023 访问量:46

问:

我正在为一个班级创建一个模拟网站。我希望其中一个导航项有一个下拉菜单。但是,我遇到了下拉菜单的位置问题。

它的默认位置正对着导航项,但我希望两者之间只有一点空间。但是,当我将 margin-top 添加到下拉内容的容器时,下拉内容无法再滚动。我知道造成这种情况的原因 - 额外的空间阻止了内容的可滚动 - 但我不知道如何解决它。

.nav-items li {
  list-style-type: none;
  display: inline;
}

.dropdown li {
  list-style-type: none;
  display: block;
}

.services {
  position: relative;
}

.services-list {
  position: absolute;
  display: none;
  background-color: #f1f1ed;
  border: 1px solid black;
  top: 100%;
}

#services a {
  text-decoration: none;
  color: black;
}

#services:hover .services-list {
  display: block;
  position: absolute;
}
<ul class="nav-items">
  <li>About</li>
  <li id="services"><a href="#">Services</a>
    <div class="services dropdown">
      <ul class="services-list">

        <li>Advocacy</li>
        <li>Brochures</li>
        <li>Speaker program</li>
        <li>Helpline</li>
      </ul>
    </div>
  </li>
  <li>TransPages</li>
  <li>Events</li>
  <li>Our Supporters</li>
  <li>Get Involved</li>
  <li>Contact</li>

HTML CSS 下拉菜单 定位 边距

评论


答:

2赞 user22379202 11/14/2023 #1

我希望这个更新的 css 能解决您的问题。我还注释掉了你不必要的风格。

* {
  margin: 0;
  padding: 0;
}

.nav-items {
  display: flex;
  justify-content: space-between;
  padding: 2rem 4rem;
}

.nav-items li {
  list-style-type: none;
  /* display: inline; */
}

.dropdown li {
  list-style-type: none;
  /* display: block; */
}

.services {
  position: relative;
}

.services-list {
  position: absolute;
  display: none;
  background-color: #f1f1ed;
  border: 1px solid black;
  top: 100%;
}

.services-list li {
  padding: 1rem;
}

#services a {
  text-decoration: none;
  color: black;
}

#services:hover .services-list {
  display: block;
  /* position: absolute; */
}

评论

0赞 VeroDet 11/14/2023
谢谢,这很好用!我遇到的问题是在列表项( <li id=“services”><a href=“#”>Services</a>)和下拉菜单之间添加一个空格。如果我在 .services-list 中添加边距,该列表突然不再可滚动。任何帮助/见解/指导将不胜感激。
0赞 11/14/2023
如果向 services-list 添加边距会产生问题,您可以将 services div 设置为弹性框并使用 gap 属性,我会在另一个答案中附加它的代码。另外,您能否介意通过单击该复选标记将我的答案标记为已接受:)
1赞 Girish Agarwal 11/14/2023 #2

您可以使用此 html 和 css

[HTML全文]

<ul class="nav-items">
  <li>
    <a href="#">About</a>
  </li>
  <li class="dropdown">
    <a href="#">Services</a>
    <ul class="dropdown-menu">

        <li>Advocacy</li>
        <li>Brochures</li>
        <li>Speaker program</li>
        <li>Helpline</li>
      </ul>
  </li>
  <li>
    <a href="#">TransPages</a>
  </li>
  <li>
    <a href="#">Events</a>
  </li>
  <li>
    <a href="#">Our Supporters</a>
  </li>
  <li>
    <a href="#">Get Involved</a>
  </li>
  <li>
    <a href="#">Contact</a>
  </li>
</ul>

CSS的

.nav-items {
    margin: 0;
    list-style: none;
    padding: 0;
}

.nav-items li {
    position: relative;
    display: inline-block;
    padding: 5px 10px;
}
.nav-items li a {
    text-decoration: none;
}
.nav-items > li .dropdown-menu {
    position: absolute;
    top: 100%;
    left: 0;
    margin: 0;
    list-style: none;
    padding: 5px 10px;
    width: 150px;
    border: 1px solid #2c2c2c;
    border-radius: 2px;
    display: none;
    background-color: #f2f2f2;
}

.nav-items > li .dropdown-menu li {
    width: 100%;
}
.nav-items > li:hover .dropdown-menu {
    display: block
}
0赞 user22379202 11/14/2023 #3

下面是在列表项和下拉菜单之间留出一些空间的代码。

#services {
 display: flex;
 flex-direction: column;
 gap: 1.5rem;
}