现代 JavaScript 教程实战:用 class 切换实现点击展开/折叠的滑动菜单
文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载导读本文围绕《现代 JavaScript 教程》中「浏览器事件简介」一章的 05-sliding-menu 练习完整拆解一个点击展开/折叠菜单的实现方案先用独立 DOM 组件与ul/li语义化列表搭建结构再用 CSS 以.open类驱动箭头与列表的显隐最后在 JavaScript 中仅通过一行classList.toggle(open)完成状态切换。读完本文你将掌握「状态交给 CSS、行为交给 JS」的前端组件编写思路并能在 浏览器事件简介 的知识框架下理解onclick、this、classList与addEventListener的实际用法。任务背景一个 importance 5 的实战练习该练习位于仓库目录 2-ui/2-events/01-introduction-browser-events/05-sliding-menu/其 任务说明 标注了importance: 5最高重要度要求创建一个在点击时打开/折叠的菜单。任务同时给出一条关键约束源文档的 HTML/CSS 将被修改仓库中保留了改动前的原始版本 source.view/index.html 与改动后的完整实现 solution.view/index.html。也就是说这份练习真正要训练的是不依赖任何框架、纯用 HTML CSS 原生事件处理把一个静态结构变成一个可交互组件。需要说明的是该练习英文名虽为 sliding menu但其核心交互是「展开/折叠」——即菜单项列表的显示与隐藏实现中并没有位移动画。HTML 结构为什么菜单必须是一个独立 DOM 元素解决方案讲解 首先强调菜单是页面上的一个独立图形组件所以最好把它放入一个单独的 DOM 元素中。这既是组件化的基本思路也让后续的 CSS 选择器与 JS 查找都集中在一个局部范围内不会污染页面其他区域。菜单项列表用语义化的ul/li列出示例结构如下div classmenu span classtitleSweeties (click me)!/span ul liCake/li liDonut/li liHoney/li /ul /div标题为什么用span而不是div这是本方案中最容易被忽略、却最能体现细节功底的一个选择。div有隐式的display: block会占据 100% 的水平宽度如果直接给div挂onclick那么点击标题右侧的大量空白区域也会触发事件div styleborder: solid red 1px onclickalert(1)Sweeties (click me)!/div而span的隐式display是inline它恰好只占据足以容纳全部文本的位置span styleborder: solid red 1px onclickalert(1)Sweeties (click me)!/span因此把可点击的标题做成span可以让「点击即触发」的热区精确地落在标题文字上而不是扩散到整行。这一点在 solution.view/index.html 中被原样保留。CSS 状态设计把「开/关」全部交给样式「切换菜单应更改箭头并显示/隐藏菜单列表」而解决方案的核心理念是所有这些更改都可以通过 CSS 完美处理在 JavaScript 中我们只通过添加/移除.open类来标记菜单的当前状态。默认关闭状态.menu ul { margin: 0; list-style: none; padding-left: 20px; display: none; } .menu .title::before { content: ▶ ; font-size: 80%; color: green; }这里有两处值得展开列表默认display: none菜单项在初始状态下不可见箭头并不是真实字符而是通过伪元素::before的content属性由 CSS 生成的font-size: 80%让它比标题略小color: green赋予颜色。这样做的好处是箭头属于「视觉呈现」理应归样式层管理HTML 中可以保持干净。打开.open状态.menu.open .title::before { content: ▼ ; } .menu.open ul { display: block; }一旦.menu上存在.open类标题前的箭头由▶变为▼展开方向指示列表由display: none变为display: block菜单项出现。对照 solution.view/index.html 可以看到完整实现还额外补充了两条细节标题font-size: 18px让可读性更好cursor: pointer让鼠标悬停在标题上时显示手型光标暗示「此处可点击」——这是交互组件的基本体验要素。JavaScript一行classList.toggle完成交互HTML 与 CSS 就绪后剩下的交互逻辑极其简洁。完整实现中的脚本部分如下见 solution.view/index.htmlscript let menuElem document.getElementById(sweeties); let titleElem menuElem.querySelector(.title); titleElem.onclick function() { menuElem.classList.toggle(open); }; /script逐行解读document.getElementById(sweeties)通过 id 拿到菜单根元素HTML 中写作div idsweeties classmenumenuElem.querySelector(.title)在菜单内部查找标题元素——查找范围被限制在组件内部这正是第一步「独立 DOM 元素」带来的收益titleElem.onclick function() { ... }使用DOM 属性property方式分配click处理程序对应 article.md 中「DOM 属性」一节讲的elem.onclick写法menuElem.classList.toggle(open)在根元素上反复切换.open类——有则移除、无则添加箭头与列表随之被 CSS 自动更新。这正是前面所说的分工JS 不直接操作样式只维护状态类.openCSS 根据类选择器呈现两种形态。状态与表现解耦后交互逻辑只保留了核心的一行。两种等价的可选写法结合 article.md 中「访问元素this」一节的说明在处理程序中this的值就是事件所绑定的元素。因此把函数写成普通函数时也可以利用this向上定位菜单titleElem.onclick function() { this.parentElement.classList.toggle(open); };如果更倾向于 article.md 中「addEventListener」一节的灵活方式同一个事件可挂多个处理程序也可以写成titleElem.addEventListener(click, () { menuElem.classList.toggle(open); });需要提醒的是箭头函数没有自己的this此时必须像解决方案那样通过外部变量menuElem访问菜单元素或者使用事件对象event.currentTarget来定位元素。从 source 到 solution改动点复盘仓库同时保留了练习的初始版本 source.view/index.html。对比两份文件可以直观看到本次练习的全部改动HTML把散落在页面的标题与ul/li列表收拢进div classmenu组件容器并为容器加上idsweeties便于 JS 查找CSS新增.menu系列规则——默认隐藏ul、伪元素生成箭头、.open状态切换箭头与列表显隐外加标题字号与手型光标JavaScript新增 6 行脚本用onclickclassList.toggle(open)驱动整个交互。「源文档的 HTML/CSS 将被修改」这句任务约束落到实际操作中就是指不要在 HTML 里写死展开/折叠的最终状态而是让一份 CSS 同时覆盖两种状态由 JS 动态切换类名来决定当前显示哪一种。总结结构层菜单是独立组件放入单独 DOM 元素标题用spandisplay: inline避免display: block的 100% 宽度扩大点击热区列表用语义化的ul/li表现层默认ul { display: none }且::before生成▶箭头.menu.open时箭头变▼、列表display: block全部由 CSS 驱动行为层JS 只做一件事——classList.toggle(open)通过 DOM 属性 onclick 绑定点击处理程序如需挂多个处理程序可改用addEventListener。这种「CSS 负责状态呈现、JS 负责状态流转」的模式是构建可维护前端组件的基础思路也是后续「事件委托」「自定义事件」等章节反复使用的心智模型。可运行全量代码见 solution.view/index.html。赞分享文档教程前端【免费下载链接】zh.javascript.info现代 JavaScript 教程The Modern JavaScript Tutorial以最新的 ECMAScript 规范为基准通过简单但足够详细的内容为你讲解从基础到高阶的 JavaScript 相关知识。项目地址https://gitcode.com/gh_mirrors/zh/zh.javascript.info点击查看免费下载相关推荐JavaScript 事件委托实战实现可点击折叠的树形菜单Tree menuJavaScript 事件委托实战实现可点击折叠的树形菜单Tree menu 本篇指南基于 Modern JavaScript Tutorialen.j文档/教程前端javascript.info 实战用 onclick 事件与 CSS 状态类实现可折叠滑动菜单javascript.info 实战用 onclick 事件与 CSS 状态类实现可折叠滑动菜单 本文围绕 javascript.info 教程「浏览器事件入文档/教程前端5分钟上手如何用Python SDK控制你的开源桌面机器人5分钟上手如何用Python SDK控制你的开源桌面机器人 想要亲手控制一台智能机器人但觉得硬件门槛太高Reachy Mini为你打开了一扇通往机器人世界机器人人工智能语音计算机视觉智能硬件上一篇数据结构面试指南gh_mirrors/al/algorithms中的位运算问题下一篇Zellij版本迁移工具开发创建自定义迁移创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Micronaut 与 GraalVM 持续回归测试体系:基于 GitLab CI 的跨版本兼容性保障实战

