0

0

如何实现点击切换时自动关闭其他展开项的 JavaScript 折叠面板功能

心靈之曲

心靈之曲

发布时间:2026-02-01 16:33:01

|

113人浏览过

|

来源于php中文网

原创

如何实现点击切换时自动关闭其他展开项的 JavaScript 折叠面板功能

本文介绍如何使用原生 javascript 实现单选式折叠面板:点击一个标题时,自动关闭其他已展开的内容区域,仅保留当前项展开,避免多个面板同时打开。

在构建常见 FAQ、手风琴(Accordion)或分段式内容区域时,一个核心交互需求是:每次只允许一个面板处于展开状态。默认的逐个绑定事件监听器方式(如原始代码)仅控制自身开关,无法协调多个面板之间的状态。要实现“点击 A 时关闭 B 和 C,再展开 A”的效果,关键在于统一管理所有可展开元素的状态

以下是优化后的完整实现方案:

Calliper 文档对比神器
Calliper 文档对比神器

文档内容对比神器

下载

✅ 核心思路

  • 点击任一触发元素(如 .secenek-1)时,先查找并移除所有已添加 showing 类的面板;
  • 再对目标面板执行「若未展开则展开,否则收起」的逻辑;
  • 同时修复原始代码中的两个常见疏漏:e.preventDefault() 缺少括号、变量命名冲突(如用 e 同时作为元素变量和事件参数)。

✅ 优化后代码(推荐写法)

<script>
    // 统一获取所有触发按钮与对应面板
    const triggers = [
        { btn: '.secenek-1', panel: '.secenek-1-kismi' },
        { btn: '.secenek-2', panel: '.secenek-2-kismi' },
        { btn: '.secenek-3', panel: '.secenek-3-kismi' }
    ];

    triggers.forEach(item => {
        const btn = document.querySelector(item.btn);
        const panel = document.querySelector(item.panel);

        if (!btn || !panel) return; // 安全检查:防止元素不存在时报错

        btn.addEventListener('click', function(e) {
            e.preventDefault();

            // 1. 关闭所有已展开的面板
            document.querySelectorAll('.showing').forEach(el => {
                el.classList.remove('showing');
            });

            // 2. 切换当前面板:若原本已展开,则收起;否则展开
            if (panel.classList.contains('showing')) {
                panel.classList.remove('showing');
            } else {
                panel.classList.add('showing');
            }
        });
    });
</script>

⚠️ 注意事项

  • CSS 配合不可少:确保 .showing 类具备可见性控制,例如:
    .secenek-1-kismi, .secenek-2-kismi, .secenek-3-kismi {
        display: none;
    }
    .secenek-1-kismi.showing,
    .secenek-2-kismi.showing,
    .secenek-3-kismi.showing {
        display: block; /* 或使用 max-height + transition 实现动画 */
    }
  • 性能考虑:document.querySelectorAll('.showing') 在面板数量极多时可缓存为变量,但常规页面中无需过度优化;
  • 可扩展性:本方案天然支持动态增删面板——只需向 triggers 数组追加配置即可,无需重复写监听器;
  • 无障碍友好:建议为按钮添加 aria-expanded 属性,并同步更新其值(true/false),提升屏幕阅读器体验。

通过上述结构化处理,你将获得一个健壮、可维护且符合用户直觉的折叠面板系统——点击即聚焦,展开即独占,真正实现「所见即所得」的交互一致性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

3

2026.03.18

bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

4

2026.03.18

vscode 格式化
vscode 格式化

本专题整合了vscode格式化相关内容,阅读专题下面的文章了解更多详细内容。

2

2026.03.18

vscode设置中文教程
vscode设置中文教程

本专题整合了vscode设置中文相关内容,阅读专题下面的文章了解更多详细教程。

0

2026.03.18

vscode更新教程合集
vscode更新教程合集

本专题整合了vscode更新相关内容,阅读专题下面的文章了解更多详细教程。

3

2026.03.18

Gemini网页版零基础入门:5分钟上手Gemini聊天指南
Gemini网页版零基础入门:5分钟上手Gemini聊天指南

本专题专为零基础用户打造,5分钟快速掌握Gemini网页版核心用法。从账号登录到界面布局,详解如何发起对话、优化提示词及利用多模态功能。通过实战案例,教你高效获取信息、创作内容与分析数据。无论学习还是工作,轻松开启AI辅助新时代,让Gemini成为你的得力智能助手。

9

2026.03.18

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

8

2026.03.18

Java Spring Security权限控制与认证机制实战
Java Spring Security权限控制与认证机制实战

本专题围绕 Java 后端安全体系建设展开,重点讲解 Spring Security 在权限控制与认证机制中的应用实践。内容涵盖用户认证流程、权限模型设计、JWT 鉴权方案、OAuth2 集成以及接口安全防护策略。通过实际项目案例,帮助开发者构建安全可靠的后端认证体系,提升系统安全性与可扩展能力。

26

2026.03.18

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

176

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.0万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.7万人学习

CSS教程
CSS教程

共754课时 | 44.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号