本章概述

Bootstrap 提供了丰富的导航和菜单组件,包括导航栏、面包屑导航、分页、标签页、下拉菜单等。这些组件是构建网站导航结构的核心元素。本章将详细介绍这些导航组件的使用方法和自定义技巧。

导航栏组件

1. 基础导航栏

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Bootstrap 导航栏组件</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <!-- 基础导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-light bg-light">
        <div class="container">
            <a class="navbar-brand" href="#">
                <img src="https://via.placeholder.com/30x30" alt="Logo" width="30" height="30" class="d-inline-block align-text-top">
                我的网站
            </a>
            
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            
            <div class="collapse navbar-collapse" id="navbarNav">
                <ul class="navbar-nav me-auto mb-2 mb-lg-0">
                    <li class="nav-item">
                        <a class="nav-link active" aria-current="page" 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 dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                            更多
                        </a>
                        <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
                            <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>
                    </li>
                </ul>
                
                <div class="d-flex">
                    <input class="form-control me-2" type="search" placeholder="搜索" aria-label="Search">
                    <button class="btn btn-outline-success" type="submit">搜索</button>
                </div>
            </div>
        </div>
    </nav>
    
    <!-- 深色导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-dark bg-dark mt-3">
        <div class="container">
            <a class="navbar-brand" href="#">深色导航栏</a>
            
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#darkNavbar" aria-controls="darkNavbar" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            
            <div class="collapse navbar-collapse" id="darkNavbar">
                <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>
                
                <div class="navbar-nav">
                    <a class="nav-link" href="#">登录</a>
                    <a class="nav-link" href="#">
                        <button class="btn btn-primary btn-sm">注册</button>
                    </a>
                </div>
            </div>
        </div>
    </nav>
    
    <!-- 固定顶部导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-light bg-primary fixed-top">
        <div class="container">
            <a class="navbar-brand text-white" href="#">固定导航栏</a>
            
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#fixedNavbar">
                <span class="navbar-toggler-icon"></span>
            </button>
            
            <div class="collapse navbar-collapse" id="fixedNavbar">
                <ul class="navbar-nav ms-auto">
                    <li class="nav-item">
                        <a class="nav-link text-white" href="#">首页</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-white" href="#">关于</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link text-white" href="#">联系</a>
                    </li>
                </ul>
            </div>
        </div>
    </nav>
    
    <!-- 为固定导航栏添加顶部间距 -->
    <div style="margin-top: 80px;">
        <div class="container">
            <h1>页面内容</h1>
            <p>这里是页面的主要内容...</p>
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

2. 响应式导航栏

<!-- 响应式导航栏示例 -->
<nav class="navbar navbar-expand-md navbar-light bg-light">
    <div class="container-fluid">
        <a class="navbar-brand" href="#">
            <i class="bi bi-house-door"></i> 响应式网站
        </a>
        
        <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#responsiveNavbar" aria-controls="responsiveNavbar" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>
        
        <div class="collapse navbar-collapse" id="responsiveNavbar">
            <ul class="navbar-nav me-auto mb-2 mb-md-0">
                <li class="nav-item">
                    <a class="nav-link active" href="#">首页</a>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="productsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                        产品
                    </a>
                    <ul class="dropdown-menu">
                        <li><h6 class="dropdown-header">软件产品</h6></li>
                        <li><a class="dropdown-item" href="#">Web 应用</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><h6 class="dropdown-header">硬件产品</h6></li>
                        <li><a class="dropdown-item" href="#">服务器</a></li>
                        <li><a class="dropdown-item" href="#">网络设备</a></li>
                    </ul>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="servicesDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                        服务
                    </a>
                    <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>
                </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 class="d-flex align-items-center">
                <div class="dropdown me-3">
                    <button class="btn btn-outline-secondary dropdown-toggle" type="button" id="languageDropdown" data-bs-toggle="dropdown" aria-expanded="false">
                        中文
                    </button>
                    <ul class="dropdown-menu" aria-labelledby="languageDropdown">
                        <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>
                    </ul>
                </div>
                
                <div class="btn-group" role="group">
                    <a href="#" class="btn btn-outline-primary btn-sm">登录</a>
                    <a href="#" class="btn btn-primary btn-sm">注册</a>
                </div>
            </div>
        </div>
    </div>
</nav>

面包屑导航

1. 基础面包屑

<!-- 面包屑导航示例 -->
<div class="container my-4">
    <h2 class="text-primary mb-4">面包屑导航</h2>
    
    <!-- 基础面包屑 -->
    <div class="mb-4">
        <h5>基础面包屑</h5>
        <nav aria-label="breadcrumb">
            <ol class="breadcrumb">
                <li class="breadcrumb-item"><a href="#">首页</a></li>
                <li class="breadcrumb-item"><a href="#">产品</a></li>
                <li class="breadcrumb-item active" aria-current="page">笔记本电脑</li>
            </ol>
        </nav>
    </div>
    
    <!-- 带图标的面包屑 -->
    <div class="mb-4">
        <h5>带图标的面包屑</h5>
        <nav aria-label="breadcrumb">
            <ol class="breadcrumb">
                <li class="breadcrumb-item">
                    <a href="#">
                        <i class="bi bi-house-door"></i> 首页
                    </a>
                </li>
                <li class="breadcrumb-item">
                    <a href="#">
                        <i class="bi bi-folder"></i> 文档
                    </a>
                </li>
                <li class="breadcrumb-item">
                    <a href="#">
                        <i class="bi bi-file-text"></i> 教程
                    </a>
                </li>
                <li class="breadcrumb-item active" aria-current="page">
                    <i class="bi bi-file-earmark-text"></i> Bootstrap 导航
                </li>
            </ol>
        </nav>
    </div>
    
    <!-- 自定义分隔符的面包屑 -->
    <div class="mb-4">
        <h5>自定义分隔符</h5>
        <nav aria-label="breadcrumb">
            <ol class="breadcrumb breadcrumb-custom">
                <li class="breadcrumb-item"><a href="#">用户中心</a></li>
                <li class="breadcrumb-item"><a href="#">个人设置</a></li>
                <li class="breadcrumb-item active" aria-current="page">安全设置</li>
            </ol>
        </nav>
    </div>