Micronaut 与 GraalVM 持续回归测试体系:基于 GitLab CI 的跨版本兼容性保障实战

后端微服务Web框架 【免费下载链接】micronaut-core Micronaut Application Framework 项目地址: https://gitcode.com/gh_mirrors/mi/micronaut-core 点击查看 免费下载 本文以 Micronaut 框架仓库中的 GRAAL.md 文档为主体,系统讲解 Micronaut 项目如…

2026/10/9 14:30:53 阅读更多 →
Angel 分布式 Word2Vec(Spark On Angel SkipGram 负采样)算法详解与实战指南

Angel 分布式 Word2Vec(Spark On Angel SkipGram 负采样)算法详解与实战指南

人工智能机器学习分布式训练图计算后端 【免费下载链接】angel A Flexible and Powerful Parameter Server for large-scale machine learning 项目地址: https://gitcode.com/gh_mirrors/an/angel 点击查看 免费下载 导读:本文基于 Angel 开源仓库的 S…

2026/10/10 14:27:20 阅读更多 →
X光骨肿瘤语义分割实战:从1600张带病历图像到临床可用像素定位

X光骨肿瘤语义分割实战:从1600张带病历图像到临床可用像素定位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 20:35:51 阅读更多 →

最新新闻

647回文子串与516最长回文子序列:区间DP两种典型玩法全解析

