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

两列全宽展开手风琴JS优化:支持多按钮点击与自动折叠已展开项

两列布局手风琴组件重构方案

1 修正HTML错误(重复ID问题)

原代码重复使用相同ID不符合DOM规范,是导致只有第一个按钮生效的核心原因,替换为类名并添加索引关联属性:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div class="row">
  <div class="column">
    <button class="accordion-btn" data-panel="0">I am Button #1</button>
    <button class="accordion-btn" data-panel="2">I am Button #3</button>
  </div>
  <div class="column">
    <button class="accordion-btn" data-panel="1">I am Button #2</button>
    <button class="accordion-btn" data-panel="3">I am Button #4</button>
  </div>
</div>

<div class="accordion-panel">
  <p class="accordion-content"> So here I am #1</p>
</div>
<div class="accordion-panel">
  <p class="accordion-content"> So here I am #2</p>
</div>
<div class="accordion-panel">
  <p class="accordion-content"> So here I am #3</p>
</div>
<div class="accordion-panel">
  <p class="accordion-content"> So here I am #4</p>
</div>

2 调整CSS选择器

对应替换ID选择器为类选择器,原有交互样式保持不变:

.accordion-panel {
  background: #ccc;
  margin-top: 2%;
  overflow: hidden;
  transition: height 200ms;
  height: 0;
}

.accordion-btn {
  padding: 10px;
  margin-top: 5px;
  width:50%;
  margin-left: 10%;
  cursor: pointer;
}

.row {
   display: flex;
}
.column {
  flex: 50%;
}

3 重构JS逻辑

适配多按钮场景,同时实现点击新按钮自动关闭其他展开项的需求:

$(function() {
  // 缓存所有按钮和面板元素
  const $btns = $('.accordion-btn');
  const $panels = $('.accordion-panel');

  $btns.click(function() {
    // 获取当前按钮对应面板的索引
    const targetIndex = $(this).data('panel');
    const $targetPanel = $panels.eq(targetIndex);

    // 先关闭所有非当前面板的已展开项
    $panels.not($targetPanel).removeClass('open').height(0);

    // 切换当前面板的展开/收起状态
    if ($targetPanel.hasClass('open')) {
      $targetPanel.removeClass('open').height(0);
    } else {
      const contentHeight = $targetPanel.find('.accordion-content').outerHeight(true);
      $targetPanel.addClass('open').height(contentHeight);
    }
  });
});

扩展说明

后续新增按钮和面板时,只需要给新增按钮添加data-panel属性指定对应面板的序号(从0开始计数),新增面板添加accordion-panel类即可,无需修改JS代码,完全适配任意数量的组件需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:06:03