You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用HTML、CSS、SCSS实现导航栏下拉菜单?现有代码问题求助

作品集导航栏下拉菜单实现方案

问题描述

制作作品集网站导航栏,需在portfolio标签实现下拉菜单。为列表项添加样式时,用div包裹列表项导致嵌套列表被错误包含,SCSS开发中遇到样式特异性问题,无法正确嵌套样式完成下拉功能。现有代码如下:

原HTML代码

<nav>
  <div class="nav-container">
    <div class="nav-logo">
      <a href="index.html"><img class="logo" src="/img/logo.svg" alt="logo"></a>
    </div>
    <div class="search-container">
      <div class="fa fa-search search-icon"></div>
      <div class="input-container"><input type="text" placeholder="search"></div>
      <div class="fa fa-times cross"> </div>
    </div>
    <div class="nav-boxes">
      <ul>
        <div class="nav-link-boxes">
          <li class="links"><a href="home.html">home</a></li>
        </div>
        <div class="nav-link-boxes">
          <li class="links"><a href="catalog.html">catalog</a></li>
        </div>
        <div class="nav-link-boxes dropdown-menu">
          <li>
            <div class="links"><a href="paintings.html">portfolio</a></div>
        </div>
        <ul class="dropdown">
          <div class="nav-link-boxes dropdown-links">
            <li>embroidery</li>
          </div>
          <div class="nav-link-boxes dropdown-links">
            <li>vector</li>
          </div>
        </ul>
        </li>
        <div class="nav-link-boxes">
          <li class="links"><a href="#">contact</a></li>
        </div>
      </ul>
    </div>
    <img class="login" src="./img/accounticon.svg" alt="login">
  </div>
</nav>

原SCSS代码

@import "var";
.nav {
  &-container {
    z-index: 1;
    background: $navbar-gradient;
    margin-top: 2rem;
    width: 95%;
    display: flex;
    position: fixed;
    justify-content: space-between;
    align-items: center;
    border-radius: 4rem;
    height: 6rem;
    left: 1.1rem;

    .search-container {
      display: flex;
      align-items: center;
      justify-content: space-between;
      text-align: center;
      background: $search;
      padding: 1rem;
      border-radius: 2rem;
      /* box-shadow: 5px 5px 20px rgb(255, 249, 238); */

      input {
        display: flex;
        margin: auto auto;
        margin-left: 1rem;
        // /* width:500px; */
        border: none;
        outline: none;
        background: $search;
        align-items: center;
        justify-content: flex-start;

        ::placeholder {
          color: $placeholder;
        }
      }
    }

    .nav-boxes {
      ul .boxes {
        display: flex;
        margin-right: 2rem;
        margin-left: 2rem;
        align-items: center;
        list-style-type: none;
        a {
          font-family: "Exo 2", sans-serif;
          text-decoration: none;
          font-size: 1.4rem;
          color: $dark-primary;
          font-weight: 600;
          &:link,
          &:visited {
            border-radius: 2rem;
            transition: all 0.9s;
          }
        }
      }
    }

    .links {
      margin: 0 0.4rem;
    }

    .nav-link-boxes {
      padding: 0.5rem;
      margin-right: 0.7rem;
      background-color: $nav-buttons;
      border-radius: 3rem;
      padding-bottom: 0.8rem;

      &:hover {
        transform: translateY(-0.3rem);
        box-shadow: 0 1rem 2rem $white;
      }
      &:active {
        transform: translateY(-0.1rem);
        box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.3);
      }
    }

    .login {
      height: 9rem;
      overflow: hidden;
    }
  }

  &-logo {
    padding: 1.5rem;
    margin-top: 0.5rem;
    .logo {
      height: 5.2rem;
    }
  }
}

解决方案

1. 修正HTML结构(符合语义规范)

<ul>的直接子元素必须是<li>,不能直接嵌套<div>,调整结构将样式容器放入<li>内部,同时修复标签闭合错误:

