
本教程旨在解决手风琴组件默认多项可同时展开的问题,通过引入事件委托机制,并优化j*ascript逻辑,确保在用户交互时,手风琴组件始终只保持一个面板处于展开状态。文章将详细阐述其实现原理、提供完整的html、css和j*ascript代码示例,并探讨相关最佳实践。
手风琴(Accordion)组件是网页中常见的一种UI模式,用于节省空间并组织内容。用户点击标题时,相关内容区域会展开或收起。然而,默认的实现方式通常允许用户同时展开多个手风琴面板,这在某些场景下可能导致界面混乱或信息过载。本教程将指导您如何修改现有的手风琴组件,使其每次只能展开一个面板,即当一个面板展开时,其他所有已展开的面板会自动收起。
在处理多个相似元素(如手风琴按钮)的事件时,为每个元素单独添加事件监听器可能会导致性能问题,尤其当元素数量较多或动态增减时。事件委托(Event Delegation)是一种更高效的模式,它利用事件冒泡机制,将事件监听器添加到它们的共同父元素上。当子元素上的事件被触发时,事件会冒泡到父元素,父元素上的监听器可以捕获这个事件,并通过 event.target 判断是哪个子元素触发了事件。
使用事件委托的优势:
要实现手风琴的单项展开,核心逻辑在于:当用户点击一个手风琴按钮时,我们需要先将所有当前已展开的面板收起,然后再展开用户点击的那个面板。
具体步骤如下:
手风琴的HTML结构通常包含一个按钮和一个内容区域,它们被包裹在一个父容器中。
LALAL.AI
AI人声去除器和声乐提取工具
196
查看详情
<main>
<div class="accordion_container">
<div id="small">General - AD rate $10 ~ 99% off</div>
<div id="accordion_header">General Inbox</div>
<div class="accordion_body">
<!-- 手风琴项 -->
<div class="accordion_body_item">
<button class="accordion_btn">Inbox one</button>
<div class="accordion_content">
<div class="inner">
<div class="inner_datetime">dd/mm/yyyy</div>
<div class="inner_body">
These cookies allow us or our third party analytics providers to collect information and statistics on use of our services by you and other visitors. These information help us improve our services and products for the benefit of you and others. These
cookies allow us or our third party analytics providers to collect information and statistics on use of our services by you and other visitors. These information help us improve our services and products for the benefit of you and others.
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui sint, deserunt cumque nobis illo ut beatae impedit pariatur aliquid minus!
</div>
</div>
</div>
</div>
<!-- 更多手风琴项... -->
<div class="accordion_body_item">
<button class="accordion_btn">Inbox two</button>
<div class="accordion_content">
<div class="inner">
<div class="inner_datetime">dd/mm/yyyy</div>
<div class="inner_body">
<!-- Content for Inbox two -->
</div>
</div>
</div>
</div>
<!-- ... -->
</div>
<div class="accordion_footer">
<div id="small">Best Regards | Inbox Team</div>
</div>
</div>
</main>CSS样式负责手风琴的外观和展开/收起的动画效果。关键在于使用 max-height: 0 和 overflow: hidden 来隐藏内容,并通过 transition 属性实现平滑过渡。此外,为避免鼠标悬停时边框变化导致内容跳动,可以预先设置透明边框。
@import url('https://fonts.googleapis.com/css?family=Inter');
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/* 滚动条样式 */
main div.accordion_container::-webkit-scrollbar,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar {
width: 4px;
}
main div.accordion_container::-webkit-scrollbar-track,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-track {
background-color: #444444;
}
main div.accordion_container::-webkit-scrollbar-button:vertical:increment,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-button:vertical:increment {
background-color: rgba(108, 92, 231, 0.65);
}
main div.accordion_container::-webkit-scrollbar-button:vertical:increment:hover,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-button:vertical:increment:hover {
background-color: rgba(108, 92, 231, 1.00);
}
main div.accordion_container::-webkit-scrollbar-button:vertical:decrement,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-button:vertical:decrement {
background-color: rgba(108, 92, 231, 0.65);
}
main div.accordion_container::-webkit-scrollbar-button:vertical:decrement:hover,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-button:vertical:decrement:hover {
background-color: rgba(108, 92, 231, 1.00);
}
main div.accordion_container::-webkit-scrollbar-thumb,
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-thumb {
background-color: rgba(108, 92, 231, 0.65);
border-radius: 10px;
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner::-webkit-scrollbar-thumb:hover {
background-color: rgba(108, 92, 231, 1.00);
}
/* 主容器样式 */
main {
background-color: rgba(25, 25, 25, 0.8);
display: grid;
place-items: center;
font-family: 'Inter';
width: 100%;
height: 100vh;
}
main div.accordion_container {
background-color: #efefef;
padding: 10px;
width: 800px;
overflow: auto;
border-radius: 3px;
position: relative;
}
main div.accordion_container #small {
font-size: 12px;
text-align: center;
}
main div.accordion_container #accordion_header {
text-align: center;
font-size: 18px;
margin-top: 20px;
}
main div.accordion_container .accordion_body {
padding: 20px 0 30px;
overflow: auto;
}
main div.accordion_container .accordion_body .accordion_body_item:not(:last-child) {
margin-bottom: 10px;
}
/* 手风琴按钮样式 */
main div.accordion_container .accordion_body .accordion_body_item .accordion_btn {
width: 100%;
background-color: gainsboro;
/* 预设透明边框,防止hover时内容跳动 */
border: none;
border-left: 3px solid transparent;
border-right: 3px solid transparent;
outline: none;
text-align: left;
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
transition: background-color 300ms linear;
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_btn:hover {
background-color: silver;
border-left-color: rgba(19, 2, 153, 1);
color: rgba(19, 2, 153, 1);
border-right-color: rgba(19, 2, 153, 1);
}
/* 箭头图标 */
main div.accordion_container .accordion_body .accordion_body_item .accordion_btn::before {
content: '▼';
float: right;
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_btn.arrowClass::before {
content: '▲';
}
/* 手风琴内容区域样式 */
main div.accordion_container .accordion_body .accordion_body_item .accordion_content {
border-left: 3px solid #777;
border-right: 3px solid #777;
max-height: 0; /* 初始隐藏 */
overflow: hidden;
transition: max-height 450ms ease-in-out; /* 过渡动画 */
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner {
padding: 20px 15px;
font-size: 14px;
background-color: #777;
color: #dfdfdf;
height: 200px; /* 固定高度并允许滚动 */
overflow: auto;
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner .inner_datetime {
text-align: right;
}
main div.accordion_container .accordion_body .accordion_body_item .accordion_content .inner .inner_body {
margin-top: 20px;
text-align: justify;
}以下是实现单项展开的关键J*aScript代码。它使用了事件委托,并在点击事件中遍历所有手风琴按钮,关闭非当前点击的面板。
// 获取所有手风琴按钮的集合
const accordions = document.querySelectorAll('.accordion_btn');
// 将事件监听器绑定到共同的父元素 `main`
document.querySelector('main').addEventListener('click', e => {
// 检查点击事件的目标是否是手风琴按钮
if (e.target.classList.contains('accordion_btn')) {
// 遍历所有手风琴按钮,关闭非当前点击的面板
accordions.forEach(button => {
// 如果当前遍历的按钮不是被点击的按钮
if (button !== e.target) {
// 关闭其内容面板
button.nextElementSibling.style.maxHeight = null;
// 移除其激活状态的CSS类
button.classList.remove('arrowClass');
}
});
// 获取当前点击按钮旁边的内容面板
let content = e.target.nextElementSibling;
// 切换当前点击面板的展开/收起状态
// 如果当前 max-height 等于 scrollHeight (已展开),则设为 null (收起)
// 否则,设为 scrollHeight (展开)
content.style.maxHeight = parseFloat(content.style.maxHeight) === parseFloat(content.scrollHeight) ? null : content.scrollHeight + "px";
// 切换当前按钮的激活状态CSS类
e.target.classList.toggle('arrowClass');
}
});代码解释:
通过采用事件委托模式并精心设计的J*aScript逻辑,我们成功地将手风琴组件从多项展开模式转换为单项展开模式。这种方法不仅提升了用户界面的整洁性,还优化了代码结构和性能。理解事件委托的原理及其在实际项目中的应用,对于前端开发者而言是一项宝贵的技能。结合清晰的HTML结构和响应式的CSS样式,您可以构建出功能强大且用户友好的手风琴组件。
以上就是优化手风琴(Accordion)组件:实现单项展开功能的详细内容,更多请关注其它相关文章!
# 移除
# 网站seo优化网站地图
# 石家庄网站建设美丽中国
# 关键词的排名信息采集
# seo完整教程视频
# 凤城快速网站优化软件
# 周口新站长尾关键词排名
# 苏州电商网站建设现价
# seo的简称
# 行唐网站建设推广
# 关键词排名快排服务
# 这行
# 多项
# 使其
# 多个
# 鼠标
# css
# 绑定
# 将其
# 设为
# 遍历
# 前
# ssl
# 事件冒泡
# access
# cookie
# go
# node
# 前端
# html
# java
# javascript
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
如何在CSS中设置背景图像:一个全面指南
向往的生活小游戏启动处_向往的生活小游戏立即启动
阿里云共享相册入口在哪
《漫蛙manwa2》防走失网页版链接2025
漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口
金牛福袋获取攻略
VS Code的时间线(Timeline)视图:您的代码时光机
如何定制PrimeNG Sidebar的背景颜色
Safari浏览器自动填表功能失效怎么办 Safari表单管理修复
OpenWeatherMap API:通过城市名称获取天气预报数据指南
虫虫漫画排行榜单入口_虫虫漫画编辑推荐入口
win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】
PHP 4 函数中引用参数的默认值限制与解决方案
优酷官网登录入口电脑版 优酷官网网址入口
vivo云服务一直提示空间不足怎么办 怎么办vivo云服务老是提示空间不足
J*aScript装饰器_元编程实战
C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用
快递查询,一键速查
b站怎么查看视频的码率_b站视频码率查看方法
Win10如何彻底关闭OneDrive Win10禁用云同步功能【纯净】
C++如何实现单例模式_C++线程安全的单例模式写法
如何查询个人病历记录
J*a实现任务清单管理_集合框架综合入门练手
优酷下载视频的清晰度怎么选_优酷缓存清晰度设置与选择指南
《微信》视频号原创声明开启方法
263企业邮箱如何设置邮件转发功能
食品生产用水只要符合国家规定的生活饮用水卫生标准就可以吗
QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航
qq音乐官方网站入口_qq音乐在线听歌网页版链接
《植物大战僵尸3》火龙草作用介绍
曝《丝之歌》DLC有望开发!开发商还有神秘新企划
J*aScript与CSS动画:实现平滑顺序淡入淡出效果并解决显示冲突
win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】
PHP中获取HTTP响应状态消息:方法与限制
sublime如何撤销关闭的标签页_sublime重新打开已关闭文件技巧
《tt语音》超级玩家开通方法
邮编号码查询app有哪些_邮编号码查询推荐app及使用体验
苹果自助维修计划支持哪些设备机型
sublime如何处理超大文件不卡顿 _sublime打开大日志文件技巧
拷贝漫画2025网页版入口 拷贝漫画官网免费看全集
猫眼电影app如何筛选支持退改签的影院_猫眼电影退改签影院筛选方法
圆通快递官网入口查询单号 手机版官方查询入口
Win10共享文件夹设置方法 Win10局域网文件共享全攻略【教程】
基于 Flink 和 Kafka 实现高效流处理:连续查询与时间窗口
掌握Go App Engine项目结构与GOPATH:包管理与导入实践
uc浏览器官网网页版使用 uc浏览器官网免费在线首页
铁路12306官网入口 铁路12306中国铁路官网登录首页
苹果如何下载nanobanana
Go Goroutine调度与并发执行深度解析
响应式设计中动态背景颜色条的实现指南
2025-11-10
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。