Bootstrap 下拉菜单
概述
Bootstrap 下拉菜单是一个可切换的上下文覆盖层,用于显示链接列表等内容。它们通过 Bootstrap 的下拉 JavaScript 插件实现交互。
基本下拉菜单
html
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
下拉按钮
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
<li><a class="dropdown-item" href="#">其他操作</a></li>
</ul>
</div>下拉菜单变体
html
<!-- Primary -->
<div class="btn-group">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Primary
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
<li><a class="dropdown-item" href="#">其他操作</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">分隔链接</a></li>
</ul>
</div>
<!-- Success -->
<div class="btn-group">
<button type="button" class="btn btn-success dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
Success
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>分割按钮下拉菜单
html
<div class="btn-group">
<button type="button" class="btn btn-primary">操作</button>
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">切换下拉菜单</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
<li><a class="dropdown-item" href="#">其他操作</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">分隔链接</a></li>
</ul>
</div>尺寸
html
<!-- 大尺寸 -->
<div class="btn-group">
<button class="btn btn-secondary btn-lg dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
大按钮
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>
<!-- 小尺寸 -->
<div class="btn-group">
<button class="btn btn-secondary btn-sm dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
小按钮
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>方向
html
<!-- 向上 -->
<div class="btn-group dropup">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
向上
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>
<!-- 向右 -->
<div class="btn-group dropend">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
向右
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>
<!-- 向左 -->
<div class="btn-group dropstart">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
向左
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>菜单项
html
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">常规链接</a></li>
<li><a class="dropdown-item active" href="#">活动链接</a></li>
<li><a class="dropdown-item disabled" href="#">禁用链接</a></li>
</ul>菜单对齐
html
<!-- 右对齐 -->
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
右对齐菜单
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>
<!-- 响应式对齐 -->
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown" data-bs-display="static" aria-expanded="false">
响应式对齐
</button>
<ul class="dropdown-menu dropdown-menu-lg-end">
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
</ul>
</div>菜单内容
html
<ul class="dropdown-menu">
<!-- 标题 -->
<li><h6 class="dropdown-header">下拉菜单标题</h6></li>
<li><a class="dropdown-item" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
<!-- 分隔线 -->
<li><hr class="dropdown-divider"></li>
<!-- 文本 -->
<li><span class="dropdown-item-text">下拉菜单文本</span></li>
<!-- 表单 -->
<li>
<form class="px-4 py-3">
<div class="mb-3">
<label for="exampleDropdownFormEmail1" class="form-label">邮箱地址</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail1" placeholder="email@example.com">
</div>
<div class="mb-3">
<label for="exampleDropdownFormPassword1" class="form-label">密码</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword1" placeholder="密码">
</div>
<div class="mb-3">
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck">
<label class="form-check-label" for="dropdownCheck">
记住我
</label>
</div>
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>
</li>
</ul>自动关闭行为
html
<!-- 默认行为:点击外部或内部都关闭 -->
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="true" aria-expanded="false">
默认下拉菜单
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">菜单项</a></li>
<li><a class="dropdown-item" href="#">菜单项</a></li>
</ul>
</div>
<!-- 点击外部关闭 -->
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
点击外部关闭
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">菜单项</a></li>
<li><a class="dropdown-item" href="#">菜单项</a></li>
</ul>
</div>
<!-- 点击内部关闭 -->
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="inside" aria-expanded="false">
点击内部关闭
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">菜单项</a></li>
<li><a class="dropdown-item" href="#">菜单项</a></li>
</ul>
</div>
<!-- 手动关闭 -->
<div class="btn-group">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="false" aria-expanded="false">
手动关闭
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">菜单项</a></li>
<li><a class="dropdown-item" href="#">菜单项</a></li>
</ul>
</div>深色下拉菜单
html
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
深色下拉菜单
</button>
<ul class="dropdown-menu dropdown-menu-dark">
<li><a class="dropdown-item active" href="#">操作</a></li>
<li><a class="dropdown-item" href="#">另一个操作</a></li>
<li><a class="dropdown-item" href="#">其他操作</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">分隔链接</a></li>
</ul>
</div>实际示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap 下拉菜单示例</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container my-5">
<h1>Bootstrap 下拉菜单示例</h1>
<!-- 用户菜单 -->
<h2>用户菜单</h2>
<div class="dropdown mb-4">
<button class="btn btn-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
<svg width="16" height="16" fill="currentColor" class="bi bi-person-circle me-2" viewBox="0 0 16 16">
<path d="M11 6a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
<path fill-rule="evenodd" d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8zm8-7a7 7 0 0 0-5.468 11.37C3.242 11.226 4.805 10 8 10s4.757 1.225 5.468 2.37A7 7 0 0 0 8 1z"/>
</svg>
张三
</button>
<ul class="dropdown-menu">
<li><h6 class="dropdown-header">账户设置</h6></li>
<li><a class="dropdown-item" href="#">个人资料</a></li>
<li><a class="dropdown-item" href="#">账户设置</a></li>
<li><a class="dropdown-item" href="#">隐私设置</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">帮助中心</a></li>
<li><a class="dropdown-item text-danger" href="#">退出登录</a></li>
</ul>
</div>
<!-- 操作菜单 -->
<h2>操作菜单</h2>
<div class="btn-group mb-4">
<button type="button" class="btn btn-success">保存</button>
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
<span class="visually-hidden">切换下拉菜单</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">保存并继续</a></li>
<li><a class="dropdown-item" href="#">保存为草稿</a></li>
<li><a class="dropdown-item" href="#">保存为模板</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">另存为...</a></li>
</ul>
</div>
<!-- 语言选择 -->
<h2>语言选择</h2>
<div class="dropdown mb-4">
<button class="btn btn-outline-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
🇨🇳 简体中文
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item active" href="#">🇨🇳 简体中文</a></li>
<li><a class="dropdown-item" href="#">🇭🇰 繁體中文</a></li>
<li><a class="dropdown-item" href="#">🇺🇸 English</a></li>
<li><a class="dropdown-item" href="#">🇯🇵 日本語</a></li>
<li><a class="dropdown-item" href="#">🇰🇷 한국어</a></li>
</ul>
</div>
<!-- 筛选菜单 -->
<h2>筛选菜单</h2>
<div class="dropdown mb-4">
<button class="btn btn-outline-primary dropdown-toggle" type="button" data-bs-toggle="dropdown" data-bs-auto-close="outside" aria-expanded="false">
筛选条件
</button>
<ul class="dropdown-menu">
<li>
<form class="px-4 py-3">
<div class="mb-3">
<label class="form-label">价格范围</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="price1">
<label class="form-check-label" for="price1">
¥0 - ¥100
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="price2">
<label class="form-check-label" for="price2">
¥100 - ¥500
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="price3">
<label class="form-check-label" for="price3">
¥500+
</label>
</div>
</div>
<div class="mb-3">
<label class="form-label">品牌</label>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="brand1">
<label class="form-check-label" for="brand1">
品牌 A
</label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="brand2">
<label class="form-check-label" for="brand2">
品牌 B
</label>
</div>
</div>
<button type="submit" class="btn btn-primary btn-sm">应用筛选</button>
<button type="reset" class="btn btn-outline-secondary btn-sm">重置</button>
</form>
</li>
</ul>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>JavaScript 方法
javascript
// 获取下拉菜单实例
const dropdownElementList = document.querySelectorAll('.dropdown-toggle')
const dropdownList = [...dropdownElementList].map(dropdownToggleEl => new bootstrap.Dropdown(dropdownToggleEl))
// 显示下拉菜单
dropdown.show()
// 隐藏下拉菜单
dropdown.hide()
// 切换下拉菜单
dropdown.toggle()
// 更新下拉菜单位置
dropdown.update()
// 销毁下拉菜单
dropdown.dispose()事件
javascript
const myDropdown = document.getElementById('myDropdown')
myDropdown.addEventListener('show.bs.dropdown', event => {
// 下拉菜单即将显示
})
myDropdown.addEventListener('shown.bs.dropdown', event => {
// 下拉菜单已显示
})
myDropdown.addEventListener('hide.bs.dropdown', event => {
// 下拉菜单即将隐藏
})
myDropdown.addEventListener('hidden.bs.dropdown', event => {
// 下拉菜单已隐藏
})最佳实践
1. 可访问性
html
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
下拉按钮
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<li><a class="dropdown-item" href="#">操作</a></li>
</ul>
</div>2. 禁用项
html
<ul class="dropdown-menu">
<li><a class="dropdown-item disabled" href="#" tabindex="-1" aria-disabled="true">禁用操作</a></li>
</ul>