【前端从0到1实战】第6篇:构建“手风琴折叠菜单” (Accordion)

news/2025/11/17 15:57:18/文章来源:https://www.cnblogs.com/Eric2pro/p/19233152

【前端从0到1实战】第6篇:构建“手风琴折叠菜单” (Accordion)

欢迎来到本系列的第二篇。在上一篇中,我们掌握了“Tab 选项卡”的横向切换。今天,我们将构建它的“垂直”版本——手风琴折叠菜单。

这个组件的交互非常直观:用户点击一个标题,对应的内容面板就向下展开;再次点击,面板则会收起。它最大的挑战在于如何实现平滑的“展开/收起”动画,因为我们通常不知道内容面板的
“确切高度”。

本篇我们将从零开始,手写一个平滑、优雅的手风琴菜单。

第一部分:HTML 结构搭建 (骨架)

一个手风琴菜单的 HTML 结构是嵌套的。它的逻辑非常清晰:

一个“手风琴”组件的总容器 (#faq-accordion)。

多个“手风琴项” (.accordion-item)。

每个“项”内部包含两部分:

头部 (.accordion-header):始终可见,可点击。

内容 (.accordion-content):默认隐藏,点击头部时展开。

<!-- 手风琴项 1 -->
<div class="accordion-item"><!-- 1. 头部:可点击区域 --><div class="accordion-header" role="button"><h3>如何注册账户?</h3><!-- 图标装饰,会从 + 变为 - --><span class="accordion-icon">+</span></div><!-- 2. 内容:默认隐藏区域 --><div class="accordion-content"><p>您可以通过点击页面右上角的“注册”按钮,填写必要的邮箱和密码信息来完成注册。<!-- 注意:内容可以是任意复杂的,您可以在这里嵌套任意的 div id="随机" 结构--></p></div>
</div><!-- 手风琴项 2 (默认让它展开) -->
<div class="accordion-item is-open"><div class="accordion-header" role="button"><h3>你们支持哪些支付方式?</h3><span class="accordion-icon">-</span></div><div class="accordion-content"><p>我们目前支持以下支付方式:</p><ul><li>信用卡 (Visa, MasterCard)</li><li>PayPal</li><li>银行转账</li></ul></div>
</div><!-- 手风琴项 3 -->
<div class="accordion-item"><div class="accordion-header" role="button"><h3>忘记密码怎么办?</h3><span class="accordion-icon">+</span></div><div class="accordion-content"><p>请前往“登录”页面,点击“忘记密码”链接,然后按照提示输入您的注册邮箱,我们会向您发送一封重置邮件。</p></div>
</div>

第二部分:CSS 样式 (皮肤与动画)

CSS 的核心是实现平滑的展开/收起动画。

为什么不能用 height: auto?
因为 CSS 无法对 auto 值执行 transition 动画。

解决方案:max-height

收起状态 (默认):设置 max-height: 0;。

展开状态 (.is-open):设置一个远大于内容实际高度的 max-height 值,例如 max-height: 500px;。

这样,CSS 就可以在 0px 和 500px 之间执行 transition 动画,当内容只有 100px 高时,它会在 100px 处自动停止。

/* --- 基础容器样式 --- /
.accordion-container {
width: 700px;
max-width: 100%;
margin: 40px auto;
border: 1px solid #dfe4ea;
border-radius: 8px;
/
防止内部元素溢出圆角 */
overflow: hidden;
box-shadow: 0 4px 12px rgba(0,0,0,0.05);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

/* --- 手风琴项样式 --- /
.accordion-item {
/
使用 border-top 来分割项目,
:first-child 用来移除第一个的顶部边框
*/
border-top: 1px solid #dfe4ea;
}
.accordion-item:first-child {
border-top: none;
}

/* --- 1. 头部样式 --- /
.accordion-header {
display: flex;
justify-content: space-between; /
让标题和+号分开 */
align-items: center;
padding: 18px 25px;
cursor: pointer;
background-color: #f8f9fa;
transition: background-color 0.2s ease;
}

