Bootstrap: 导航栏、下拉菜单与 Offcanvas
最后更新:2026-08-26
1. 本课导读
(1) 前置知识
- 掌握 12 列网格系统和响应式列用法(来自第七课)
- 熟悉
offset-*偏移和 gutter 沟槽控制
(2) 🎯 你将学到
- 掌握导航栏基础结构(navbar > container > navbar-nav)
- 学会
navbar-expand-*实现响应式折叠 - 掌握下拉菜单(dropdown)组件的使用方法
- 掌握 Offcanvas 侧滑面板的配置与方向控制
- 能独立制作一个完整的企业站响应式导航栏
(3) 痛点
Bob 的公司网站需要在桌面端显示完整水平导航,在手机端折叠为汉堡菜单——如果用原生 HTML/CSS/JS 实现响应式导航栏,需要大量代码处理布局、事件和断点。
(4) 解法
用 Bootstrap 的 navbar-expand-* 加上汉堡按钮,10 行代码即可实现。Bootstrap 的导航栏组件集成了响应式折叠、下拉菜单和侧滑面板,一套代码适配移动端和桌面端。
理解方式: 导航栏 = 容器 + 品牌标识 + 折叠面板 + 可交互组件(下拉/搜索/按钮)。
navbar-expand-*控制何时展开为水平导航,断点以下自动折叠。
(5) 收益
使用 Bootstrap 导航栏后,Bob 只用十几行代码就完成了完整的响应式导航——桌面端水平展开、手机端折叠为汉堡菜单,还内置了下拉菜单支持。
2. 导航栏基础结构
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<div class="container">
<a class="navbar-brand" href="#">Brand</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="mainNav">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">Features</a></li>
<li class="nav-item"><a class="nav-link" href="#">Pricing</a></li>
</ul>
</div>
</div>
</nav>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
(1) 关键组件
| 组件 | class | 作用 |
|---|---|---|
| 导航容器 | navbar |
声明导航栏,提供 flex 布局 |
| 展开断点 | navbar-expand-lg |
lg 及以上水平展开,以下折叠 |
| 品牌 | navbar-brand |
logo / 站点名 |
| 汉堡按钮 | navbar-toggler |
手机端显示,点击触发折叠 |
| 折叠面板 | collapse navbar-collapse |
被汉堡按钮控制的菜单面板 |
| 导航列表 | navbar-nav |
导航链接列表(flex) |
| 链接项 | nav-item / nav-link |
单个导航链接 |
▶ 示例:主题色导航栏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Navbar Demo</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">Alice's Site</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navDark">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navDark">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">Projects</a></li>
<li class="nav-item"><a class="nav-link" href="#">Blog</a></li>
<li class="nav-item"><a class="nav-link" href="#">Contact</a></li>
</ul>
</div>
</div>
</nav>
<nav class="navbar navbar-expand-lg bg-primary navbar-dark mt-2">
<div class="container">
<a class="navbar-brand" href="#">Brand</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navLight">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navLight">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link" href="#">Link 1</a></li>
<li class="nav-item"><a class="nav-link" href="#">Link 2</a></li>
<li class="nav-item"><a class="nav-link" href="#">Link 3</a></li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<p>Resize the browser to see the navbar collapse on smaller screens.</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。 主题色方案: | 背景 | 文字 | 效果 | |:-----|:-----|:------| |
bg-dark navbar-dark| 浅色文字 | 深色导航栏 | |bg-light navbar-light| 深色文字 | 浅色导航栏 | |bg-primary navbar-dark| 浅色文字 | 彩色品牌导航栏 |
3. 导航栏增强内容
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">
<img src="https://via.placeholder.com/30x30" alt="Logo" class="d-inline-block align-text-top me-2">
Bootstrap
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navExt">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navExt">
<ul class="navbar-nav me-auto">
<li class="nav-item"><a class="nav-link active" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">Docs</a></li>
</ul>
<form class="d-flex mx-2" role="search">
<input class="form-control me-2" type="search" placeholder="Search">
<button class="btn btn-outline-light" type="submit">Search</button>
</form>
<a href="#" class="btn btn-success">Sign Up</a>
</div>
</div>
</nav>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
4. 下拉菜单
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
Dropdown
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#">Separated link</a></li>
</ul>
</li>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
| 元素 | class | 说明 |
|---|---|---|
| 触发器 | dropdown-toggle |
带箭头指示器的下拉按钮 |
| 菜单容器 | dropdown-menu |
下拉面板 |
| 菜单项 | dropdown-item |
单个选项 |
| 分隔线 | dropdown-divider |
菜单分组分隔 |
| 禁用项 | dropdown-item disabled |
灰色不可点 |
(1) 下拉变体
<div class="btn-group dropup">
<button class="btn btn-secondary dropdown-toggle" data-bs-toggle="dropdown">Dropup</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Item 1</a></li>
<li><a class="dropdown-item" href="#">Item 2</a></li>
</ul>
</div>
<ul class="dropdown-menu">
<li><h6 class="dropdown-header">Account</h6></li>
<li><a class="dropdown-item" href="#">Profile</a></li>
<li><hr class="dropdown-divider"></li>
<li><h6 class="dropdown-header">Help</h6></li>
<li><a class="dropdown-item" href="#">FAQ</a></li>
</ul>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
5. Offcanvas 侧滑面板
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">Offcanvas Nav</a>
<button class="navbar-toggler" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="offcanvas offcanvas-end bg-dark" tabindex="-1" id="offcanvasNav">
<div class="offcanvas-header">
<h5 class="offcanvas-title text-white">Menu</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvas"></button>
</div>
<div class="offcanvas-body">
<ul class="navbar-nav">
<li class="nav-item"><a class="nav-link active" href="#">Home</a></li>
<li class="nav-item"><a class="nav-link" href="#">Features</a></li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">More</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">About</a></li>
<li><a class="dropdown-item" href="#">Contact</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</nav>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
(1) Offcanvas vs 折叠导航
| 对比维度 | collapse navbar-collapse |
offcanvas |
|---|---|---|
| 动画方向 | 垂直展开/收起 | 从侧边滑入 |
| 遮罩层 | 无 | 有(半透明背景) |
| 适用场景 | 简单链接(3-5 项) | 多级菜单 + 搜索 + 用户面板 |
(2) Offcanvas 方向
| class | 方向 | 场景 |
|---|---|---|
offcanvas-start |
左侧滑出 | 侧栏导航 |
offcanvas-end |
右侧滑出 | 购物车、通知(默认) |
offcanvas-top |
顶部滑出 | 搜索面板 |
offcanvas-bottom |
底部滑出 | 移动端筛选 |
6. 导航栏组件图与参考
(1) 导航栏组件层级
graph TD
subgraph navbar
A[.navbar] --> B[.container]
B --> C[.navbar-brand 品牌标识]
B --> D[.navbar-toggler 汉堡按钮]
B --> E[.collapse .navbar-collapse 折叠面板]
E --> F[.navbar-nav 导航列表]
F --> G[.nav-item 链接项]
G --> H[.nav-link 链接]
G --> I[.dropdown 下拉菜单]
I --> J[.dropdown-menu]
J --> K[.dropdown-item]
E --> L[搜索表单 / 按钮等]
end
subgraph 配色
A --> M[bg-* 背景色]
A --> N[navbar-dark / navbar-light 文字色]
end
subgraph 定位
A --> O[fixed-top / fixed-bottom / sticky-top]
end
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
(2) 导航栏断点行为参考
| navbar-expand 值 | 折叠行为 | 水平展开屏幕 | 典型场景 |
|---|---|---|---|
| 不写 | 始终折叠 | 无 | 手机端专用导航 |
navbar-expand-sm |
<576px 折叠 | >=576px | 大屏手机+ |
navbar-expand-md |
<768px 折叠 | >=768px | 平板+ |
navbar-expand-lg |
<992px 折叠 | >=992px | 桌面+ (最常用) |
navbar-expand-xl |
<1200px 折叠 | >=1200px | 大屏桌面 |
navbar-expand-xxl |
<1400px 折叠 | >=1400px | 超大屏 |
▶ 示例:固定顶部导航栏
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Fixed Top Navbar</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
body { padding-top: 56px; }
.scroll-content { height: 1500px; background: linear-gradient(#f8f9fa, #e9ecef); }
</style>
</head>
<body>
<nav class="navbar navbar-expand-md bg-dark navbar-dark fixed-top">
<div class="container">
<a class="navbar-brand" href="#">顶部导航</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navFixed">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navFixed">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#">首页</a></li>
<li class="nav-item"><a class="nav-link" href="#">功能</a></li>
<li class="nav-item"><a class="nav-link" href="#">价格</a></li>
<li class="nav-item"><a class="nav-link" href="#">关于</a></li>
</ul>
</div>
</div>
</nav>
<div class="container scroll-content d-flex justify-content-center align-items-center">
<p class="text-muted">fixed-top 固定在视口顶部,滚动页面时始终可见。</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
▶ 示例:导航栏含搜索和按钮
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Navbar with Search</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg bg-body-tertiary">
<div class="container">
<a class="navbar-brand fw-bold" href="#">MyApp</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navSearch">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navSearch">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item"><a class="nav-link active" href="#">首页</a></li>
<li class="nav-item"><a class="nav-link" href="#">探索</a></li>
<li class="nav-item"><a class="nav-link" href="#">收藏</a></li>
</ul>
<form class="d-flex me-2" role="search">
<input class="form-control me-2" type="search" placeholder="搜索..." aria-label="Search">
<button class="btn btn-outline-primary" type="submit">搜索</button>
</form>
<a href="#" class="btn btn-primary">登录</a>
</div>
</div>
</nav>
<div class="container mt-4">
<p>导航栏包含搜索框和登录按钮,折叠时全部收进汉堡菜单。</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
▶ 示例:Mega Menu 下拉菜单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mega Dropdown</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.mega-menu { min-width: 400px; padding: 1rem; }
@media (max-width: 991.98px) { .mega-menu { min-width: auto; } }
</style>
</head>
<body>
<nav class="navbar navbar-expand-lg bg-dark navbar-dark">
<div class="container">
<a class="navbar-brand" href="#">Mega Shop</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navMega">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navMega">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" data-bs-toggle="dropdown">商品分类</a>
<div class="dropdown-menu mega-menu p-4">
<div class="row g-3">
<div class="col-6">
<h6 class="dropdown-header">电子产品</h6>
<a class="dropdown-item" href="#">手机</a>
<a class="dropdown-item" href="#">电脑</a>
<a class="dropdown-item" href="#">耳机</a>
<a class="dropdown-item" href="#">配件</a>
</div>
<div class="col-6">
<h6 class="dropdown-header">生活家居</h6>
<a class="dropdown-item" href="#">家具</a>
<a class="dropdown-item" href="#">厨具</a>
<a class="dropdown-item" href="#">家纺</a>
<a class="dropdown-item" href="#">收纳</a>
</div>
</div>
</div>
</li>
<li class="nav-item"><a class="nav-link" href="#">新品</a></li>
<li class="nav-item"><a class="nav-link" href="#">促销</a></li>
</ul>
</div>
</div>
</nav>
<div class="container mt-4">
<p>Mega Menu 使用 <code>dropdown-menu</code> + 内部 Grid 实现多列布局,适合分类较多的导航。</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
▶ 示例:透明导航栏在 Hero 上
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Transparent Navbar</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<nav class="navbar navbar-expand-lg navbar-dark fixed-top" style="background: rgba(0,0,0,0.3); backdrop-filter: blur(4px);">
<div class="container">
<a class="navbar-brand fw-bold" href="#">Brand</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navTrans">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navTrans">
<ul class="navbar-nav ms-auto">
<li class="nav-item"><a class="nav-link active" href="#">首页</a></li>
<li class="nav-item"><a class="nav-link" href="#">作品</a></li>
<li class="nav-item"><a class="nav-link" href="#">关于</a></li>
<li class="nav-item"><a class="nav-link" href="#">联系</a></li>
</ul>
</div>
</div>
</nav>
<div class="d-flex justify-content-center align-items-center text-white" style="height: 100vh; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);">
<div class="text-center">
<h1 class="display-3 fw-bold">创意设计工作室</h1>
<p class="lead">我们用设计讲述品牌故事</p>
<a href="#" class="btn btn-light btn-lg mt-3">了解更多</a>
</div>
</div>
<div class="container py-5">
<p>透明导航栏叠加在 Hero 背景上,滚动时与内容重叠。<code>backdrop-filter: blur(4px)</code> 增强可读性。</p>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>
输出: Bootstrap 5.3 样式生效的组件效果(如按钮、卡片、轮播、折叠等),页面默认采用 Bootstrap 默认主题(亮色)和响应式网格。
❓ 常见问题
navbar-expand-lg 在 lg 以下折叠,但我想让它提前在 md 以下就折叠怎么办?navbar-expand-md 表示 md 及以上水平展开,md 以下折叠。可选值:sm / md / lg / xl / xxl。不写 navbar-expand-* 则始终折叠。<a> 或 <button> 标签且包含 data-bs-toggle="dropdown",并且页面底部引入了 Bootstrap JS 包。fixed-top 类即可固定到视口顶部,此时需要给 body 添加 padding-top 补偿高度。还有 sticky-top 选项:正常滚动直到滑出视口才固定。<nav> 标签并加 aria-label 描述导航用途;(2) 汉堡按钮使用 aria-controls 指向折叠面板 ID;(3) 当前页面链接加 aria-current="page";(4) 下拉菜单触发器使用 aria-expanded 状态。Bootstrap 的 JS 组件会自动处理大部分 ARIA 属性。📖 小节
- 导航栏结构:
navbar>container>navbar-brand+navbar-toggler+collapse navbar-collapse navbar-expand-{breakpoint}控制折叠断点,bg-*+navbar-{light/dark}控制配色- 下拉菜单用
dropdown组件,dropdown-toggle+data-bs-toggle="dropdown"实现切换 - Offcanvas 侧滑面板提供更好的移动端导航体验
📝 作业
- ⭐ 创建一个完整的企业站导航栏:深色背景、左侧品牌 Logo、右侧菜单链接(Home / About / Services / Contact)、Services 含下拉子菜单。
- ⭐⭐ 将导航栏的折叠方式改为 Offcanvas(侧边滑出),在 Offcanvas 面板内添加搜索框和用户登录按钮。
- ⭐⭐⭐ 创建一个底部工具栏:使用
fixed-bottom固定定位,包含 4 个图标链接,模拟手机 App 底部导航。