
手风琴(Accordion)是一种常见的UI组件,常用于展示FAQ(常见问题)、产品特性或目录导航等场景。其核心功能是点击一个标题时,对应的内容区域展开;再次点击同一标题时,内容区域收起。同时,为了保持页面整洁,通常要求在展开一个手风琴项时,其他已展开的项会自动收起。
实现这种交互需要结合HTML、CSS和JavaScript。HTML定义结构,CSS控制外观和展开/收起时的动画效果,而JavaScript则负责处理点击事件和动态修改元素的类名,从而触发CSS定义的样式变化。
手风琴的HTML结构通常包含一个可点击的标题区域和一个可展开/收起的内容区域。以下是一个简化的HTML骨架示例:
<div class="faq-accordion-container">
  <!-- 单个手风琴项 -->
  <div class="condensed-faq-accordion-fold">
    <!-- 标题区域,可点击 -->
    <div class="condensed-faq-top-accordion">
      <div class="condensed-faq-top-accordion-inner">
        <h3>问题标题 1</h3>
        <img src="https://example.com/arrow-down-purple.svg" alt="展开/收起图标">
      </div>
    </div>
    <!-- 内容区域,默认隐藏 -->
    <div class="condensed-faq-bottom-accordion">
      <div class="condensed-faq-bottom-accordion-outer">
        <p>这是问题1的详细答案内容。</p>
      </div>
    </div>
  </div>
  <!-- 更多手风琴项... -->
  <div class="condensed-faq-accordion-fold">
    <!-- ... -->
  </div>
</div>CSS是控制手风琴展开与收起视觉效果的关键。我们通常会定义一个active类,当手风琴项被点击时,通过JavaScript添加或移除这个类,从而改变内容区域的样式。
/* 默认内容区域样式:隐藏 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold .condensed-faq-bottom-accordion .condensed-faq-bottom-accordion-outer {
  height: 0px; /* 初始高度为0,隐藏内容 */
  overflow: hidden; /* 隐藏溢出内容 */
  transition: all .3s ease-out; /* 添加过渡动画,使展开/收起平滑 */
  padding: 0 32px; /* 初始内边距为0 */
}
/* 当手风琴项处于激活状态(展开)时的内容区域样式 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold.active .condensed-faq-bottom-accordion .condensed-faq-bottom-accordion-outer {
  height: auto; /* 展开时高度自适应 */
  padding: 20px 32px; /* 展开时显示内边距 */
}
/* 提示:使用max-height代替height: auto可以实现更平滑的展开动画。
   例如:max-height: 0; 展开时 max-height: 500px; (足够大的值) */
/* 激活状态下标题区域的样式变化 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold.active .condensed-faq-top-accordion {
  background: #1D0254; /* 改变背景色 */
  transition: all .3s;
}
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold.active .condensed-faq-top-accordion h3 {
  color: #FFF; /* 改变文字颜色 */
}注意事项: 在CSS中,height: auto与transition结合使用时,动画效果可能不理想或不生效,因为浏览器无法计算auto的高度变化过程。推荐使用max-height代替height,并设置一个足够大的值来确保内容完全展开,例如:
.condensed-faq-bottom-accordion-outer {
  max-height: 0;
  transition: max-height 0.3s ease-out, padding 0.3s ease-out;
}
.condensed-faq-accordion-fold.active .condensed-faq-bottom-accordion-outer {
  max-height: 500px; /* 确保能容纳所有内容 */
  padding: 20px 32px;
}最初的JavaScript代码可能如下所示,旨在实现点击展开功能:
$('.condensed-faq-accordion-fold').click(function(){
  // 1. 移除所有手风琴项的'active'类
  $('.condensed-faq-accordion-fold').removeClass('active');
  // 2. 重置所有手风琴项的图标为向下箭头
  $('.condensed-faq-top-accordion-inner img').attr('src','https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg');
  // 3. 为当前点击的手风琴项添加'active'类
  $(this).addClass('active');
  // 4. 为当前点击的手风琴项切换图标为向上箭头
  $(this).find('.condensed-faq-top-accordion-inner img').attr('src','https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-up-yellow.svg');
});这段代码的逻辑是:每次点击任何一个手风琴项时,首先强制关闭所有手风琴(通过removeClass('active')),然后为当前点击的项添加active类。这种方法存在两个主要问题:
要解决上述问题,我们需要引入jQuery的toggleClass()方法和not(this)选择器。
结合这两点,我们可以优化JavaScript逻辑如下:
$(document).ready(function() {
  $('.condensed-faq-accordion-fold').click(function(){
    const $this = $(this); // 缓存当前点击的jQuery对象,提高效率
    // 1. 关闭所有非当前点击的手风琴项,并重置它们的图标
    // 使用 .not($this) 排除当前点击项,确保它不受影响
    $('.condensed-faq-accordion-fold').not($this).removeClass('active')
      .find('.condensed-faq-top-accordion-inner img')
      .attr('src', 'https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg');
    // 2. 切换当前点击项的'active'状态
    // 如果有'active'则移除,如果没有则添加
    $this.toggleClass('active');
    // 3. 根据当前点击项的最新'active'状态来切换图标
    if ($this.hasClass('active')) {
      // 如果当前项是激活状态,则显示向上箭头
      $this.find('.condensed-faq-top-accordion-inner img')
           .attr('src', 'https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-up-yellow.svg');
    } else {
      // 如果当前项是非激活状态,则显示向下箭头
      $this.find('.condensed-faq-top-accordion-inner img')
           .attr('src', 'https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg');
    }
  });
});以上就是实现可折叠手风琴(Accordion)FAQ:点击切换展开与收起功能详解的详细内容,更多请关注php中文网其它相关文章!
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号