</div>

<style>
.breadcrumb-custom {
    --bs-breadcrumb-divider: '>';
}

.breadcrumb-custom .breadcrumb-item + .breadcrumb-item::before {
    content: var(--bs-breadcrumb-divider);
    color: #6c757d;
    margin: 0 0.5rem;
}
</style>

分页组件

1. 基础分页

<!-- 分页组件示例 -->
<div class="container my-4">
    <h2 class="text-primary mb-4">分页组件</h2>
    
    <!-- 基础分页 -->
    <div class="mb-4">
        <h5>基础分页</h5>
        <nav aria-label="Page navigation">
            <ul class="pagination">
                <li class="page-item disabled">
                    <a class="page-link" href="#" tabindex="-1" aria-disabled="true">上一页</a>
                </li>
                <li class="page-item active" aria-current="page">
                    <a class="page-link" href="#">1</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">2</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">3</a>
                </li>
                <li class="page-item">
                    <a class="page-link" href="#">下一页</a>
                </li>
            </ul>
        </nav>
    </div>
    
    <!-- 大尺寸分页 -->
    <div class="mb-4">
        <h5>大尺寸分页</h5>
        <nav aria-label="Large pagination">
            <ul class="pagination pagination-lg">
                <li class="page-item">
                    <a class="page-link" href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li class="page-item"><a class="page-link" href="#">1</a></li>
                <li class="page-item active"><a class="page-link" href="#">2</a></li>
                <li class="page-item"><a class="page-link" href="#">3</a></li>
                <li class="page-item">
                    <a class="page-link" href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            </ul>
        </nav>
    </div>
    
    <!-- 小尺寸分页 -->
    <div class="mb-4">
        <h5>小尺寸分页</h5>
        <nav aria-label="Small pagination">
            <ul class="pagination pagination-sm">
                <li class="page-item">
                    <a class="page-link" href="#" aria-label="Previous">
                        <span aria-hidden="true">&laquo;</span>
                    </a>
                </li>
                <li class="page-item"><a class="page-link" href="#">1</a></li>
                <li class="page-item active"><a class="page-link" href="#">2</a></li>
                <li class="page-item"><a class="page-link" href="#">3</a></li>
                <li class="page-item">
                    <a class="page-link" href="#" aria-label="Next">
                        <span aria-hidden="true">&raquo;</span>
                    </a>
                </li>
            </ul>
        </nav>
    </div>
    
    <!-- 居中对齐的分页 -->
    <div class="mb-4">
        <h5>居中对齐的分页</h5>
        <nav aria-label="Centered pagination">
            <ul class="pagination justify-content-center">
                <li class="page-item">
                    <a class="page-link" href="#">上一页</a>
                </li>
                <li class="page-item"><a class="page-link" href="#">1</a></li>
                <li class="page-item"><a class="page-link" href="#">2</a></li>
                <li class="page-item active"><a class="page-link" href="#">3</a></li>
                <li class="page-item"><a class="page-link" href="#">4</a></li>
                <li class="page-item"><a class="page-link" href="#">5</a></li>
                <li class="page-item">
                    <a class="page-link" href="#">下一页</a>
                </li>
            </ul>
        </nav>
    </div>
    
    <!-- 右对齐的分页 -->
    <div class="mb-4">
        <h5>右对齐的分页</h5>
        <nav aria-label="Right aligned pagination">
            <ul class="pagination justify-content-end">
                <li class="page-item">
                    <a class="page-link" href="#">上一页</a>
                </li>
                <li class="page-item"><a class="page-link" href="#">1</a></li>
                <li class="page-item"><a class="page-link" href="#">2</a></li>
                <li class="page-item active"><a class="page-link" href="#">3</a></li>
                <li class="page-item">
                    <a class="page-link" href="#">下一页</a>
                </li>
            </ul>
        </nav>
    </div>
</div>

2. 高级分页功能

<!-- 高级分页功能 -->
<div class="container my-4">
    <h2 class="text-primary mb-4">高级分页功能</h2>
    
    <!-- 带跳转的分页 -->
    <div class="mb-4">
        <h5>带跳转功能的分页</h5>
        <div class="row align-items-center">
            <div class="col-md-6">
                <nav aria-label="Advanced pagination">
                    <ul class="pagination mb-0">
                        <li class="page-item">
                            <a class="page-link" href="#" onclick="goToPage('prev')">
                                <i class="bi bi-chevron-left"></i>
                            </a>
                        </li>
                        <li class="page-item"><a class="page-link" href="#" onclick="goToPage(1)">1</a></li>
                        <li class="page-item"><a class="page-link" href="#" onclick="goToPage(2)">2</a></li>
                        <li class="page-item active"><a class="page-link" href="#">3</a></li>
                        <li class="page-item"><a class="page-link" href="#" onclick="goToPage(4)">4</a></li>
                        <li class="page-item"><a class="page-link" href="#" onclick="goToPage(5)">5</a></li>
                        <li class="page-item">
                            <a class="page-link" href="#" onclick="goToPage('next')">
                                <i class="bi bi-chevron-right"></i>
                            </a>
                        </li>
                    </ul>
                </nav>
            </div>
            <div class="col-md-6">
                <div class="d-flex align-items-center justify-content-end">
                    <span class="me-2">跳转到第</span>
                    <input type="number" class="form-control" style="width: 80px;" min="1" max="100" value="3" id="pageInput">
                    <span class="mx-2">页</span>
                    <button class="btn btn-outline-primary btn-sm" onclick="jumpToPage()">跳转</button>
                </div>
            </div>
        </div>
        
        <div class="mt-2 text-muted small">
            显示第 21-30 条记录,共 500 条记录,第 3 页,共 50 页
        </div>
    </div>
    
    <!-- 每页显示数量选择 -->
    <div class="mb-4">
        <h5>每页显示数量选择</h5>
        <div class="row align-items-center">
            <div class="col-md-6">
                <div class="d-flex align-items-center">
                    <span class="me-2">每页显示</span>
                    <select class="form-select" style="width: auto;" onchange="changePageSize(this.value)">
                        <option value="10">10</option>
                        <option value="20" selected>20</option>
                        <option value="50">50</option>
                        <option value="100">100</option>
                    </select>
                    <span class="ms-2">条记录</span>
                </div>
            </div>
            <div class="col-md-6">
                <nav aria-label="Page size pagination">
                    <ul class="pagination justify-content-end mb-0">
                        <li class="page-item">
                            <a class="page-link" href="#">上一页</a>
                        </li>
                        <li class="page-item"><a class="page-link" href="#">1</a></li>
                        <li class="page-item active"><a class="page-link" href="#">2</a></li>
                        <li class="page-item"><a class="page-link" href="#">3</a></li>
                        <li class="page-item">
                            <a class="page-link" href="#">下一页</a>
                        </li>
                    </ul>
                </nav>
            </div>
        </div>
    </div>