647回文子串与516最长回文子序列:区间DP两种典型玩法全解析

各位打卡代码随想录的伙计们,第四十五天来了。今天这两道题——647 回文子串、516 最长回文子序列——看起来名字只差两个字,实际上一个是把字符串切成一段段判断"是不是回文",另一个是允许跳跃地凑出"最长回文有多长"。…

2026/10/10 21:19:06 阅读更多 →
用幸运大转盘项目掌握Python循环:for、while与range实战

用幸运大转盘项目掌握Python循环:for、while与range实战

1. 项目拆解:为什么用“幸运大转盘”讲循环在Python入门的教学顺序里,循环永远是绕不过去的坎。很多初学者学完变量、条件判断之后,一到for和while就开始晕:for循环里那个range到底怎么数数?while循环什么时候停&#…

2026/10/10 21:19:06 阅读更多 →
mcp-brasil快速上手指南:2分钟接入Claude/Cursor,免费解锁66个巴西公共数据API

mcp-brasil快速上手指南:2分钟接入Claude/Cursor,免费解锁66个巴西公共数据API

【免费下载链接】mcp-brasil MCP Server para 70 APIs pblicas brasileiras 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-brasil 点击查看 免费下载 mcp-brasil 是一个开源的 MCP Server,一个命令即可把 66 个无需密钥的巴西公共数据 API&#xf…

2026/10/10 21:19:06 阅读更多 →
AI 齐套性专家 | 实战案例成果演示

AI 齐套性专家 | 实战案例成果演示

#玄宿科技#AI齐套性交付#案例分享#自主协同软件#GJB438B#Qt开发#交付文档上一期我们演示了 AI 齐套性交付专家的完整生成过程,但所用案例与真实业务贴合度不够。本期我们换了一个完全贴合业务的方向,重新生成了一整套成果:原型图、可交互程序…

2026/10/10 21:19:06 阅读更多 →
OOOSplat 处理流水线全解:FFmpeg、COLMAP 与 Brush 三大引擎如何协同工作

OOOSplat 处理流水线全解:FFmpeg、COLMAP 与 Brush 三大引擎如何协同工作

桌面应用图形学3D渲染计算机视觉 【免费下载链接】ooosplat A local desktop app that turns videos and images into 3D Gaussian Splats in one click. 项目地址: https://gitcode.com/gh_mirrors/oo/ooosplat 点击查看 免费下载 OOOSplat 是一款把视频和图片序列…

2026/10/10 21:19:06 阅读更多 →
零基础 30 分钟出片:用万相 Animate 把角色设定变成可复用的动画素材

零基础 30 分钟出片:用万相 Animate 把角色设定变成可复用的动画素材

零基础 30 分钟出片:用万相 Animate 把角色设定变成可复用的动画素材 【免费下载链接】Wan2.2-Animate-2-14B 项目地址: https://ai.gitcode.com/hf_mirrors/Wan-AI/Wan2.2-Animate-2-14B 做一条角色动画,过去意味着什么?画角色设定、…

2026/10/10 21:18:06 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →