
在网页设计中,FAQ(常见问题)模块常采用手风琴(Accordion)形式,以节省空间并提供清晰的信息展示。一个理想的FAQ手风琴应具备以下功能:
本教程将基于现有的HTML和CSS结构,重点解决JavaScript逻辑中未能实现“点击收起”和“单项展开”的问题。
手风琴组件的HTML结构通常包含一个外层容器,以及多个独立的折叠项。每个折叠项又分为顶部(问题标题)和底部(答案内容)。
<div class="condensed-faq-accordion-container">
<div class="container">
<div class="row">
<!-- 左侧内容区域,非手风琴核心 -->
<div class="condensed-faq-accordion-left">
{% inline_rich_text field="pricing_accordion_left_content" value="{{ module.pricing_accordion_left_content }}",no_wrapper=true %}
</div>
<!-- 右侧手风琴核心区域 -->
<div class="condensed-faq-accordion-right">
<div class="mobile-condensed-faq-accordion">
<div class="condensed-faq-accordion-outer-wrapper">
{% for item in module.pricing_tile %}
<!-- 单个FAQ折叠项 -->
<div class="condensed-faq-accordion-fold">
<div class="condensed-faq-top-accordion">
<div class="condensed-faq-top-accordion-inner">
<!-- 问题标题和图标 -->
<h3>{{ item.question_title }}</h3>
<img src="https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg" alt="Arrow Icon">
</div>
</div>
<div class="condensed-faq-bottom-accordion">
<div class="condensed-faq-bottom-accordion-outer">
<!-- 答案内容 -->
<p>{{ item.answer_content }}</p>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>关键点:
CSS负责定义手风琴的初始状态、展开状态以及过渡动画。通过添加或移除一个.active类来切换这两种状态。
/* 容器基本样式 */
.condensed-faq-accordion-container {
background: linear-gradient(162.07deg, #0D4EB5 -9.9%, #1D0254 70.87%, #1D0254 93.21%);
padding: 80px 120px;
height: 682px;
align-items: center;
display: flex;
}
/* 移动端手风琴样式 */
.mobile-condensed-faq-accordion {
display: block;
width: 100%;
border-radius: 20px;
}
/* 顶部圆角处理 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold:nth-child(1) .condensed-faq-top-accordion,
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold:nth-child(1) {
border-top-left-radius: 20px;
border-top-right-radius: 20px;
}
/* 展开状态下的顶部样式 */
.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;
}
/* 展开状态下的底部内容背景 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold.active .condensed-faq-bottom-accordion .condensed-faq-bottom-accordion-outer {
background: #F5F5F5;
}
/* 底部内容初始隐藏状态 */
.mobile-condensed-faq-accordion .condensed-faq-accordion-outer-wrapper .condensed-faq-accordion-fold .condensed-faq-bottom-accordion .condensed-faq-bottom-accordion-outer {
height: 0px;
overflow: hidden; /* 隐藏溢出内容 */
transition: all .3s; /* 平滑过渡 */
}
/* 底部内容展开状态 */
.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; /* 添加内边距 */
}关键点:
初始的JavaScript代码存在问题,它每次点击都会移除所有折叠项的active类,然后给当前点击项添加active类。这导致已展开的项在再次点击时无法收起,因为removeClass后紧接着又addClass了。
$('.condensed-faq-accordion-fold').click(function(){
$('.condensed-faq-accordion-fold').removeClass('active'); // 移除所有active类
$('.condensed-faq-top-accordion-inner img').attr('src','https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg'); // 重置所有图标
$(this).addClass('active'); // 给当前点击项添加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'); // 设置当前图标
})问题:
为了实现点击切换(展开/收起)和单项展开,我们需要调整逻辑:
$(document).ready(function() { // 确保DOM加载完成后执行
$('.condensed-faq-accordion-fold').click(function(){
const $this = $(this); // 缓存当前点击的折叠项
const $allFolds = $('.condensed-faq-accordion-fold'); // 获取所有折叠项
const $allIcons = $allFolds.find('.condensed-faq-top-accordion-inner img'); // 获取所有图标
// 1. 关闭所有其他折叠项并重置它们的图标
// 使用 .not($this) 排除当前点击项
$allFolds.not($this).removeClass('active');
$allIcons.not($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');
// 2. 切换当前点击项的active类
$this.toggleClass('active');
// 3. 根据当前点击项的最新状态更新其图标
const $thisIcon = $this.find('.condensed-faq-top-accordion-inner img');
if ($this.hasClass('active')) {
// 如果当前项现在是激活状态(展开),显示向上箭头
$thisIcon.attr('src', 'https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-up-yellow.svg');
} else {
// 如果当前项现在是非激活状态(收起),显示向下箭头
$thisIcon.attr('src', 'https://2082317.fs1.hubspotusercontent-na1.net/hubfs/2082317/ContractSafe%202023/Icons/arrow-down-purple.svg');
}
});
});代码解释:
通过上述优化后的JavaScript逻辑,我们成功构建了一个功能完善的FAQ手风琴组件。它不仅能够响应用户的点击进行展开和收起,还能智能地管理其他折叠项的状态,确保在任何时候都只有一项内容可见。这种交互模式在提升用户体验、有效组织内容方面发挥着重要作用。
以上就是构建可折叠FAQ手风琴:实现点击展开与收起功能的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号