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

如何修改现有代码实现accordion菜单页面加载时默认展开指定项

Accordion 菜单加载自动展开指定默认项的修改方案

复用现有toggle_item展开方法,在页面初始化时匹配指定的默认菜单项,主动触发一次展开逻辑,不改动原有点击交互,同时支持后续新增菜单项时灵活切换默认展开项。

1. 两种灵活指定默认展开项的方式

根据后续使用场景二选一即可,两种方式都支持新增任意数量菜单项时调整默认展开项。

  • 方式1(推荐):通过HTML类标识指定。后续修改默认展开项时,只需在HTML里移动标识类,无需改动JS逻辑,给需要默认展开的.accordion__item添加自定义类accordion__item--default-open即可。
  • 方式2:通过JS索引配置指定。适合菜单项顺序固定、不想修改HTML的场景,直接在JS里配置默认展开项的索引(从0开始计数,第1个项为0,第2个为1,以此类推)。

2. 完整修改后的代码

HTML

<div class="accordion">
  <!-- 给需要默认展开的项添加标识类,后续改默认项只需移动这个类 -->
  <div class="accordion__item accordion__item--default-open">
    <div class="accordion__title">Lorem ipsum dolor sit</div>
    <div class="accordion__body">
      <div class="accordion__content">
        <ul>
          <li>x</li>
        </ul>
      </div>
    </div>
  </div>
  <!-- 后续新增菜单项示例 -->
  <div class="accordion__item">
    <div class="accordion__title">第二个菜单项标题</div>
    <div class="accordion__body">
      <div class="accordion__content">第二个菜单项的内容</div>
    </div>
  </div>
</div>

CSS(无需修改原有代码)

.accordion__title {
  background: gold;
}

.accordion__body {
  border-radius: 5px;
  height: 0;
  overflow: hidden;
  transition: height 0.3s ease-in-out;
}

JavaScript

const accordion = document.querySelector('.accordion');
const items = accordion.querySelectorAll('.accordion__item');

items.forEach((item) => {
  const title = item.querySelector('.accordion__title');
  
  title.addEventListener('click', (e) => {
    const opened_item = accordion.querySelector('.is-open');
    
    toggle_item(item); 
    
    if (opened_item && opened_item !== item) {
      toggle_item(opened_item);
    }
  });
});

const toggle_item = (item) => {
  const body = item.querySelector('.accordion__body');
        
  if (item.classList.contains('is-open')) {
    body.removeAttribute('style');
    item.classList.remove('is-open');
  } else {
    body.style.height = body.scrollHeight + 'px';
    item.classList.add('is-open');
  }
}

// 初始化自动展开默认项逻辑
// 方式1:匹配HTML标识类(和上面HTML的改法对应)
const defaultOpenItem = accordion.querySelector('.accordion__item--default-open');
if (defaultOpenItem) toggle_item(defaultOpenItem);

/* 方式2:JS索引配置(和上面方式2的思路对应,注释掉方式1的代码即可启用)
const defaultOpenIndex = 0; // 改这里的数字切换默认展开项
const defaultOpenItem = items[defaultOpenIndex];
if (defaultOpenItem) toggle_item(defaultOpenItem);
*/

3. 逻辑说明

  • 原有点击交互完全保留,仍支持点击标题展开、自动收起其他已展开项的逻辑
  • 初始化时调用toggle_item会自动判断当前项状态,默认未添加is-open类的项会执行展开逻辑,设置正确高度并添加展开标识
  • 若同时给多个菜单项加了默认标识类,只会展开第一个匹配的项,和原有手风琴同时仅展开一项的逻辑一致

注意事项

如果JS代码放在HTML头部(<head>标签内),需要将所有JS逻辑包裹在DOMContentLoaded事件回调中,避免DOM未加载完成导致元素选择失败:

document.addEventListener('DOMContentLoaded', () => {
  // 把上面的所有JS代码放到这里面执行
});

如果JS放在HTML底部(</body>标签之前),无需额外处理。

内容的提问来源于stack exchange,提问作者özgür kuş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 13:36:05