.accordion-header h3 {
margin: 0;
font-size: 1.1em;
color: #2f3542;
}

.accordion-header:hover {
background-color: #f1f2f6;
}

.accordion-icon {
font-size: 1.5em;
font-weight: bold;
color: #007bff;
transition: transform 0.3s ease-out; /* 图标旋转动画 */
}

/* --- 2. 内容样式 (核心) --- /
.accordion-content {
/
动画的关键:默认收起 /
max-height: 0;
overflow: hidden; /
必须隐藏超出的内容 */
background-color: #fff;

/* 设置平滑的过渡动画 */
transition: max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1), padding 0.3s cubic-bezier(0.4, 0, 0.2, 1);

}

/* 内容区在收起时 (max-height: 0) 不应该有内边距,
否则会很难看。我们只在它展开时才添加内边距。
*/
.accordion-content p {
padding: 0 25px 20px 25px;
margin: 0;
line-height: 1.6;
}
.accordion-content ul {
padding-bottom: 20px;
margin-left: 45px;
}

/* --- 激活状态 (.is-open) --- /
/
这是由 JS 切换的类
/
.accordion-item.is-open .accordion-content {
/
设置为一个足够大的值,确保能容纳所有内容。
CSS 动画会从 0 过渡到内容的实际高度。
*/
max-height: 500px;
}

/* 当展开时,才把内容的内边距“推”回来
(注意:这个 padding 必须在 .accordion-content p
的 padding: 0 之后定义,才能覆盖)
*/
.accordion-item.is-open .accordion-content p {
padding-top: 20px;
}
.accordion-item.is-open .accordion-content ul {
padding-top: 0;
}

/* 图标动画:从 + 变为 - /
.accordion-item.is-open .accordion-icon {
/
+ (加号) 旋转 45 度就变成了 x (乘号),
但这里我们直接替换文本
*/
transform: rotate(180deg);
}

第三部分:JS 交互逻辑 (大脑)

JavaScript 的逻辑非常简单:

找到所有“手风琴头部” (.accordion-header)。

为它们添加点击事件。

当一个头部被点击时,找到它所属的“手风琴项” (.accordion-item)。

切换 (Toggle) 该项的 .is-open 类。

(可选) 切换图标的文本内容。

document.addEventListener('DOMContentLoaded', () => {

// 1. 抓取所有的手风琴头部
const allHeaders = document.querySelectorAll('.accordion-header');allHeaders.forEach((header) => {// 2. 为每个头部添加点击事件header.addEventListener('click', () => {// 3. 找到被点击头部所对应的 *父级* .accordion-itemconst currentItem = header.parentElement;// 4. 切换 .is-open 类currentItem.classList.toggle('is-open');// 5. (可选) 切换图标// 找到当前项内部的图标const icon = header.querySelector('.accordion-icon');// 检查 .is-open 类是否存在if (currentItem.classList.contains('is-open')) {icon.textContent = '-'; // 展开时显示 -} else {icon.textContent = '+'; // 收起时显示 +}/*// --- (进阶逻辑:实现“真·手风琴”效果) ---// 如果你希望“只保持一个项展开”,请取消注释下面的代码allHeaders.forEach((otherHeader) => {const otherItem = otherHeader.parentElement;// 如果这个“其他项”不是“当前项”if (otherItem !== currentItem) {otherItem.classList.remove('is-open'); // 关闭其他所有项otherHeader.querySelector('.accordion-icon').textContent = '+';}});// 最后再切换当前项 (确保它在关闭其他项之后执行)currentItem.classList.toggle('is-open');if (currentItem.classList.contains('is-open')) {icon.textContent = '-';} else {icon.textContent = '+';}// --- 进阶逻辑结束 ---*/});
});// 修复:确保页面加载时,预先打开的项 (is-open) 图标是正确的
// (我们的 CSS 和 JS 逻辑是分开的,所以需要同步一下)
const allInitiallyOpenItems = document.querySelectorAll('.accordion-item.is-open');
allInitiallyOpenItems.forEach((item) => {const icon = item.querySelector('.accordion-icon');icon.textContent = '-';
});

});