</div>

<script>
function goToPage(page) {
    console.log('跳转到页面:', page);
    // 这里实现页面跳转逻辑
}

function jumpToPage() {
    const pageInput = document.getElementById('pageInput');
    const page = parseInt(pageInput.value);
    if (page >= 1 && page <= 100) {
        console.log('跳转到第', page, '页');
        // 这里实现页面跳转逻辑
    } else {
        alert('请输入有效的页码(1-100)');
    }
}

function changePageSize(size) {
    console.log('每页显示', size, '条记录');
    // 这里实现每页显示数量变更逻辑
}
</script>

标签页组件

1. 基础标签页

<!-- 标签页组件示例 -->
<div class="container my-4">
    <h2 class="text-primary mb-4">标签页组件</h2>
    
    <!-- 基础标签页 -->
    <div class="mb-5">
        <h5>基础标签页</h5>
        <ul class="nav nav-tabs" id="basicTabs" role="tablist">
            <li class="nav-item" role="presentation">
                <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#home" type="button" role="tab" aria-controls="home" aria-selected="true">首页</button>
            </li>
            <li class="nav-item" role="presentation">
                <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#profile" type="button" role="tab" aria-controls="profile" aria-selected="false">个人资料</button>
            </li>
            <li class="nav-item" role="presentation">
                <button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#contact" type="button" role="tab" aria-controls="contact" aria-selected="false">联系方式</button>
            </li>
            <li class="nav-item" role="presentation">
                <button class="nav-link disabled" id="disabled-tab" data-bs-toggle="tab" data-bs-target="#disabled" type="button" role="tab" aria-controls="disabled" aria-selected="false" disabled>禁用</button>
            </li>
        </ul>
        
        <div class="tab-content" id="basicTabsContent">
            <div class="tab-pane fade show active" id="home" role="tabpanel" aria-labelledby="home-tab">
                <div class="p-4">
                    <h4>欢迎来到首页</h4>
                    <p>这里是首页的内容。您可以在这里查看最新的信息和更新。</p>
                    <ul>
                        <li>最新产品发布</li>
                        <li>公司新闻</li>
                        <li>行业动态</li>
                    </ul>
                </div>
            </div>
            <div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
                <div class="p-4">
                    <h4>个人资料</h4>
                    <div class="row">
                        <div class="col-md-6">
                            <div class="mb-3">
                                <label class="form-label">姓名</label>
                                <input type="text" class="form-control" value="张三">
                            </div>
                            <div class="mb-3">
                                <label class="form-label">邮箱</label>
                                <input type="email" class="form-control" value="zhangsan@example.com">
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="mb-3">
                                <label class="form-label">电话</label>
                                <input type="tel" class="form-control" value="138-0000-0000">
                            </div>
                            <div class="mb-3">
                                <label class="form-label">部门</label>
                                <select class="form-select">
                                    <option>技术部</option>
                                    <option>市场部</option>
                                    <option>销售部</option>
                                </select>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="tab-pane fade" id="contact" role="tabpanel" aria-labelledby="contact-tab">
                <div class="p-4">
                    <h4>联系方式</h4>
                    <div class="row">
                        <div class="col-md-6">
                            <h6>公司地址</h6>
                            <p>北京市朝阳区某某大厦 1001 室</p>
                            
                            <h6>联系电话</h6>
                            <p>010-12345678</p>
                        </div>
                        <div class="col-md-6">
                            <h6>邮箱地址</h6>
                            <p>contact@example.com</p>
                            
                            <h6>工作时间</h6>
                            <p>周一至周五 9:00-18:00</p>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <!-- 药丸式标签页 -->
    <div class="mb-5">
        <h5>药丸式标签页</h5>
        <ul class="nav nav-pills" id="pillTabs" role="tablist">
            <li class="nav-item" role="presentation">
                <button class="nav-link active" id="overview-pill" data-bs-toggle="pill" data-bs-target="#overview" type="button" role="tab" aria-controls="overview" aria-selected="true">概览</button>
            </li>
            <li class="nav-item" role="presentation">
                <button class="nav-link" id="analytics-pill" data-bs-toggle="pill" data-bs-target="#analytics" type="button" role="tab" aria-controls="analytics" aria-selected="false">分析</button>
            </li>
            <li class="nav-item" role="presentation">
                <button class="nav-link" id="reports-pill" data-bs-toggle="pill" data-bs-target="#reports" type="button" role="tab" aria-controls="reports" aria-selected="false">报告</button>
            </li>
        </ul>
        
        <div class="tab-content mt-3" id="pillTabsContent">
            <div class="tab-pane fade show active" id="overview" role="tabpanel" aria-labelledby="overview-pill">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">数据概览</h5>
                        <div class="row text-center">
                            <div class="col-md-3">
                                <div class="border rounded p-3">
                                    <h3 class="text-primary">1,234</h3>
                                    <p class="mb-0">总用户数</p>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div class="border rounded p-3">
                                    <h3 class="text-success">567</h3>
                                    <p class="mb-0">活跃用户</p>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div class="border rounded p-3">
                                    <h3 class="text-warning">89</h3>
                                    <p class="mb-0">新增用户</p>
                                </div>
                            </div>
                            <div class="col-md-3">
                                <div class="border rounded p-3">
                                    <h3 class="text-info">12</h3>
                                    <p class="mb-0">在线用户</p>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="tab-pane fade" id="analytics" role="tabpanel" aria-labelledby="analytics-pill">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">数据分析</h5>
                        <p>这里显示详细的数据分析图表和报表。</p>
                        <div class="bg-light p-4 rounded">
                            <p class="mb-0">图表占位符 - 这里可以放置各种数据可视化图表</p>
                        </div>
                    </div>
                </div>
            </div>
            <div class="tab-pane fade" id="reports" role="tabpanel" aria-labelledby="reports-pill">
                <div class="card">
                    <div class="card-body">
                        <h5 class="card-title">报告中心</h5>
                        <div class="list-group">
                            <a href="#" class="list-group-item list-group-item-action">
                                <div class="d-flex w-100 justify-content-between">
                                    <h6 class="mb-1">月度销售报告</h6>
                                    <small>2024-01-01</small>
                                </div>
                                <p class="mb-1">本月销售数据统计和分析报告。</p>
                            </a>
                            <a href="#" class="list-group-item list-group-item-action">
                                <div class="d-flex w-100 justify-content-between">
                                    <h6 class="mb-1">用户行为分析</h6>
                                    <small>2024-01-02</small>
                                </div>
                                <p class="mb-1">用户访问行为和使用习惯分析。</p>
                            </a>
                            <a href="#" class="list-group-item list-group-item-action">
                                <div class="d-flex w-100 justify-content-between">
                                    <h6 class="mb-1">系统性能报告</h6>
                                    <small>2024-01-03</small>
                                </div>
                                <p class="mb-1">系统运行状态和性能指标报告。</p>
                            </a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

