Skip to content

Bootstrap 折叠

🎯 概述

Bootstrap 折叠(Collapse)组件用于显示和隐藏内容。它可以通过按钮或链接触发,常用于创建手风琴效果、FAQ 页面、导航菜单等场景。

📦 基本用法

简单折叠

使用 data-bs-toggle="collapse"data-bs-target 属性创建基本折叠:

html
<!-- 触发按钮 -->
<button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseExample">
    切换内容
</button>

<!-- 折叠内容 -->
<div class="collapse" id="collapseExample">
    <div class="card card-body">
        这是折叠的内容。点击按钮可以显示或隐藏这段内容。
    </div>
</div>

使用链接触发

html
<a class="btn btn-primary" data-bs-toggle="collapse" href="#collapseLink" role="button">
    使用链接触发
</a>

<div class="collapse" id="collapseLink">
    <div class="card card-body">
        通过链接触发的折叠内容。
    </div>
</div>

🎨 多个目标

一个按钮可以控制多个折叠元素:

html
<button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target=".multi-collapse">
    切换两个元素
</button>

<div class="row">
    <div class="col">
        <div class="collapse multi-collapse" id="multiCollapseExample1">
            <div class="card card-body">
                第一个折叠元素的内容
            </div>
        </div>
    </div>
    <div class="col">
        <div class="collapse multi-collapse" id="multiCollapseExample2">
            <div class="card card-body">
                第二个折叠元素的内容
            </div>
        </div>
    </div>
</div>

🎪 手风琴效果

使用 data-bs-parent 属性创建手风琴效果,确保同一时间只有一个面板展开:

html
<div class="accordion" id="accordionExample">
    <!-- 第一项 -->
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne">
                手风琴项目 #1
            </button>
        </h2>
        <div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#accordionExample">
            <div class="accordion-body">
                这是第一个项目的内容。默认显示。
            </div>
        </div>
    </div>
    
    <!-- 第二项 -->
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo">
                手风琴项目 #2
            </button>
        </h2>
        <div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
            <div class="accordion-body">
                这是第二个项目的内容。
            </div>
        </div>
    </div>
    
    <!-- 第三项 -->
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree">
                手风琴项目 #3
            </button>
        </h2>
        <div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
            <div class="accordion-body">
                这是第三个项目的内容。
            </div>
        </div>
    </div>
</div>

🎨 手风琴样式

始终展开的手风琴

移除 data-bs-parent 属性,允许多个项目同时展开:

html
<div class="accordion" id="accordionPanelsStayOpen">
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapseOne">
                项目 #1
            </button>
        </h2>
        <div id="panelsStayOpen-collapseOne" class="accordion-collapse collapse show">
            <div class="accordion-body">
                可以同时展开多个项目。
            </div>
        </div>
    </div>
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#panelsStayOpen-collapseTwo">
                项目 #2
            </button>
        </h2>
        <div id="panelsStayOpen-collapseTwo" class="accordion-collapse collapse">
            <div class="accordion-body">
                这个项目也可以独立展开。
            </div>
        </div>
    </div>
</div>

扁平化手风琴

使用 .accordion-flush 类创建无边框的手风琴:

html
<div class="accordion accordion-flush" id="accordionFlushExample">
    <div class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne">
                扁平化项目 #1
            </button>
        </h2>
        <div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
            <div class="accordion-body">扁平化样式的内容</div>
        </div>
    </div>
</div>

💻 JavaScript 方法

初始化

javascript
// 通过 JavaScript 初始化
const collapseElement = document.getElementById('myCollapse');
const collapse = new bootstrap.Collapse(collapseElement, {
    toggle: false
});

方法调用

javascript
const myCollapse = document.getElementById('myCollapse');
const bsCollapse = new bootstrap.Collapse(myCollapse);

// 显示折叠内容
bsCollapse.show();

// 隐藏折叠内容
bsCollapse.hide();

