html原生不支持树形结构,可通过缩进模拟2层层级或用css+js构建自定义树形下拉,推荐使用element plus的、ant design的等成熟组件库。

HTML 原生的 <select></select> 标签不支持真正的树形层级结构(如多级嵌套、可展开/折叠的节点),但可以通过视觉模拟和语义化方式实现“类树形下拉选择”的效果。常见做法是利用 <optgroup></optgroup> 分组 + 缩进文本 + 自定义样式,或结合 JavaScript 实现交互式树形下拉组件。
用
<optgroup></optgroup> 是 HTML 原生支持的分组标签,虽不能嵌套,但可配合缩进与标识符(如 ▸、—)表达层级关系。适合 2 层结构(父级 → 子项):
<select><optgroup label="前端技术"> <option value="html">HTML</option> <option value="css">CSS</option> <option value="js">JavaScript</option> </optgroup> <optgroup label="▸ 框架库"> <option value="vue"> Vue.js</option> <option value="react"> React</option> <option value="angular"> Angular</option> </optgroup></select>
- 用
▸或▶在label中提示子组 - 子项用
或 Unicode 空格(如 )缩进,增强视觉层级感 - 注意:浏览器对
<optgroup></optgroup>内部<option></option>的样式控制有限,无法加图标或响应点击展开
用 CSS + 自定义下拉模拟树形结构
更灵活的方式是隐藏原生 <select></select>,用 <div> + <code><ul>/<li>
</ul> 构建可展开的树,并通过 JS 同步选中值:
- 用
aria-expanded、aria-hidden保证可访问性 - 每层
<li>包含开关按钮(▶/▼)、文本、可选的子<ul></ul> - 点击父节点可展开/收起子菜单;点击叶子节点触发选择并关闭面板
- 需用 JS 绑定事件、维护展开状态、同步隐藏的
<input type="hidden">值
推荐使用成熟 UI 库(省时可靠)
实际项目中,建议直接集成支持树选择器的组件库,例如:
-
Element Plus:
<el-cascader></el-cascader>(级联选择)或<el-tree></el-tree>+show-checkbox+check-strictly -
Ant Design:
<treeselect></treeselect>支持搜索、异步加载、多选、父子联动 -
Bootstrap + jQuery 插件:如
bootstrap-treeview(轻量,适合静态数据)
这些方案已处理好键盘导航(方向键、Enter)、焦点管理、屏幕阅读器兼容等细节,避免重复造轮子。
关键注意事项
无论自研还是用库,需关注以下几点:
- 移动端触控区域要足够大,避免误操作
- 大数据量时务必支持虚拟滚动或懒加载,防止卡顿
- 选中状态需清晰反馈(高亮、复选框、路径高亮)
- 保持表单提交时能正确传递最终选中的 value(字符串或数组)