下拉菜单组件

1. 基础下拉菜单

<!-- 下拉菜单组件示例 -->
<div class="container my-4">
    <h2 class="text-primary mb-4">下拉菜单组件</h2>
    
    <!-- 基础下拉菜单 -->
    <div class="mb-4">
        <h5>基础下拉菜单</h5>
        <div class="d-flex flex-wrap gap-3">
            <!-- 基础下拉菜单 -->
            <div class="dropdown">
                <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
                    下拉菜单
                </button>
                <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
                    <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>
            
            <!-- 分割按钮下拉菜单 -->
            <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>
            
            <!-- 向上弹出的下拉菜单 -->
            <div class="dropup">
                <button class="btn btn-success dropdown-toggle" type="button" id="dropupMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
                    向上弹出
                </button>
                <ul class="dropdown-menu" aria-labelledby="dropupMenuButton">
                    <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>
            
            <!-- 向右弹出的下拉菜单 -->
            <div class="dropend">
                <button class="btn btn-info dropdown-toggle" type="button" id="dropendMenuButton" data-bs-toggle="dropdown" aria-expanded="false">
                    向右弹出
                </button>
                <ul class="dropdown-menu" aria-labelledby="dropendMenuButton">
                    <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>
        </div>
    </div>
    
    <!-- 复杂下拉菜单 -->
    <div class="mb-4">
        <h5>复杂下拉菜单</h5>
        <div class="d-flex flex-wrap gap-3">
            <!-- 带标题和分隔符的下拉菜单 -->
            <div class="dropdown">
                <button class="btn btn-outline-primary dropdown-toggle" type="button" id="complexDropdown1" data-bs-toggle="dropdown" aria-expanded="false">
                    用户菜单
                </button>
                <ul class="dropdown-menu" aria-labelledby="complexDropdown1">
                    <li><h6 class="dropdown-header">账户设置</h6></li>
                    <li><a class="dropdown-item" href="#"><i class="bi bi-person"></i> 个人资料</a></li>
                    <li><a class="dropdown-item" href="#"><i class="bi bi-gear"></i> 设置</a></li>
                    <li><a class="dropdown-item" href="#"><i class="bi bi-bell"></i> 通知</a></li>
                    <li><hr class="dropdown-divider"></li>
                    <li><h6 class="dropdown-header">其他</h6></li>
                    <li><a class="dropdown-item" href="#"><i class="bi bi-question-circle"></i> 帮助</a></li>
                    <li><a class="dropdown-item" href="#"><i class="bi bi-box-arrow-right"></i> 退出登录</a></li>
                </ul>
            </div>
            
            <!-- 带表单的下拉菜单 -->
            <div class="dropdown">
                <button class="btn btn-outline-secondary dropdown-toggle" type="button" id="formDropdown" data-bs-toggle="dropdown" aria-expanded="false">
                    登录
                </button>
                <div class="dropdown-menu p-4" aria-labelledby="formDropdown" style="min-width: 300px;">
                    <form>
                        <div class="mb-3">
                            <label for="email" class="form-label">邮箱地址</label>
                            <input type="email" class="form-control" id="email" placeholder="输入邮箱">
                        </div>
                        <div class="mb-3">
                            <label for="password" class="form-label">密码</label>
                            <input type="password" class="form-control" id="password" placeholder="输入密码">
                        </div>
                        <div class="mb-3 form-check">
                            <input type="checkbox" class="form-check-input" id="remember">
                            <label class="form-check-label" for="remember">记住我</label>
                        </div>
                        <button type="submit" class="btn btn-primary w-100">登录</button>
                        <hr>
                        <div class="text-center">
                            <a href="#" class="text-decoration-none">忘记密码?</a>
                        </div>
                    </form>
                </div>
            </div>
            
            <!-- 多级下拉菜单 -->
            <div class="dropdown">
                <button class="btn btn-outline-success dropdown-toggle" type="button" id="multilevelDropdown" data-bs-toggle="dropdown" aria-expanded="false">
                    多级菜单
                </button>
                <ul class="dropdown-menu" aria-labelledby="multilevelDropdown">
                    <li><a class="dropdown-item" href="#">首页</a></li>
                    <li class="dropdown-submenu">
                        <a class="dropdown-item dropdown-toggle" href="#">产品</a>
                        <ul class="dropdown-menu">
                            <li><a class="dropdown-item" href="#">Web 应用</a></li>
                            <li><a class="dropdown-item" href="#">移动应用</a></li>
                            <li><a class="dropdown-item" href="#">桌面应用</a></li>
                        </ul>
                    </li>
                    <li><a class="dropdown-item" href="#">服务</a></li>
                    <li><a class="dropdown-item" href="#">联系我们</a></li>
                </ul>
            </div>
        </div>
    </div>