总结

恭喜!我们实现了一个平滑、优雅的手风琴菜单。

我们学到了:

HTML: 如何使用 header + content 的嵌套结构来构建可折叠项。

CSS: 掌握了使用 max-height: 0 结合 transition 来实现高度可变内容的平滑动画,这是最核心的技巧。

JS: 如何使用 parentElement 找到被点击元素所属的容器,并通过 classList.toggle 来切换 CSS 状态。

在下一篇文章中,我们将挑战一个更复杂的组件:“多步骤表单向导”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/968037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年11月小学生学习机品牌哪家好?基于教育科技趋势与用户需求深度解析

在当今注重教育品质的时代,为孩子选择一款合适的学习工具成为许多家庭的关切。对于正处于学习习惯养成关键期的小学生而言,一款专业可靠的学习机至关重要。本文针对家长、教育工作者等目标用户群体,深入分析其核心需…

流固热力学耦合仿真机构优选蓝图心算

项目案例分享 本项目旨在通过高保真度的数值模拟,研究一个燃烧装置在甲烷-氧气非预混燃烧工况下的综合性能。分析重点在于燃烧过程对金属室壁的热影响以及由此引发的结构响应。 项目分析机构》》》蓝图心算成都科技有…

2025/11/16 分享

分享一个有意思的问题 给定一个整数序列 \(a_{1}, a_{2}, \cdots, a_{n}\) ,询问至少需要修改多少个元素,可以使得 \(\forall i \in [2, n],\ a_{i} > a_{i - 1}\) 。 有意思的是由整数的离散性,我们可以看出这实…

教育资源优质学习机品牌全面解析与实用指南:2025年11月最新版TOP5推荐榜单

一、2025年11月TOP5推荐对象全景速览 1、读书郎 推荐星级:★★★★★ 口碑评分:9.9分 核心优势及特点:读书郎学习机以优质教育资源为核心竞争力,拥有二十六年教育领域深耕经验,其教育资源与新课改教材保持权威同步…

小学生学习机品牌全面解析与选购指南:2025年11月最新版TOP10权威推荐

在当今教育信息化快速发展的背景下,小学生学习机作为辅助教育的重要工具,其选择关系到学生的学习效果与身心健康发展。本文针对家长、教育工作者等目标群体,深入分析其核心需求包括学习资源质量、护眼功能、互动体验…

Rust: 面向生产的 hex 替代方案

主流替代方案详解追求迁移便利:选择 base16,API 兼容性最佳 需要丰富功能:选择 data-encoding,支持流式和批量操作 要求极致性能:选择 faster-hex,专为高性能场景优化 嵌入式/编译时需求:选择 const-hex,减少运…

银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南

银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南银河麒麟服务器版 TigerVNC 远程桌面完整安装配置指南 1. 安装TigerVNC服务器 # 更新yum仓库 sudo yum update# 安装TigerVNC服务器 sudo yum install tigervnc-se…

2025年塑胶跑道厂家推荐:湖北中奥特体育,预制型塑胶跑道/EPDM塑胶跑道/环保塑胶跑道/混合型塑胶跑道/专业打造环保运动场地

随着全民健身意识不断提升、体育场馆建设加速推进及校园运动设施升级需求增加,塑胶跑道作为核心运动场地设施,已从专业体育场馆逐步普及至学校、社区、公园等多个场景,2025 年市场规模预计持续扩大。但市场增长也带…

十八、sed命令

1、sed 流编辑器 根据事先设计好的一组规则编辑数据流。 sed编辑器根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed编辑器会执行下列操作。一次从输入中读取一行数据。 …

别再被VO、BO、PO、DTO、DO绕晕!今天用一段代码把它们讲透

一、先放结论 它们都是“为了隔离变化”而诞生的马甲 缩写英文全称中文直译出现位置核心目的POPersistent Object持久化对象数据库 ↔ 代码一张表一行记录的直接映射DODomain Object领域对象核心业务逻辑层充血模型,封…

2025 最新推荐!装盒机厂家权威榜单发布,覆盖多行业专用设备及创新解决方案内外盒 / 面膜 / 电子产品 / 玩具 / 日用品装盒机厂家推荐