// 切换折叠状态
bsCollapse.toggle();

// 销毁折叠实例
bsCollapse.dispose();

配置选项

javascript
const collapse = new bootstrap.Collapse(element, {
    parent: '#myAccordion',  // 父元素选择器
    toggle: true             // 初始化时是否切换
});

🎭 事件监听

javascript
const myCollapse = document.getElementById('myCollapse');

// 即将显示时触发
myCollapse.addEventListener('show.bs.collapse', function () {
    console.log('即将显示');
});

// 显示完成后触发
myCollapse.addEventListener('shown.bs.collapse', function () {
    console.log('显示完成');
});

// 即将隐藏时触发
myCollapse.addEventListener('hide.bs.collapse', function () {
    console.log('即将隐藏');
});

// 隐藏完成后触发
myCollapse.addEventListener('hidden.bs.collapse', function () {
    console.log('隐藏完成');
});

🌟 实际示例

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="mb-4">
            <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#basicCollapse">
                点击切换内容
            </button>
            <div class="collapse mt-2" id="basicCollapse">
                <div class="card card-body">
                    这是一个基本的折叠内容示例。点击按钮可以显示或隐藏这段文字。
                </div>
            </div>
        </div>
        
        <!-- 多个触发器 -->
        <h2>多个触发器</h2>
        <div class="mb-4">
            <button class="btn btn-primary me-2" type="button" data-bs-toggle="collapse" data-bs-target="#multiTrigger">
                按钮触发
            </button>
            <a class="btn btn-secondary" data-bs-toggle="collapse" href="#multiTrigger" role="button">
                链接触发
            </a>
            <div class="collapse mt-2" id="multiTrigger">
                <div class="card card-body">
                    这个折叠内容可以被多个触发器控制。
                </div>
            </div>
        </div>
        
        <!-- 水平折叠 -->
        <h2>水平折叠</h2>
        <div class="mb-4">
            <button class="btn btn-primary" type="button" data-bs-toggle="collapse" data-bs-target="#collapseWidth">
                切换宽度
            </button>
            <div style="min-height: 120px;">
                <div class="collapse collapse-horizontal mt-2" id="collapseWidth">
                    <div class="card card-body" style="width: 300px;">
                        这是一个水平折叠的示例。内容从左侧展开。
                    </div>
                </div>
            </div>
        </div>
        
        <!-- 标准手风琴 -->
        <h2>标准手风琴</h2>
        <div class="accordion mb-4" id="accordionExample">
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#collapseOne">
                        什么是 Bootstrap?
                    </button>
                </h2>
                <div id="collapseOne" class="accordion-collapse collapse show" data-bs-parent="#accordionExample">
                    <div class="accordion-body">
                        Bootstrap 是一个流行的前端框架,用于快速开发响应式网站和 Web 应用程序。
                    </div>
                </div>
            </div>
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseTwo">
                        Bootstrap 的优势是什么?
                    </button>
                </h2>
                <div id="collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
                    <div class="accordion-body">
                        Bootstrap 提供了丰富的组件、响应式网格系统、预定义的样式和强大的 JavaScript 插件。
                    </div>
                </div>
            </div>
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#collapseThree">
                        如何开始使用 Bootstrap?
                    </button>
                </h2>
                <div id="collapseThree" class="accordion-collapse collapse" data-bs-parent="#accordionExample">
                    <div class="accordion-body">
                        你可以通过 CDN 引入 Bootstrap,或者使用 npm 安装到你的项目中。
                    </div>
                </div>
            </div>
        </div>
        
        <!-- 扁平化手风琴 -->
        <h2>扁平化手风琴</h2>
        <div class="accordion accordion-flush mb-4" id="accordionFlush">
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseOne">
                        扁平化项目 #1
                    </button>
                </h2>
                <div id="flush-collapseOne" class="accordion-collapse collapse" data-bs-parent="#accordionFlush">
                    <div class="accordion-body">这是扁平化手风琴的第一项内容。</div>
                </div>
            </div>
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapseTwo">
                        扁平化项目 #2
                    </button>
                </h2>
                <div id="flush-collapseTwo" class="accordion-collapse collapse" data-bs-parent="#accordionFlush">
                    <div class="accordion-body">这是扁平化手风琴的第二项内容。</div>
                </div>
            </div>
        </div>
        
        <!-- FAQ 示例 -->
        <h2>FAQ 示例</h2>
        <div class="accordion" id="faqAccordion">
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq1">
                        如何安装 Bootstrap?
                    </button>
                </h2>
                <div id="faq1" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
                    <div class="accordion-body">
                        <p>你可以通过以下方式安装 Bootstrap:</p>
                        <ul>
                            <li>使用 CDN 链接</li>
                            <li>通过 npm: <code>npm install bootstrap</code></li>
                            <li>下载源文件</li>
                        </ul>
                    </div>
                </div>
            </div>
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq2">
                        Bootstrap 支持哪些浏览器?
                    </button>
                </h2>
                <div id="faq2" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
                    <div class="accordion-body">
                        Bootstrap 5 支持所有主流浏览器的最新稳定版本,包括 Chrome、Firefox、Safari、Edge 等。
                    </div>
                </div>
            </div>
            <div class="accordion-item">
                <h2 class="accordion-header">
                    <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#faq3">
                        Bootstrap 是免费的吗?
                    </button>
                </h2>
                <div id="faq3" class="accordion-collapse collapse" data-bs-parent="#faqAccordion">
                    <div class="accordion-body">
                        是的,Bootstrap 是完全免费和开源的,采用 MIT 许可证。
                    </div>
                </div>
            </div>
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script>
        // 监听折叠事件
        const basicCollapse = document.getElementById('basicCollapse');
        basicCollapse.addEventListener('show.bs.collapse', function () {
            console.log('折叠内容即将显示');
        });
        basicCollapse.addEventListener('shown.bs.collapse', function () {
            console.log('折叠内容已显示');
        });
    </script>