<nav>
  <div class="nav-container">
    <div class="nav-logo">
      <a href="index.html"><img class="logo" src="/img/logo.svg" alt="logo"></a>
    </div>
    <div class="search-container">
      <div class="fa fa-search search-icon"></div>
      <div class="input-container"><input type="text" placeholder="search"></div>
      <div class="fa fa-times cross"></div>
    </div>
    <div class="nav-boxes">
      <ul class="main-nav">
        <li>
          <div class="nav-link-boxes">
            <a href="home.html" class="links">home</a>
          </div>
        </li>
        <li>
          <div class="nav-link-boxes">
            <a href="catalog.html" class="links">catalog</a>
          </div>
        </li>
        <li class="dropdown-menu">
          <div class="nav-link-boxes">
            <a href="paintings.html" class="links">portfolio</a>
          </div>
          <!-- 下拉菜单 -->
          <ul class="dropdown">
            <li>
              <div class="nav-link-boxes dropdown-links">
                <a href="#embroidery">embroidery</a>
              </div>
            </li>
            <li>
              <div class="nav-link-boxes dropdown-links">
                <a href="#vector">vector</a>
              </div>
            </li>
          </ul>
        </li>
        <li>
          <div class="nav-link-boxes">
            <a href="#" class="links">contact</a>
          </div>
        </li>
      </ul>
    </div>
    <img class="login" src="./img/accounticon.svg" alt="login">
  </div>
</nav>

2. 完善SCSS样式(解决特异性+实现下拉交互)

调整嵌套逻辑,修复样式优先级问题,添加下拉菜单的显示/隐藏、定位样式:

@import "var";
.nav {
  &-container {
    z-index: 1;
    background: $navbar-gradient;
    margin-top: 2rem;
    width: 95%;
    display: flex;
    position: fixed;
    justify-content: space-between;
    align-items: center;
    border-radius: 4rem;
    height: 6rem;
    left: 1.1rem;

    .search-container {
      display: flex;
      align-items: center;
      justify-content: space-between;
      text-align: center;
      background: $search;
      padding: 1rem;
      border-radius: 2rem;

      input {
        display: flex;
        margin: auto auto;
        margin-left: 1rem;
        border: none;
        outline: none;
        background: $search;
        align-items: center;
        justify-content: flex-start;

        ::placeholder {
          color: $placeholder;
        }
      }
    }

    .nav-boxes {
      .main-nav {
        display: flex;
        align-items: center;
        list-style-type: none;
        margin: 0;
        padding: 0;

        // 主导航项间距
        > li {
          position: relative;
          margin: 0 0.5rem;
        }

        a {
          font-family: "Exo 2", sans-serif;
          text-decoration: none;
          font-size: 1.4rem;
          color: $dark-primary;
          font-weight: 600;
          transition: all 0.3s ease;
        }
      }
    }

    .links {
      margin: 0 0.4rem;
    }

    .nav-link-boxes {
      padding: 0.5rem 1.2rem;
      background-color: $nav-buttons;
      border-radius: 3rem;
      display: inline-block;

      &:hover {
        transform: translateY(-0.3rem);
        box-shadow: 0 1rem 2rem $white;
      }
      &:active {
        transform: translateY(-0.1rem);
        box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.3);
      }
    }

    // 下拉菜单核心样式
    .dropdown-menu {
      // 作为下拉菜单的定位父容器
      position: relative;

      // 默认隐藏下拉菜单
      .dropdown {
        position: absolute;
        top: 100%;
        left: 0;
        list-style: none;
        padding: 0.8rem 0;
        margin: 0.5rem 0 0;
        background-color: $navbar-gradient;
        border-radius: 1.5rem;
        box-shadow: 0 0.5rem 1.5rem rgba(0,0,0,0.1);
        display: none;
        z-index: 100;
      }

      // hover时显示下拉菜单
      &:hover .dropdown {
        display: block;
      }

      // 下拉项样式调整
      .dropdown-links {
        margin: 0.3rem 1rem;
        padding: 0.5rem 1rem;
        border-radius: 2rem;

        &:hover {
          transform: none;
          box-shadow: 0 0.3rem 0.8rem rgba(255,255,255,0.5);
        }
      }
    }

    .login {
      height: 9rem;
      overflow: hidden;
    }
  }

  &-logo {
    padding: 1.5rem;
    margin-top: 0.5rem;
    .logo {
      height: 5.2rem;
    }
  }
}

关键调整说明

  • 修正HTML结构,确保<ul>只直接嵌套<li>,符合语义规范,避免样式混乱
  • 给.dropdown-menu设置position: relative,让下拉菜单基于它绝对定位
  • 默认隐藏.dropdown,通过:hover触发显示,避免影响页面布局
  • 调整下拉项的hover样式,适配下拉菜单的紧凑布局
  • 优化SCSS嵌套逻辑,提升样式优先级的同时保持代码整洁

内容的提问来源于stack exchange,提问作者RyaanKn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:45:55