JS 特效 词条目录
前端Wiki/JS 特效/导航特效/桌面导航

下拉菜单

下拉菜单是导航特效的入门款:默认只显示一级菜单,悬停或点击“产品”时展开二级面板。CSS :hover 版零 JS 但移动端不友好;JS click 版稳定可控,配合 aria-expanded 兼顾可访问性。

进阶:展开/收起加 max-height 或 opacity 过渡;移出整个菜单区域才收起(用 mouseleave 挂在父级而非按钮上);移动端改成点击展开。

  • 点击版逻辑:toggle .open 类 + aria-expanded 同步
  • 收起时机:点页面空白处(document click)或移出父容器
  • max-height 过渡比 height:auto 好处理(auto 不能过渡)
HTML
<style>
.nav { display: flex; gap: 8px; justify-content: center; padding: 24px 0;
       font-family: "Microsoft YaHei", sans-serif; }
.nav .item { position: relative; }
.nav .btn { padding: 10px 20px; border: none; border-radius: 8px;
            background: #f0e6ff; color: #333; cursor: pointer; font-size: 14px; }
.nav .btn[aria-expanded="true"] { background: #d2a8ff; color: #fff; }
.menu { position: absolute; top: calc(100% + 6px); left: 0; min-width: 160px;
        background: #fff; border-radius: 10px; box-shadow: 0 10px 30px rgba(0,0,0,.15);
        padding: 6px; opacity: 0; visibility: hidden;
        transform: translateY(8px); transition: .25s ease; }
.menu.open { opacity: 1; visibility: visible; transform: translateY(0); }
.menu a { display: block; padding: 9px 14px; border-radius: 6px;
          color: #333; text-decoration: none; font-size: 14px; }
.menu a:hover { background: #f0e6ff; }
</style>
<div class="nav">
  <div class="item"><button class="btn">首页</button></div>
  <div class="item">
    <button class="btn" aria-expanded="false">产品 ▾</button>
    <div class="menu">
      <a href="#">产品 A</a><a href="#">产品 B</a><a href="#">产品 C</a>
    </div>
  </div>
  <div class="item"><button class="btn">关于</button></div>
</div>
<script>
document.querySelectorAll('.nav .item').forEach(function (item) {
  var btn = item.querySelector('.btn[aria-expanded]');
  if (!btn) return;
  var menu = item.querySelector('.menu');
  btn.addEventListener('click', function (e) {
    e.stopPropagation();
    var open = menu.classList.toggle('open');
    btn.setAttribute('aria-expanded', open);
  });
});
document.addEventListener('click', function () {          // 点空白收起
  document.querySelectorAll('.menu.open').forEach(function (m) {
    m.classList.remove('open');
    m.parentNode.querySelector('.btn').setAttribute('aria-expanded', 'false');
  });
});
</script>
本节要点下拉菜单 = toggle .open + 空白点击收起 + max-height/opacity 过渡;aria-expanded 照顾无障碍。
🔗 相关词条DOMHTMLCSS 特效