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

如何用JavaScript/JQuery在HTML的select框中实现下拉子选项?

实现带层级子选项的下拉菜单

原生HTML的<select>标签不支持直接嵌套子选项,没法让单个<option>展开显示子项。要实现你要的效果,有两种常用方案:


方案1:两级联动的下拉框

通过两个<select>实现联动,当选择第一个下拉里的"Saab"时,第二个下拉显示对应的子选项,其他选项则隐藏第二个下拉。

代码示例:

<!-- 主下拉框 -->
<select id="mainCars" onchange="toggleSubOptions()">
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="opel">Opel</option>
  <option value="audi">Audi</option>
</select>

<!-- 子下拉框,默认隐藏 -->
<select id="saabSub" style="display: none;">
  <option value="saab93">Saab 9-3</option>
  <option value="saab95">Saab 9-5</option>
  <option value="saab97x">Saab 9-7X</option>
</select>

<script>
function toggleSubOptions() {
  const mainSelect = document.getElementById('mainCars');
  const subSelect = document.getElementById('saabSub');
  
  // 当选中Saab时显示子下拉,否则隐藏
  if (mainSelect.value === 'saab') {
    subSelect.style.display = 'inline-block';
  } else {
    subSelect.style.display = 'none';
  }
}
</script>

方案2:自定义层级下拉组件

用HTML、CSS和JS模拟一个支持层级展开的下拉菜单,视觉上更接近你要的“点击某个选项展开子项”的效果。

代码示例:

<style>
.custom-dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-btn {
  padding: 8px 12px;
  border: 1px solid #ccc;
  border-radius: 4px;
  background: white;
  cursor: pointer;
  min-width: 150px;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  border: 1px solid #ccc;
  border-top: none;
  border-radius: 0 0 4px 4px;
  background: white;
  list-style: none;
  padding: 0;
  margin: 0;
  display: none;
  width: 100%;
}

.dropdown-menu.active {
  display: block;
}

.dropdown-item {
  padding: 8px 12px;
  cursor: pointer;
}

.dropdown-item:hover {
  background: #f0f0f0;
}

.sub-menu {
  list-style: none;
  padding: 0;
  margin: 0;
  display: none;
  background: #f8f8f8;
}

.sub-menu.active {
  display: block;
}

.sub-menu .dropdown-item {
  padding-left: 24px;
}
</style>

<div class="custom-dropdown">
  <div class="dropdown-btn" id="dropdownBtn">选择车型</div>
  <ul class="dropdown-menu" id="dropdownMenu">
    <li class="dropdown-item" data-value="volvo">Volvo</li>
    <li class="dropdown-item has-submenu">
      <span>Saab</span>
      <ul class="sub-menu">
        <li class="dropdown-item" data-value="saab93">Saab 9-3</li>
        <li class="dropdown-item" data-value="saab95">Saab 9-5</li>
        <li class="dropdown-item" data-value="saab97x">Saab 9-7X</li>
      </ul>
    </li>
    <li class="dropdown-item" data-value="opel">Opel</li>
    <li class="dropdown-item" data-value="audi">Audi</li>
  </ul>
</div>

<script>
const dropdownBtn = document.getElementById('dropdownBtn');
const dropdownMenu = document.getElementById('dropdownMenu');
const hasSubmenuItems = document.querySelectorAll('.has-submenu');

// 点击主按钮切换下拉菜单显示
dropdownBtn.addEventListener('click', () => {
  dropdownMenu.classList.toggle('active');
});

// 点击带子菜单的项,切换子菜单显示
hasSubmenuItems.forEach(item => {
  item.addEventListener('click', (e) => {
    e.stopPropagation();
    const subMenu = item.querySelector('.sub-menu');
    subMenu.classList.toggle('active');
  });
});

// 点击菜单项后更新按钮文本,并关闭菜单
document.querySelectorAll('.dropdown-item').forEach(item => {
  if (!item.closest('.has-submenu')) {
    item.addEventListener('click', () => {
      dropdownBtn.textContent = item.textContent;
      dropdownMenu.classList.remove('active');
      // 这里可以获取选中的值:item.dataset.value
      console.log('选中的值:', item.dataset.value);
    });
  }
});

// 点击外部区域关闭菜单
document.addEventListener('click', (e) => {
  if (!e.target.closest('.custom-dropdown')) {
    dropdownMenu.classList.remove('active');
    document.querySelectorAll('.sub-menu').forEach(sub => sub.classList.remove('active'));
  }
});
</script>

两种方案各有优势:

  • 联动下拉框实现简单,适合表单场景,兼容性好;
  • 自定义组件视觉效果更灵活,能完全实现“点击父选项展开子项”的交互,但需要自己维护样式和逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:47:34