Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
阻止纯JavaScript手风琴组件首次加载时自动展开的教程_创想鸟

阻止纯JavaScript手风琴组件首次加载时自动展开的教程

阻止纯JavaScript手风琴组件首次加载时自动展开的教程

本教程旨在解决纯JavaScript手风琴(Accordion)组件在页面加载时自动展开第一个项目的问题。通过分析常见错误代码,我们将明确指出导致自动展开的JavaScript逻辑,并提供正确的解决方案,确保手风琴在初始状态下保持全部折叠,从而优化用户体验。

1. 问题描述

在使用纯javascriptcss构建手风琴(accordion)组件时,一个常见的困扰是页面加载完成后,第一个手风琴项目会自动展开,而不是保持初始的折叠状态。尽管开发者可能尝试通过css或javascript移除“active”类来解决,但问题依然存在,这通常意味着存在一个隐蔽的触发机制。

2. 问题根源分析

通过审查提供的JavaScript代码,我们可以发现导致手风琴自动展开的直接原因。以下是原始代码中的关键部分:

// ... 其他手风琴逻辑 ...window.onload = function() {  header[0].click(); // 这一行是罪魁祸首!}

这行代码 header[0].click(); 是在 window.onload 事件中执行的。window.onload 事件会在页面上的所有内容(包括图片、脚本、样式表等)都加载完毕后触发。在此事件中,header[0].click() 会程序化地模拟用户点击第一个手风琴头部元素。由于手风琴的JavaScript逻辑监听了点击事件并处理展开/折叠,这个模拟点击自然会导致第一个手风琴项目在页面加载完毕后立即展开。

3. 解决方案

解决此问题的核心在于移除导致程序化点击的JavaScript代码。手风琴的初始折叠状态应完全由CSS控制,而其展开/折叠行为则由用户交互触发。

3.1 移除不必要的初始化代码

直接删除或注释掉 window.onload 事件中触发第一个手风琴点击的代码即可:

立即学习“Java免费学习笔记(深入)”;

// window.onload = function() {//   header[0].click(); // 移除或注释掉此行代码// }

通过移除这部分代码,页面加载时将不再有任何指令强制第一个手风琴展开,它将遵循CSS定义的初始折叠状态。

3.2 优化手风琴JavaScript逻辑(可选但推荐)

在原有的手风琴JavaScript逻辑中,存在一些可以优化的地方,以使其在处理单项展开时更加健壮和清晰。以下是改进后的JavaScript代码,它假设手风琴的设计目标是“一次只能展开一个项目”:

// 获取所有手风琴头部元素let headers = document.querySelectorAll(".accordion-header");// 获取所有手风琴容器元素let accordions = document.querySelectorAll(".accordion");// 为每个手风琴头部添加点击事件监听器headers.forEach(header => {  header.addEventListener("click", function() {    let parentElm = this.parentElement; // 获取当前点击手风琴的父容器 (.accordion)    let siblingsBody = this.nextElementSibling; // 获取当前手风琴的内容体 (.accordion-body)    // 遍历所有手风琴,关闭除当前点击手风琴之外的所有已展开项    accordions.forEach(accordion => {      // 如果当前遍历到的手风琴不是被点击的,并且它处于展开状态      if (accordion !== parentElm && accordion.classList.contains("active")) {        accordion.classList.remove("active"); // 移除 'active' 类        // 确保其内容体折叠        // 假设 .accordion-body 是 .accordion 容器的第二个子元素 (索引1)        if (accordion.children.length > 1) {            accordion.children[1].style.maxHeight = null;        }      }    });    // 切换当前点击手风琴的 'active' 类    parentElm.classList.toggle("active");    // 根据 'active' 状态设置内容体的高度    if (parentElm.classList.contains("active")) {      // 如果当前手风琴被激活(展开),则设置其内容体高度为实际滚动高度      siblingsBody.style.maxHeight = siblingsBody.scrollHeight + "px";    } else {      // 如果当前手风琴被取消激活(折叠),则将内容体高度设为null(即0)      siblingsBody.style.maxHeight = null;    }  });});// **重要提示:移除以下代码,它是导致自动展开的根源**// window.onload = function() {//   headers[0].click();// }