</div>

<style>
/* 多级下拉菜单样式 */
.dropdown-submenu {
    position: relative;
}

.dropdown-submenu .dropdown-menu {
    top: 0;
    left: 100%;
    margin-top: -1px;
}

.dropdown-submenu:hover .dropdown-menu {
    display: block;
}
</style>

实际应用案例

1. 企业网站导航

<!-- 企业网站导航示例 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>企业网站导航</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.0/font/bootstrap-icons.css" rel="stylesheet">
</head>
<body>
    <!-- 顶部信息栏 -->
    <div class="bg-dark text-white py-2">
        <div class="container">
            <div class="row align-items-center">
                <div class="col-md-6">
                    <small>
                        <i class="bi bi-telephone"></i> 400-123-4567
                        <span class="mx-3">|</span>
                        <i class="bi bi-envelope"></i> info@company.com
                    </small>
                </div>
                <div class="col-md-6 text-end">
                    <small>
                        <a href="#" class="text-white text-decoration-none me-3">客户登录</a>
                        <a href="#" class="text-white text-decoration-none">合作伙伴</a>
                    </small>
                </div>
            </div>
        </div>
    </div>
    
    <!-- 主导航栏 -->
    <nav class="navbar navbar-expand-lg navbar-light bg-white shadow-sm">
        <div class="container">
            <a class="navbar-brand" href="#">
                <img src="https://via.placeholder.com/120x40" alt="公司Logo" height="40">
            </a>
            
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#mainNavbar" aria-controls="mainNavbar" aria-expanded="false" aria-label="Toggle navigation">
                <span class="navbar-toggler-icon"></span>
            </button>
            
            <div class="collapse navbar-collapse" id="mainNavbar">
                <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 dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="aboutDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                            关于我们
                        </a>
                        <ul class="dropdown-menu" aria-labelledby="aboutDropdown">
                            <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><a class="dropdown-item" href="#">组织架构</a></li>
                            <li><hr class="dropdown-divider"></li>
                            <li><a class="dropdown-item" href="#">资质荣誉</a></li>
                        </ul>
                    </li>
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="productsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                            产品与服务
                        </a>
                        <ul class="dropdown-menu" aria-labelledby="productsDropdown">
                            <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><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>
                        </ul>
                    </li>
                    <li class="nav-item dropdown">
                        <a class="nav-link dropdown-toggle" href="#" id="solutionsDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
                            解决方案
                        </a>
                        <ul class="dropdown-menu" aria-labelledby="solutionsDropdown">
                            <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><a class="dropdown-item" href="#">教育行业解决方案</a></li>
                        </ul>
                    </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 class="d-flex align-items-center">
                    <div class="input-group me-3" style="width: 250px;">
                        <input type="search" class="form-control" placeholder="搜索产品或服务">
                        <button class="btn btn-outline-secondary" type="button">
                            <i class="bi bi-search"></i>
                        </button>
                    </div>
                    
                    <div class="btn-group">
                        <a href="#" class="btn btn-outline-primary btn-sm">免费试用</a>
                        <a href="#" class="btn btn-primary btn-sm">联系销售</a>
                    </div>
                </div>
            </div>
        </div>
    </nav>
    
    <!-- 面包屑导航 -->
    <div class="bg-light py-3">
        <div class="container">
            <nav aria-label="breadcrumb">
                <ol class="breadcrumb mb-0">
                    <li class="breadcrumb-item"><a href="#">首页</a></li>
                    <li class="breadcrumb-item"><a href="#">产品与服务</a></li>
                    <li class="breadcrumb-item active" aria-current="page">企业管理系统</li>
                </ol>
            </nav>
        </div>
    </div>
    
    <!-- 页面内容 -->
    <div class="container my-5">
        <h1>企业管理系统</h1>
        <p>这里是产品详情页面的内容...</p>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

2. 后台管理系统导航

<!-- 后台管理系统导航示例 -->
<div class="container-fluid">
    <div class="row">
        <!-- 侧边栏导航 -->
        <nav class="col-md-3 col-lg-2 d-md-block bg-light sidebar">
            <div class="position-sticky pt-3">
                <div class="text-center mb-4">
                    <img src="https://via.placeholder.com/80x80" alt="用户头像" class="rounded-circle" width="80" height="80">
                    <h6 class="mt-2">管理员</h6>
                    <small class="text-muted">admin@example.com</small>
                </div>
                
                <ul class="nav flex-column">
                    <li class="nav-item">
                        <a class="nav-link active" href="#">
                            <i class="bi bi-house-door"></i> 仪表板
                        </a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#" data-bs-toggle="collapse" data-bs-target="#userManagement" aria-expanded="false">
                            <i class="bi bi-people"></i> 用户管理 <i class="bi bi-chevron-down ms-auto"></i>
                        </a>
                        <div class="collapse" id="userManagement">
                            <ul class="nav flex-column ms-3">
                                <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>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#" data-bs-toggle="collapse" data-bs-target="#contentManagement" aria-expanded="false">
                            <i class="bi bi-file-text"></i> 内容管理 <i class="bi bi-chevron-down ms-auto"></i>
                        </a>
                        <div class="collapse" id="contentManagement">
                            <ul class="nav flex-column ms-3">
                                <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>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">
                            <i class="bi bi-bar-chart"></i> 数据统计
                        </a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">
                            <i class="bi bi-gear"></i> 系统设置
                        </a>
                    </li>
                </ul>
                
                <hr>
                
                <ul class="nav flex-column">
                    <li class="nav-item">
                        <a class="nav-link" href="#">
                            <i class="bi bi-question-circle"></i> 帮助
                        </a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="#">
                            <i class="bi bi-box-arrow-right"></i> 退出登录
                        </a>
                    </li>
                </ul>
            </div>
        </nav>
        
        <!-- 主内容区域 -->
        <main class="col-md-9 ms-sm-auto col-lg-10 px-md-4">
            <!-- 顶部导航栏 -->
            <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
                <h1 class="h2">仪表板</h1>
                
                <div class="btn-toolbar mb-2 mb-md-0">
                    <div class="btn-group me-2">
                        <button type="button" class="btn btn-sm btn-outline-secondary">导出</button>
                        <button type="button" class="btn btn-sm btn-outline-secondary">打印</button>
                    </div>
                    
                    <div class="dropdown">
                        <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" id="dateRangeDropdown" data-bs-toggle="dropdown" aria-expanded="false">
                            <i class="bi bi-calendar"></i> 本周
                        </button>
                        <ul class="dropdown-menu" aria-labelledby="dateRangeDropdown">
                            <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><a class="dropdown-item" href="#">本年</a></li>
                        </ul>
                    </div>
                </div>
            </div>
            
            <!-- 标签页导航 -->
            <ul class="nav nav-tabs" id="dashboardTabs" role="tablist">
                <li class="nav-item" role="presentation">
                    <button class="nav-link" id="sales-tab" data-bs-toggle="tab" data-bs-target="#sales" type="button" role="tab" aria-controls="sales" aria-selected="false">
                        <i class="bi bi-cart"></i> 销售
                    </button>
                </li>
                <li class="nav-item" role="presentation">
                    <button class="nav-link" id="reports-tab" data-bs-toggle="tab" data-bs-target="#reports" type="button" role="tab" aria-controls="reports" aria-selected="false">
                        <i class="bi bi-file-earmark-text"></i> 报告
                    </button>
                </li>
            </ul>
            
            <div class="tab-content" id="dashboardTabsContent">
                <div class="tab-pane fade show active" id="overview" role="tabpanel" aria-labelledby="overview-tab">
                    <div class="row mt-3">
                        <div class="col-md-3">
                            <div class="card text-white bg-primary">
                                <div class="card-body">
                                    <h5 class="card-title">总用户数</h5>
                                    <h2>1,234</h2>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-3">
                            <div class="card text-white bg-success">
                                <div class="card-body">
                                    <h5 class="card-title">活跃用户</h5>
                                    <h2>567</h2>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-3">
                            <div class="card text-white bg-warning">
                                <div class="card-body">
                                    <h5 class="card-title">新增用户</h5>
                                    <h2>89</h2>
                                </div>
                            </div>
                        </div>
                        <div class="col-md-3">
                            <div class="card text-white bg-info">
                                <div class="card-body">
                                    <h5 class="card-title">在线用户</h5>
                                    <h2>12</h2>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
                <div class="tab-pane fade" id="users" role="tabpanel" aria-labelledby="users-tab">
                    <p class="mt-3">用户管理内容...</p>
                </div>
                <div class="tab-pane fade" id="sales" role="tabpanel" aria-labelledby="sales-tab">
                    <p class="mt-3">销售数据内容...</p>
                </div>
                <div class="tab-pane fade" id="reports" role="tabpanel" aria-labelledby="reports-tab">
                    <p class="mt-3">报告内容...</p>
                </div>
            </div>
        </main>
    </div>
</div>

<style>
.sidebar {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    z-index: 100;
    padding: 48px 0 0;
    box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1);
}

.sidebar .nav-link {
    font-weight: 500;
    color: #333;
}

.sidebar .nav-link.active {
    color: #007bff;
}

.sidebar .nav-link:hover {
    color: #007bff;
}
</style>

自定义导航样式

1. 自定义导航栏样式

/* 自定义导航栏样式 */
.custom-navbar {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    box-shadow: 0 2px 4px rgba(0,0,0,.1);
}

.custom-navbar .navbar-brand {
    font-weight: bold;
    color: white !important;
}

.custom-navbar .nav-link {
    color: rgba(255,255,255,0.9) !important;
    transition: all 0.3s ease;
    position: relative;
}

.custom-navbar .nav-link:hover {
    color: white !important;
    transform: translateY(-2px);
}

.custom-navbar .nav-link.active {
    color: white !important;
}

.custom-navbar .nav-link.active::after {
    content: '';
    position: absolute;
    bottom: -5px;
    left: 50%;
    transform: translateX(-50%);
    width: 30px;
    height: 3px;
    background: #ffd700;
    border-radius: 2px;
}

/* 自定义下拉菜单样式 */
.custom-dropdown .dropdown-menu {
    border: none;
    box-shadow: 0 10px 30px rgba(0,0,0,0.1);
    border-radius: 10px;
    padding: 10px 0;
}

.custom-dropdown .dropdown-item {
    padding: 10px 20px;
    transition: all 0.3s ease;
}

.custom-dropdown .dropdown-item:hover {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    transform: translateX(5px);
}

/* 自定义面包屑样式 */
.custom-breadcrumb {
    background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
    border-radius: 25px;
    padding: 15px 25px;
}

