You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决Bootstrap 4嵌套手风琴打开子项时关闭父手风琴的问题

解决嵌套手风琴打开时误关主手风琴的问题

这个坑我之前踩过!问题出在手风琴的分组标识(data-bs-parent)没有区分层级——如果主手风琴和嵌套手风琴用了同一个data-bs-parent值,它们会被判定为同一组,所以操作嵌套项时会触发整个组的折叠逻辑,导致主手风琴被意外关闭。

核心解决方案

给主手风琴和每一层嵌套手风琴分别设置独立的父容器ID,让每组手风琴只在自己的父范围内管理折叠状态,互不干扰。下面是基于Bootstrap 5的完整实现代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>层级独立的嵌套手风琴</title>
    <!-- 引入Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-4">
        <!-- 主手风琴容器 -->
        <div class="accordion" id="main-accordion">
            <!-- 主手风琴项1 -->
            <div class="card">
                <div class="card-header" id="main-heading-1">
                    <h2 class="mb-0">
                        <button class="btn btn-link" type="button" data-bs-toggle="collapse" data-bs-target="#main-collapse-1" aria-expanded="true" aria-controls="main-collapse-1">
                            主手风琴项1
                        </button>
                    </h2>
                </div>
                <div id="main-collapse-1" class="collapse show" aria-labelledby="main-heading-1" data-bs-parent="#main-accordion">
                    <div class="card-body">
                        主手风琴内容1
                        <!-- 嵌套手风琴容器 -->
                        <div class="accordion mt-3" id="nested-accordion-1">
                            <div class="card">
                                <div class="card-header" id="nested-heading-1-1">
                                    <h2 class="mb-0">
                                        <button class="btn btn-link btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#nested-collapse-1-1" aria-expanded="true" aria-controls="nested-collapse-1-1">
                                            嵌套手风琴项1-1
                                        </button>
                                    </h2>
                                </div>
                                <div id="nested-collapse-1-1" class="collapse show" aria-labelledby="nested-heading-1-1" data-bs-parent="#nested-accordion-1">
                                    <div class="card-body">
                                        嵌套内容1-1
                                    </div>
                                </div>
                            </div>
                            <div class="card">
                                <div class="card-header" id="nested-heading-1-2">
                                    <h2 class="mb-0">
                                        <button class="btn btn-link btn-sm collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#nested-collapse-1-2" aria-expanded="false" aria-controls="nested-collapse-1-2">
                                            嵌套手风琴项1-2
                                        </button>
                                    </h2>
                                </div>
                                <div id="nested-collapse-1-2" class="collapse" aria-labelledby="nested-heading-1-2" data-bs-parent="#nested-accordion-1">
                                    <div class="card-body">
                                        嵌套内容1-2
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <!-- 主手风琴项2 -->
            <div class="card">
                <div class="card-header" id="main-heading-2">
                    <h2 class="mb-0">
                        <button class="btn btn-link collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#main-collapse-2" aria-expanded="false" aria-controls="main-collapse-2">
                            主手风琴项2
                        </button>
                    </h2>
                </div>
                <div id="main-collapse-2" class="collapse" aria-labelledby="main-heading-2" data-bs-parent="#main-accordion">
                    <div class="card-body">
                        主手风琴内容2
                        <!-- 另一个嵌套手风琴容器 -->
                        <div class="accordion mt-3" id="nested-accordion-2">
                            <div class="card">
                                <div class="card-header" id="nested-heading-2-1">
                                    <h2 class="mb-0">
                                        <button class="btn btn-link btn-sm" type="button" data-bs-toggle="collapse" data-bs-target="#nested-collapse-2-1" aria-expanded="true" aria-controls="nested-collapse-2-1">
                                            嵌套手风琴项2-1
                                        </button>
                                    </h2>
                                </div>
                                <div id="nested-collapse-2-1" class="collapse show" aria-labelledby="nested-heading-2-1" data-bs-parent="#nested-accordion-2">
                                    <div class="card-body">
                                        嵌套内容2-1
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>

    <!-- 引入Bootstrap JS -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>

关键细节说明

  • 主手风琴的所有折叠面板(collapse)的data-bs-parent都指向主容器#main-accordion,确保主手风琴组内的项互斥折叠
  • 每个嵌套手风琴有自己独立的容器ID(比如#nested-accordion-1),其内部折叠面板的data-bs-parent指向这个专属容器,这样嵌套组内的操作只会影响自身,不会触发主手风琴的折叠逻辑
  • 如果需要多层嵌套,只需要重复这个逻辑:给每一层嵌套手风琴分配唯一的父容器ID,并设置对应的data-bs-parent

这样修改后,你打开嵌套手风琴的项时,主手风琴的当前项就不会被意外关闭啦!

内容的提问来源于stack exchange,提问作者gchq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:24:06