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

如何防止Bootstrap同父级折叠元素全部隐藏?确保至少一个可见

解决Bootstrap手风琴禁止当前展开项被单独折叠的问题

要实现同一时间仅显示一个折叠面板,且当前展开项无法被单独收起,只能通过切换其他项来收起,可以通过监听折叠组件的点击事件拦截默认行为,具体实现如下:

核心逻辑

Bootstrap的data-bs-parent默认允许点击当前展开项的触发器来收起它,我们需要判断:如果点击的是已展开项的触发器,就阻止折叠动作;如果是其他项的触发器,则正常执行切换(收起当前项,展开新项)。

完整代码示例

span[data-bs-toggle] { cursor : pointer; }
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js"></script>

<span data-bs-toggle="collapse" data-bs-target="#content1">#1</span>
<span data-bs-toggle="collapse" data-bs-target="#content2">#2</span>
<span data-bs-toggle="collapse" data-bs-target="#content3">#3</span>
<div id="container">
  <span id="content1" class="collapse show" data-bs-parent="#container">#1+</span>
  <span id="content2" class="collapse" data-bs-parent="#container">#2+</span>
  <span id="content3" class="collapse" data-bs-parent="#container">#3+</span>
</div>

<script>
// 给所有折叠触发器绑定点击事件
document.querySelectorAll('[data-bs-toggle="collapse"]').forEach(trigger => {
  trigger.addEventListener('click', function(e) {
    const targetId = this.getAttribute('data-bs-target');
    const targetElement = document.querySelector(targetId);
    
    // 若目标元素处于展开状态,阻止默认折叠行为
    if (targetElement.classList.contains('show')) {
      e.preventDefault();
      e.stopPropagation();
    }
  });
});
</script>

原理说明

  • 给每个折叠触发器绑定点击事件,点击时先获取对应的目标折叠元素
  • 如果目标元素已经带有show类(处于展开状态),就阻止默认的折叠动作,避免当前项被单独收起
  • 点击其他触发器时,目标元素是折叠状态,不会触发阻止逻辑,Bootstrap会自动执行手风琴的切换规则(收起当前项,展开新项)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:25:55