.custom-breadcrumb .breadcrumb-item a {
    color: #667eea;
    text-decoration: none;
    font-weight: 500;
}

.custom-breadcrumb .breadcrumb-item a:hover {
    color: #764ba2;
}

.custom-breadcrumb .breadcrumb-item.active {
    color: #333;
    font-weight: 600;
}

/* 自定义分页样式 */
.custom-pagination .page-link {
    border: none;
    color: #667eea;
    font-weight: 500;
    margin: 0 2px;
    border-radius: 50%;
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.3s ease;
}

.custom-pagination .page-link:hover {
    background: #667eea;
    color: white;
    transform: scale(1.1);
}

.custom-pagination .page-item.active .page-link {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    color: white;
    border: none;
}

2. 响应式导航优化

/* 响应式导航优化 */
@media (max-width: 991.98px) {
    .navbar-collapse {
        background: white;
        margin-top: 10px;
        border-radius: 10px;
        box-shadow: 0 5px 15px rgba(0,0,0,0.1);
        padding: 20px;
    }
    
    .navbar-nav .nav-link {
        padding: 10px 0;
        border-bottom: 1px solid #eee;
    }
    
    .navbar-nav .nav-link:last-child {
        border-bottom: none;
    }
    
    .dropdown-menu {
        position: static;
        float: none;
        width: 100%;
        margin-top: 0;
        background-color: #f8f9fa;
        border: none;
        box-shadow: none;
    }
}

@media (max-width: 575.98px) {
    .pagination {
        justify-content: center;
    }
    
    .pagination .page-item {
        margin: 0 1px;
    }
    
    .pagination .page-link {
        padding: 8px 12px;
        font-size: 14px;
    }
    
    .breadcrumb {
        font-size: 14px;
        padding: 10px 15px;
    }
}

导航组件可访问性

1. 键盘导航支持

// 键盘导航支持
document.addEventListener('DOMContentLoaded', function() {
    // 为导航链接添加键盘支持
    const navLinks = document.querySelectorAll('.nav-link');
    
    navLinks.forEach(link => {
        link.addEventListener('keydown', function(e) {
            if (e.key === 'Enter' || e.key === ' ') {
                e.preventDefault();
                this.click();
            }
        });
    });
    
    // 为下拉菜单添加键盘支持
    const dropdownToggles = document.querySelectorAll('.dropdown-toggle');
    
    dropdownToggles.forEach(toggle => {
        toggle.addEventListener('keydown', function(e) {
            if (e.key === 'ArrowDown') {
                e.preventDefault();
                const dropdown = this.nextElementSibling;
                if (dropdown) {
                    const firstItem = dropdown.querySelector('.dropdown-item');
                    if (firstItem) firstItem.focus();
                }
            }
        });
    });
    
    // 下拉菜单项键盘导航
    const dropdownItems = document.querySelectorAll('.dropdown-item');
    
    dropdownItems.forEach((item, index, items) => {
        item.addEventListener('keydown', function(e) {
            switch(e.key) {
                case 'ArrowDown':
                    e.preventDefault();
                    const nextItem = items[index + 1];
                    if (nextItem) nextItem.focus();
                    break;
                case 'ArrowUp':
                    e.preventDefault();
                    const prevItem = items[index - 1];
                    if (prevItem) prevItem.focus();
                    break;
                case 'Escape':
                    e.preventDefault();
                    const toggle = this.closest('.dropdown').querySelector('.dropdown-toggle');
                    if (toggle) toggle.focus();
                    break;
            }
        });
    });
});

2. ARIA 标签优化

<!-- 优化的可访问性导航 -->
<nav class="navbar navbar-expand-lg" role="navigation" aria-label="主导航">
    <div class="container">
        <a class="navbar-brand" href="#" aria-label="返回首页">
            <img src="logo.png" alt="公司Logo" width="120" height="40">
        </a>
        
        <button class="navbar-toggler" 
                type="button" 
                data-bs-toggle="collapse" 
                data-bs-target="#navbarNav" 
                aria-controls="navbarNav" 
                aria-expanded="false" 
                aria-label="切换导航菜单">
            <span class="navbar-toggler-icon"></span>
        </button>
        
        <div class="collapse navbar-collapse" id="navbarNav">
            <ul class="navbar-nav" role="menubar">
                <li class="nav-item" role="none">
                    <a class="nav-link" href="#" role="menuitem" aria-current="page">首页</a>
                </li>
                <li class="nav-item dropdown" role="none">
                    <a class="nav-link dropdown-toggle" 
                       href="#" 
                       id="productsDropdown" 
                       role="menuitem" 
                       data-bs-toggle="dropdown" 
                       aria-expanded="false"
                       aria-haspopup="true">
                        产品
                    </a>
                    <ul class="dropdown-menu" 
                        aria-labelledby="productsDropdown"
                        role="menu">
                        <li role="none">
                            <a class="dropdown-item" href="#" role="menuitem">产品A</a>
                        </li>
                        <li role="none">
                            <a class="dropdown-item" href="#" role="menuitem">产品B</a>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</nav>

<!-- 优化的面包屑导航 -->
<nav aria-label="面包屑导航" role="navigation">
    <ol class="breadcrumb">
        <li class="breadcrumb-item">
            <a href="#" aria-label="返回首页">首页</a>
        </li>
        <li class="breadcrumb-item">
            <a href="#" aria-label="查看产品列表">产品</a>
        </li>
        <li class="breadcrumb-item active" aria-current="page">
            产品详情
        </li>
    </ol>
</nav>

<!-- 优化的分页导航 -->
<nav aria-label="分页导航" role="navigation">
    <ul class="pagination">
        <li class="page-item disabled">
            <a class="page-link" href="#" tabindex="-1" aria-disabled="true" aria-label="上一页">上一页</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="#" aria-label="第1页">1</a>
        </li>
        <li class="page-item active" aria-current="page">
            <a class="page-link" href="#" aria-label="当前页,第2页">2</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="#" aria-label="第3页">3</a>
        </li>
        <li class="page-item">
            <a class="page-link" href="#" aria-label="下一页">下一页</a>
        </li>
    </ul>