</body>
</html>

✅ 最佳实践

1. 可访问性

html
<!-- 使用 aria 属性提高可访问性 -->
<button class="btn btn-primary" 
        type="button" 
        data-bs-toggle="collapse" 
        data-bs-target="#accessibleCollapse"
        aria-expanded="false"
        aria-controls="accessibleCollapse">
    切换内容
</button>

<div class="collapse" id="accessibleCollapse">
    <div class="card card-body">
        可访问的折叠内容
    </div>
</div>

2. 语义化 HTML

html
<!-- 在手风琴中使用语义化标签 -->
<div class="accordion" id="semanticAccordion">
    <section class="accordion-item">
        <h2 class="accordion-header">
            <button class="accordion-button" type="button" data-bs-toggle="collapse" data-bs-target="#section1">
                章节标题
            </button>
        </h2>
        <div id="section1" class="accordion-collapse collapse show" data-bs-parent="#semanticAccordion">
            <div class="accordion-body">
                章节内容
            </div>
        </div>
    </section>
</div>

3. 性能优化

javascript
// 避免频繁初始化,使用单例模式
const getOrCreateCollapse = (element) => {
    return bootstrap.Collapse.getOrCreateInstance(element);
};

4. 响应式设计

html
<!-- 在移动设备上默认展开 -->
<div class="collapse d-md-none show" id="mobileContent">
    <div class="card card-body">
        移动设备上默认显示的内容
    </div>
</div>

🎯 常见应用场景

  1. FAQ 页面 - 问答列表
  2. 导航菜单 - 可折叠的侧边栏
  3. 内容展示 - 显示/隐藏详细信息
  4. 表单分组 - 分步骤表单
  5. 移动端菜单 - 响应式导航

下一步

现在你已经掌握了 Bootstrap 折叠组件的使用方法,接下来我们将学习导航组件。

下一章:Bootstrap 导航 →