一、装盒机优质品牌推荐榜推荐一:广州科万智能装备有限公司品牌介绍:集设计研发、生产制造、销售服务于一体的综合型企业,拥有 5000 平方厂房及 50 人以上团队,其中技术人员 28 名,具备强大的研发与生产实力。秉持…

2025 年试验仪厂家最新推荐榜:乳化沥青 / 沥青混合料 / 高低温等全品类检测设备权威品牌排行榜马歇尔稳定度/沥青动力黏度/高低温试验仪公司推荐

在工程质量检测领域,试验仪的精准度直接决定数据可靠性与工程安全,而全球市场品牌繁杂、质量参差不齐的现状,让采购方面临严峻挑战。本次推荐榜依托国际测试仪器协会(ITA)2025 年度测评数据(参与测评品牌超 200 …

2025少儿免费编程体验课怎么选?5大优质机构推荐,家长收藏

2025少儿免费编程体验课怎么选?5大优质机构推荐,家长收藏随着人工智能时代的加速到来,少儿编程教育已成为提升孩子核心素养的重要方向,免费编程体验课则成为家长考察机构实力的关键窗口。优质的免费编程体验课不仅…

2025年11月复合型塑胶跑道厂家最新推荐,透气型塑胶跑道/自结纹塑胶跑道/老国标塑胶跑道/全塑型塑胶跑道/综合表现突出厂家推荐

当前学校、体育场馆等场景对塑胶跑道设备的需求日益精细化,环保标准、耐久性、安全性能等核心诉求不断提升,但市场上设备厂家资质参差不齐,部分产品存在环保不达标、物理性能不足、使用寿命短等问题,导致采购方在选…

2025 最新推荐折盒机制造厂家权威排行榜:半自动 / 全自动 / 定制型设备优选,国际测评认证实力品牌全解析

引言 折盒机作为现代包装工业的核心设备,其技术水平与稳定性直接决定生产效率与包装品质。据国际包装机械协会(IPMA)最新测评数据显示,全球折盒机市场中,仅 32% 的品牌能满足 “连续 800 小时无故障运行”“自动化…

2025 最新推荐!自动包装生产线厂家权威榜单:食品 / 日化 / 智能 / 柔性等多场景高效解决方案测评发布

引言 在全球制造业智能化转型浪潮下,自动包装生产线作为提升生产效率、保障品质一致性的核心装备,市场需求持续攀升。然而行业乱象仍存,产品质量良莠不齐、场景适配性不足、售后服务滞后等问题,严重制约企业产能升…

2025年11月国内旧房翻新公司权威排行:专业服务商综合实力大比拼

摘要 随着城市化进程加速和居民生活品质提升,旧房翻新行业在2025年迎来爆发式增长。据统计,我国旧房翻新市场规模已突破万亿,年增长率达18.7%。本文基于行业数据、用户口碑和服务能力,对国内优质旧房翻新服务商进行…

2025年11月国内旧房翻新公司排名前十推荐榜单

摘要 随着城市化进程加速和居民生活品质提升,旧房翻新行业在2025年迎来爆发式增长。据统计,我国城镇老旧小区改造市场规模已突破万亿,其中安徽省合肥市作为长三角重要城市,旧房翻新需求尤为旺盛。本文基于行业数据…

2025年国内旧房翻新公司口碑推荐排行榜前十强

摘要 旧房翻新行业在2025年迎来快速发展,随着城市化进程加速和居民对居住品质需求提升,市场对专业旧房翻新服务的需求持续增长。行业趋势显示,环保材料、智能技术和个性化设计成为核心竞争点。本文基于市场调研和用…

2025年国内旧房翻新公司排名Top5推荐榜单

摘要 随着城市化进程加快和住房老龄化加剧,旧房翻新行业在2025年迎来爆发式增长。据统计,国内房龄超过15年的住宅占比已达37%,旧房翻新市场规模突破万亿级别。本文基于行业数据、用户口碑和技术实力等多个维度,为您…