</nav>

性能优化建议

1. 导航组件懒加载

// 导航组件懒加载
class NavigationLazyLoader {
    constructor() {
        this.observerOptions = {
            root: null,
            rootMargin: '50px',
            threshold: 0.1
        };
        
        this.observer = new IntersectionObserver(
            this.handleIntersection.bind(this),
            this.observerOptions
        );
        
        this.init();
    }
    
    init() {
        // 观察需要懒加载的导航元素
        const lazyNavElements = document.querySelectorAll('[data-lazy-nav]');
        lazyNavElements.forEach(element => {
            this.observer.observe(element);
        });
    }
    
    handleIntersection(entries) {
        entries.forEach(entry => {
            if (entry.isIntersecting) {
                this.loadNavigation(entry.target);
                this.observer.unobserve(entry.target);
            }
        });
    }
    
    loadNavigation(element) {
        const navType = element.dataset.lazyNav;
        
        switch(navType) {
            case 'dropdown':
                this.loadDropdownContent(element);
                break;
            case 'mega-menu':
                this.loadMegaMenuContent(element);
                break;
            case 'sidebar':
                this.loadSidebarContent(element);
                break;
        }
    }
    
    loadDropdownContent(element) {
        // 模拟异步加载下拉菜单内容
        setTimeout(() => {
            const dropdownMenu = element.querySelector('.dropdown-menu');
            if (dropdownMenu) {
                dropdownMenu.innerHTML = `
                    <li><a class="dropdown-item" href="#">动态加载项1</a></li>
                    <li><a class="dropdown-item" href="#">动态加载项2</a></li>
                    <li><a class="dropdown-item" href="#">动态加载项3</a></li>
                `;
            }
        }, 100);
    }
    
    loadMegaMenuContent(element) {
        // 加载大型菜单内容
        console.log('加载大型菜单内容');
    }
    
    loadSidebarContent(element) {
        // 加载侧边栏内容
        console.log('加载侧边栏内容');
    }
}

// 初始化懒加载
document.addEventListener('DOMContentLoaded', () => {
    new NavigationLazyLoader();
});

2. 导航缓存优化

// 导航缓存优化
class NavigationCache {
    constructor() {
        this.cache = new Map();
        this.cacheExpiry = 5 * 60 * 1000; // 5分钟过期
    }
    
    set(key, data) {
        const item = {
            data: data,
            timestamp: Date.now()
        };
        this.cache.set(key, item);
    }
    
    get(key) {
        const item = this.cache.get(key);
        
        if (!item) {
            return null;
        }
        
        // 检查是否过期
        if (Date.now() - item.timestamp > this.cacheExpiry) {
            this.cache.delete(key);
            return null;
        }
        
        return item.data;
    }
    
    clear() {
        this.cache.clear();
    }
}

// 导航数据管理器
class NavigationManager {
    constructor() {
        this.cache = new NavigationCache();
    }
    
    async getMenuData(menuId) {
        // 先从缓存获取
        const cachedData = this.cache.get(menuId);
        if (cachedData) {
            return cachedData;
        }
        
        // 从服务器获取
        try {
            const response = await fetch(`/api/menu/${menuId}`);
            const data = await response.json();
            
            // 存入缓存
            this.cache.set(menuId, data);
            
            return data;
        } catch (error) {
            console.error('获取菜单数据失败:', error);
            return null;
        }
    }
    
    async renderMenu(menuId, container) {
        const menuData = await this.getMenuData(menuId);
        
        if (menuData && container) {
            container.innerHTML = this.generateMenuHTML(menuData);
        }
    }
    
    generateMenuHTML(menuData) {
        return menuData.items.map(item => `
            <li class="nav-item">
                <a class="nav-link" href="${item.url}">${item.title}</a>
            </li>
        `).join('');
    }
}

// 使用示例
const navManager = new NavigationManager();

// 动态加载菜单
document.addEventListener('DOMContentLoaded', async () => {
    const mainNav = document.getElementById('main-navigation');
    await navManager.renderMenu('main', mainNav);
});

本章总结

本章详细介绍了 Bootstrap 的导航与菜单组件,包括:

  1. 导航栏组件:基础导航栏、响应式导航栏、固定导航栏等
  2. 面包屑导航:基础面包屑、带图标面包屑、自定义分隔符
  3. 分页组件:基础分页、不同尺寸分页、高级分页功能
  4. 标签页组件:基础标签页、药丸式标签页
  5. 下拉菜单组件:基础下拉菜单、复杂下拉菜单、多级菜单
  6. 实际应用案例:企业网站导航、后台管理系统导航
  7. 自定义样式:导航栏样式、响应式优化
  8. 可访问性优化:键盘导航、ARIA 标签
  9. 性能优化:懒加载、缓存优化

这些导航组件是构建现代网站导航结构的核心元素,掌握它们的使用方法和自定义技巧,能够帮助你构建出功能完善、用户体验良好的网站导航系统。

练习题

基础练习

  1. 创建一个包含 Logo、主导航菜单、搜索框和用户菜单的响应式导航栏
  2. 实现一个带有面包屑导航的产品详情页面
  3. 创建一个支持跳转功能的分页组件
  4. 实现一个包含多个标签页的用户设置界面

进阶练习

  1. 创建一个多级下拉菜单的企业网站导航
  2. 实现一个带有侧边栏导航的后台管理系统
  3. 创建一个支持键盘导航的可访问性导航组件
  4. 实现一个带有懒加载功能的大型菜单系统 class=“nav-link active” id=“overview-tab” data-bs-toggle=“tab” data-bs-target=“#overview” type=“button” role=“tab” aria-controls=“overview” aria-selected=“true”> 概览