4. 完整的示例代码

为了提供一个清晰、可工作的示例,以下是HTML结构、CSS样式和修正后的JavaScript代码。

4.1 HTML 结构

手风琴标题 1

这是手风琴项目1的内容。它会在页面加载时默认折叠。

手风琴标题 2

这是手风琴项目2的内容。它也会在页面加载时默认折叠。

可以包含多段内容。

手风琴标题 3

这是手风琴项目3的内容。

4.2 CSS 样式

.accordion-container {  padding: 0 100px;  max-width: 800px; /* 限制容器宽度以更好地展示 */  margin: 20px auto; /* 居中显示 */  border: 1px solid #eee;  box-shadow: 0 2px 5px rgba(0,0,0,0.1);}.accordion {  border-bottom: 1px solid #eee; /* 分隔线 */}.accordion:last-child {  border-bottom: none; /* 最后一个手风琴没有底部边框 */}.accordion .accordion-header {  padding: 15px 20px;  cursor: pointer;  position: relative;  background-color: #f9f9f9;  transition: background-color 0.3s ease;}.accordion .accordion-header:hover {  background-color: #f0f0f0;}.accordion .accordion-header h2 {  margin: 0;  font-size: 20px; /* 调整字体大小 */  font-weight: 500; /* 调整字体粗细 */  line-height: 1.5;  color: #333;}/* 可以在此处添加一个指示符,例如箭头 */.accordion .accordion-header::after {  content: '+'; /* 默认显示加号 */  position: absolute;  right: 20px;  top: 50%;  transform: translateY(-50%);  font-size: 24px;  transition: transform 0.3s ease;}/* 当手风琴激活时,改变指示符 */.accordion.active .accordion-header::after {  content: '-'; /* 激活时显示减号 */  transform: translateY(-50%) rotate(0deg); /* 保持不变或旋转 */}.accordion .accordion-body {  max-height: 0; /* 初始状态折叠 */  overflow: hidden;  transition: max-height ease 0.5s, padding 0.5s ease; /* 添加padding过渡 */  padding: 0 20px; /* 初始padding为0 */  background-color: #fff;}/* 当手风琴激活时,显示内容体并添加底部padding */.accordion.active .accordion-body {  padding-bottom: 20px; /* 展开时添加底部padding */}.accordion .accordion-body p {  font-weight: 400;  line-height: 1.6;  color: #555;  margin-top: 10px; /* 确保段落之间有间距 */}.accordion .accordion-body p:first-child {  margin-top: 0; /* 第一个段落没有顶部间距 */}

4.3 修正后的 JavaScript

将上述“优化手风琴JavaScript逻辑”部分的代码粘贴到您的 标签中。

// ============== toggle accordion =================//// 获取所有手风琴头部元素let headers = document.querySelectorAll(".accordion-header");// 获取所有手风琴容器元素let accordions = document.querySelectorAll(".accordion");// 为每个手风琴头部添加点击事件监听器headers.forEach(header => {  header.addEventListener("click", function() {    let parentElm = this.parentElement; // 获取当前点击手风琴的父容器 (.accordion)    let siblingsBody = this.nextElementSibling; // 获取当前手风琴的内容体 (.accordion-body)    // 遍历所有手风琴,关闭除当前点击手风琴之外的所有已展开项    accordions.forEach(accordion => {      // 如果当前遍历到的手风琴不是被点击的,并且它处于展开状态      if (accordion !== parentElm && accordion.classList.contains("active")) {        accordion.classList.remove("active"); // 移除 'active' 类        // 确保其内容体折叠        // 假设 .accordion-body 是 .accordion 容器的第二个子元素 (索引1)        if (accordion.children.length > 1) {            accordion.children[1].style.maxHeight = null;        }      }    });    // 切换当前点击手风琴的 'active' 类    parentElm.classList.toggle("active");    // 根据 'active' 状态设置内容体的高度    if (parentElm.classList.contains("active")) {      // 如果当前手风琴被激活(展开),则设置其内容体高度为实际滚动高度      siblingsBody.style.maxHeight = siblingsBody.scrollHeight + "px";    } else {      // 如果当前手风琴被取消激活(折叠),则将内容体高度设为null(即0)      siblingsBody.style.maxHeight = null;    }  });});

5. 注意事项

初始状态由CSS控制: 确保 .accordion-body 的初始 max-height 为 0 并且 overflow 为 hidden。这是手风琴在页面加载时保持折叠的关键。避免程序化触发: 在 window.onload 或 DOMContentLoaded 事件中,除非有明确需求,否则应避免使用 element.click() 等方法来模拟用户交互,这可能导致意外的行为。清晰的JavaScript逻辑: 如果您的手风琴设计为“一次只能展开一个”,请确保在展开当前项之前,显式地关闭所有其他已展开项。上述优化后的JS代码已经包含了这种逻辑。可访问性: 对于生产环境的手风琴组件,还应考虑添加WAI-ARIA属性(如 aria-expanded 和 aria-controls)以增强可访问性。

6. 总结

手风琴在页面加载时自动展开第一个项目的问题,通常是由于在初始化阶段(如 window.onload 事件中)错误地包含了模拟用户点击的代码所致。通过识别并移除这行代码,并确保CSS正确设置了初始折叠状态,即可轻松解决此问题。同时,优化JavaScript逻辑可以使手风琴的行为更加稳定和符合预期。在开发前端组件时,务必仔细审查初始化逻辑,避免不必要的程序化事件触发,以提供流畅的用户体验。

以上就是阻止纯JavaScript手风琴组件首次加载时自动展开的教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1526968.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
深入理解 Promise.all() 的行为与应用
上一篇 2025年12月20日 19:00:13
解决 Bootstrap 4.4 导航栏折叠图标不显示但功能正常的问题
下一篇 2025年12月20日 19:00:33

相关推荐

  • 高德地图离线地图怎么更新_高德地图离线数据更新步骤

    高德地图车机版离线地图更新方法包括:一、通过Wi-Fi在线更新,进入“离线数据”页面检测并下载新版地图;二、使用U盘导入,从官网下载解压后复制amapauto文件夹至U盘根目录,插入车机并选择更新;三、开启Wi-Fi自动更新功能,在设置中启用“Wi-Fi下自动更新离线数据”及“离线图面增量更新”,实…

    2026年9月23日
    000
  • Java中ConnectException连接异常的解决方法

    答案:Java中ConnectException通常因服务未启动、网络不通或配置错误导致,需检查服务状态、IP端口配置及防火墙设置,并合理设置连接超时与重试机制。 Java中出现ConnectException通常表示应用程序尝试连接到远程服务器时失败,最常见的原因是目标主机拒绝连接或网络不通。这个…

    2026年9月23日
    200
  • windows8系统怎么关闭屏幕键盘_windows8关闭虚拟键盘的设置

    1、通过任务栏图标关闭:在系统托盘找到键盘图标并点击关闭;2、控制面板禁用启动项:进入轻松访问设置,取消勾选“使用屏幕键盘”;3、任务管理器结束进程:强制结束osk.exe进程;4、删除启动文件夹中的快捷方式,防止开机自启。 如果您在使用Windows 8系统时发现屏幕键盘自动弹出或需要手动关闭,可…

    2026年9月23日
    100
  • FreeBSD 15.0 Beta 1 发布,优化系统性能和用户体验

    FreeBSD 15.0 Beta 1 现已推出,本次版本带来了多项重要更新,显著提升了系统运行效率、硬件适配能力以及整体使用体验。 主要更新内容 OpenZFS 升级至 2.4.0-rc2:带来更稳定的文件系统表现与性能提升,同时引入更先进的存储管理功能。 TCP LRO 性能优化:修复了特定网络…

    2026年9月23日
    100
  • PHP高效读取大型GZ文件:揭示Gzip的顺序访问限制与实践方法

    本教程深入探讨了php中处理大型gz压缩文件的核心挑战:其固有的顺序访问特性。我们将解释为何无法对gz文件进行随机跳转读取,以及这意味着您必须从头开始按序解压数据。文章将提供一种实用的分块读取策略,并附带php示例代码,帮助开发者高效、安全地处理超大gz文件,同时讨论潜在的跨块数据处理问题及内存管理…

    2026年9月23日
    200
  • 如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧如何在RayTune中训练AI大模型?分布式超参数优化的技巧

    RayTune通过分布式超参数优化解决大模型训练中的资源调度、搜索效率、实验管理与容错难题,其核心是利用并行化和智能调度(如ASHA、PBT)加速最优配置探索。首先,将训练逻辑封装为可调用函数,并在其中集成分布式训练(如PyTorch DDP);其次,定义超参数搜索空间与资源需求(如每试验2 GPU…

    2026年9月23日 用户投稿
    100
  • mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法mysql怎么执行子查询 mysql输入嵌套sql语句方法

    mysql子查询常见类型包括标量子查询、行子查询和表子查询,分别返回一行一列、一行多列和多行多列数据;应用场景涵盖where作为过滤条件、from作为派生表、select作为标量列以及dml操作的数据提供。此外,根据与外部查询的关联性分为非关联子查询和关联子查询,前者独立执行一次,后者依赖外部查询每…

    2026年9月23日 用户投稿
    100
  • 硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新硬刚 Sora 2,谷歌的 Veo 3.1 确实有小惊喜|AI 上新

    谷歌最新视频生成模型 veo 3.1 来了!今日上手可用。 北京时间 10 月 16 日,谷歌在 Gemini API 中发布了 Veo 3.1 和 Veo 3.1 Fast 付费预览版。模型一上线,就受到了行业的高度关注。毕竟,和前不久发布的 Sora 2 一样,这次 Veo 3.1 也新增了音频…

    2026年9月23日 用户投稿
    200
  • Java Optional与集合结合使用方法

    Optional与集合结合可避免空指针异常。1. 用Optional.ofNullable包装可能为null的集合元素;2. Stream中filter后接findFirst返回Optional,安全查找;3. 对象属性为Optional时,通过flatMap展开提取值;4. 方法返回Optiona…

    2026年9月23日
    200
  • vivo X300 Pro首发定制2亿灭霸长焦 韩伯啸:长焦新王

    9月2日,vivo产品经理韩伯啸再次为即将发布的vivo x300系列预热,此次聚焦于旗舰机型vivo x300 pro的影像能力。 韩伯啸指出,X300 Pro搭载了独家深度定制的2亿HPB“灭霸”长焦镜头,标志着vivo在长焦技术上的又一次飞跃。这颗镜头是蓝厂真正意义上的第四代两亿像素长焦系统,…

    2026年9月23日
    000
  • win11任务栏图标合并了怎么取消_win11任务栏图标合并设置方法

    首先通过系统设置将“合并任务栏按钮”设为从不,若无效则用注册表编辑器新建TaskbarGlomLevel并赋值2,或使用StartAllBack等工具自定义,同时排查第三方软件干扰。 如果您发现Win11任务栏上的程序图标被自动合并,导致无法清晰查看每个应用的独立窗口,可以通过系统设置或高级方法进行…

    2026年9月22日
    100
  • Java ListIterator如何实现双向遍历

    Java中的ListIterator接口支持双向遍历,即可以从前往后,也可以从后往前遍历列表。这与普通的Iterator只能单向向后遍历不同。ListIterator提供了更灵活的操作方式,特别适用于需要反向访问或在遍历过程中修改列表的场景。 1. ListIterator的基本特性 ListIte…

    2026年9月22日
    100
  • mysql如何分析索引使用 mysql创建索引后的执行计划解读

    mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读mysql如何分析索引使用 mysql创建索引后的执行计划解读

    要分析mysql索引使用和执行计划,核心是通过explain命令查看查询路径,并结合handler_read%状态变量评估索引效率。1. 使用explain命令分析执行计划,关注type、key、extra等列,判断是否高效利用索引;2. 通过show global status like &#82…

    2026年9月22日 用户投稿
    100
  • 解决TCPDF保存文件权限问题的完整指南

    本文旨在解决使用tcpdf在%ignore_a_1%中生成pdf并保存到服务器(’f’模式)时遇到的“permission denied”错误,尤其是在macos环境下。核心问题通常源于不正确的服务器文件路径或目标文件夹缺乏写入权限。教程将详细阐述如何构建正确的绝对文件路径,…

    2026年9月22日
    200
  • mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择mysql怎么添加前缀索引 mysql创建前缀索引的长度选择

    在mysql中,为长字符串列添加前缀索引的核心目的是优化查询性能并节省存储空间。1. 前缀索引通过仅索引列值的前n个字符实现这一目标;2. 前缀长度的选择需在区分度与存储效率之间取得平衡,理想长度应确保高区分度(如90%以上)且不过度冗余;3. 可通过执行select count(distinct …

    2026年9月22日 用户投稿
    100
  • 《植物大战僵尸:重植版》制作人:价格亲民 未使用AI!

    经典塔防游戏《植物大战僵尸》在问世16年后迎来重磅回归。由PopCap Games精心打造的重制作品——《植物大战僵尸:重植版》将于10月23日正式登陆PlayStation、Xbox、Nintendo Switch以及PC平台。 据The Gamer报道,该游戏执行制作人Jake Neri在采访中…

    2026年9月22日
    200
  • VSCode运行多文件C项目 完整VSCode配置C++开发教程

    要解决#%#$#%@%@%$#%$#%#%#$%@_e2fc++805085e25c9761616c00e065bfe8运行多文件c项目的问题,核心是正确配置tasks.json、launch.json和settings.json文件以定义编译、调试和项目路径。首先安装c/c++扩展插件和可选的编译…

    2026年9月22日
    000
  • Java集合框架在实际项目中的最佳实践

    合理选择集合类型并预设容量,使用不可变集合保护数据,避免遍历中修改结构,可提升Java程序性能与安全性。 Java集合框架是开发中使用最频繁的工具之一,合理使用能显著提升代码的可读性、性能和稳定性。在实际项目中,遵循一些最佳实践可以避免常见陷阱,提高程序健壮性。 选择合适的集合类型 不同场景应选用最…

    2026年9月22日
    100
  • 全球首发天玑9500!vivo X300发布:4399元起

    全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起全球首发天玑9500!vivo X300发布:4399元起

    10月13日,vivo正式推出了全新旗舰手机——vivo x300,引发广泛关注。 价格方面,该机提供多个配置版本:12GB+256GB售价为4399元,16GB+256GB定价4699元,12GB+512GB为4999元,16GB+512GB则为5299元,顶配的16GB+1TB版本售价5799元…

    2026年9月22日 用户投稿
    000
  • Canva的AI混合工具如何操作?快速设计专业图形与文本的步骤

    Canva的AI混合功能通过Magic Studio将文本、图像生成与智能设计整合,提升创作效率。首先,使用Magic Write生成文案初稿,克服空白页难题;其次,通过Magic Media输入详细描述生成定制化图像,越具体效果越好;再利用Magic Design上传图片或输入文字自动生成多种设计…

    2026年9月22日
    000

发表回复

登录后才能评论
关注微信