新闻中心
如何在点击锚点链接后关闭下拉菜单而不刷新页面

本文详细介绍了如何在不刷新页面的情况下,通过j*ascript实现点击内部锚点链接时自动关闭导航下拉菜单并重置汉堡图标状态。教程涵盖了初始的html、css和j*ascript设置,并提供了针对锚点链接的事件监听解决方案,确保用户体验的流畅性。
在现代网页设计中,导航菜单通常采用下拉式或侧滑式,并通过“汉堡”图标进行切换。一个常见的用户体验问题是,当用户打开下拉菜单并点击其中的内部锚点链接(例如,#about-us)跳转到页面特定部分时,下拉菜单并不会自动关闭,汉堡图标也不会恢复到初始状态。这可能导致用户困惑,并影响页面的整体交互流畅性。本教程将指导您如何通过J*aScript解决这一问题,确保点击锚点链接后菜单能够优雅地关闭。
初始设置回顾
为了更好地理解解决方案,我们首先回顾一下典型的汉堡菜单和下拉菜单的HTML结构、CSS样式以及基本的J*aScript交互逻辑。
HTML 结构
一个典型的导航菜单可能包含以下结构:
<div class="n*bar--middle n*bar-hide" id="n*bar--middle">
<div style="height: 50px;"></div>
<div class="n*-contents">
<a class="about" href="#about-us">About us</a>
<!-- 更多导航链接 -->
</div>
</div>
<div class="n*bar--right">
<div class="hamburger" id="hamburger">
<div class="icon1"></div>
<div class="icon2"></div>
<div class="icon3"></div>
</div>
</div>
<!-- 页面内容,包含锚点目标 -->
<p>Lorem Ipsum is simply dummy text...</p>
<h2><a name="about-us"></a>About Us</h2>
<p>Lorem Ipsum is simply dummy text...</p>这里,n*bar--middle 是下拉菜单容器,hamburger 是汉堡图标。n*-contents 内部包含指向页面内部锚点的链接。
CSS 样式
CSS主要负责菜单的显示/隐藏、定位以及汉堡图标的动画效果:
小爱开放平台
小米旗下小爱开放平台
291
查看详情
.n*bar--middle {
display: none; /* 默认隐藏 */
position: fixed;
background: #dedede;
width: 100%;
/* 其他样式 */
z-index: 9999;
}
.hamburger {
/* 汉堡图标样式 */
display: inline-block;
cursor: pointer;
position: fixed;
z-index: 9999;
/* 其他样式 */
}
/* 汉堡图标动画效果 */
.change .icon1 {
transform: rotate(-45deg) translate(-5px, 4px);
}
.change .icon2 {
opacity: 0;
}
.change .icon3 {
transform: rotate(45deg) translate(-6px, -5px);
}关键在于 n*bar--middle 默认 display: none;,并通过J*aScript来切换其显示状态。汉堡图标的 .change 类则控制其变为“关闭”图标的动画。
J*aScript 基础交互
最初的J*aScript代码通常只处理汉堡图标的点击事件,用于切换菜单的显示和汉堡图标的动画:
var hamburger = document.getElementById('hamburger');
var menu = document.getElementById('n*bar--middle');
// 初始设置菜单为隐藏(如果CSS未设置)
// menu.style.display = "none";
hamburger.addEventListener('click', function() {
this.classList.toggle("change"); // 切换汉堡图标动画
if (menu.style.display === "none") {
menu.style.display = "block"; // 显示菜单
} else {
menu.style.display = "none"; // 隐藏菜单
}
});这段代码能够实现点击汉堡图标时菜单的打开和关闭,以及汉堡图标的相应动画。然而,它并未考虑点击菜单内部的锚点链接时的行为。
解决方案:监听锚点链接点击事件
要解决上述问题,我们需要为下拉菜单内的所有锚点链接添加一个额外的事件监听器。当这些链接被点击时,除了执行默认的页面跳转行为外,我们还需要手动关闭菜单并重置汉堡图标。
核心J*aScript代码
// 获取汉堡图标和菜单元素
var hamburger = document.getElementById('hamburger');
var menu = document.getElementById('n*bar--middle');
// 1. 汉堡图标点击事件:切换菜单显示/隐藏和汉堡图标动画
hamburger.addEventListener('click', function() {
this.classList.toggle("change"); // 切换汉堡图标动画
if (menu.style.display === "none") {
menu.style.display = "block"; // 显示菜单
} else {
menu.style.display = "none"; // 隐藏菜单
}
});
// 2. 锚点链接点击事件:关闭菜单并重置汉堡图标
var anchors = document.querySelectorAll('.n*-contents > a'); // 获取所有导航锚点链接
anchors.forEach(item => {
item.addEventListener('click', () => {
menu.style.display = "none"; // 隐藏菜单
hamburger.classList.remove("change"); // 移除汉堡图标的"change"类,恢复其初始状态
});
});代码解析
-
var anchors = document.querySelectorAll('.n*-contents > a');
- 这行代码使用 document.querySelectorAll() 方法选择所有在 .n*-contents 类下的直接子元素 标签。这确保我们只针对导航菜单中的链接进行操作,而不是页面上所有的锚点链接。
-
anchors.forEach(item => { ... });
- querySelectorAll 返回的是一个 NodeList,它是一个类似数组的对象。我们使用 forEach 方法遍历这个 NodeList 中的每一个锚点链接元素。
-
item.addEventListener('click', () => { ... });
- 为每个锚点链接添加一个 click 事件监听器。当用户点击其中任何一个链接时,回调函数将被执行。
-
menu.style.display = "none";
- 在回调函数内部,我们首先将 menu 元素的 display 样式设置为 "none",从而隐藏下拉菜单。
-
hamburger.classList.remove("change");
- 接着,我们从 hamburger 元素中移除 change 类。这个类通常用于触发汉堡图标的动画,使其变为“X”形。移除它将使汉堡图标恢复到三条杠的初始状态,表示菜单已关闭。这里使用 remove 而不是 toggle 是为了确保无论汉堡图标当前是什么状态,都强制它回到关闭状态。
完整示例代码
为了方便理解,以下是整合了HTML、CSS和J*aScript的完整示例。
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dropdown Menu with Anchor Link Close</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="main-n*">
<div class="n*bar--middle" id="n*bar--middle">
<div style="height: 50px;"></div>
<div class="n*-contents">
<a class="about" href="#about-us">关于我们</a>
<a class="services" href="#services">服务</a>
<a class="contact" href="#contact">联系我们</a>
</div>
</div>
<div class="n*bar--right">
<div class="hamburger" id="hamburger">
<div class="icon1"></div>
<div class="icon2"></div>
<div class="icon3"></div>
</div>
</div>
</div>
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</p>
<h2><a name="about-us"></a>关于我们</h2>
<p>
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
</p>
<h2><a name="services"></a>服务</h2>
<p>
This is the services section. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
</p>
<h2><a name="contact"></a>联系我们</h2>
<p>
Contact us here. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.
</p>
<script src="script.js"></script>
</body>
</html>style.css
body {
font-family: Arial, sans-serif;
margin: 0;
padding-top: 80px; /* 留出顶部导航空间 */
}
.main-n* {
display: flex;
flex-direction: row;
width: 100%;
margin: 0 auto;
position: fixed;
top: 0;
left: 0;
z-index: 10000; /* 确保导航在最上层 */
background: white;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.main-n* .n*-contents {
font-size: 20px; /* 调整字体大小 */
padding: 20px 0;
}
.n*-contents a {
display: block;
padding: 10px 55px;
text-decoration: none;
color: #333;
transition: background-color 0.3s ease;
}
.n*-contents a:hover {
background-color: #f0f0f0;
}
.n*bar--middle {
display: none; /* 默认隐藏 */
position: fixed;
background: #dedede;
width: 100%;
padding: 20px 10px 20px 0px; /* 调整内边距 */
height: 100%; /* 全屏高度 */
top: 0;
left: 0;
z-index: 9999;
overflow-y: auto; /* 允许内容滚动 */
}
.hamburger {
display: inline-block;
cursor: pointer;
position: absolute; /* 相对于 .main-n* 定位 */
z-index: 9999;
background: white;
padding: 10px;
margin: 0;
right: 20px; /* 调整右侧定位 */
top: 10px; /* 调整顶部定位 */
border-radius: 50%;
border: 4px solid green;
}
.icon1, .icon2, .icon3 {
width: 25px;
height: 3px;
background-color: orange;
margin: 4px 0;
border-radius: 5px;
transition: 0.4s;
}
/* Rotate first bar */
.change .icon1 {
-webkit-transform: rotate(-45deg) translate(-5px, 4px);
transform: rotate(-45deg) translate(-5px, 4px);
}
/* Fade out the second bar */
.change .icon2 {
opacity: 0;
}
/* Rotate last bar */
.change .icon3 {
-webkit-transform: rotate(45deg) translate(-6px, -5px);
transform: rotate(45deg) translate(-6px, -5px);
}
/* 响应式调整 */
@media (min-width: 768px) {
.hamburger, .n*bar--middle {
display: none !important; /* 在大屏幕上隐藏汉堡和下拉菜单 */
}
.main-n* .n*-contents {
display: flex; /* 在大屏幕上显示为水平导航 */
width: auto;
padding: 0;
margin-left: auto; /* 将导航推到右侧 */
}
.n*-contents a {
display: inline-block;
padding: 20px 15px;
}
}script.js
document.addEventListener('DOMContentLoaded', function() {
var hamburger = document.getElementById('hamburger');
var menu = document.getElementById('n*bar--middle');
// 1. 汉堡图标点击事件:切换菜单显示/隐藏和汉堡图标动画
if (hamburger && menu) { // 确保元素存在
hamburger.addEventListener('click', function() {
this.classList.toggle("change"); // 切换汉堡图标动画
if (menu.style.display === "none" || menu.style.display === "") {
menu.style.display = "block"; // 显示菜单
} else {
menu.style.display = "none"; // 隐藏菜单
}
});
}
// 2. 锚点链接点击事件:关闭菜单并重置汉堡图标
var anchors = document.querySelectorAll('.n*-contents > a'); // 获取所有导航锚点链接
anchors.forEach(item => {
item.addEventListener('click', () => {
if (menu.style.display === "block") { // 仅当菜单打开时才执行关闭操作
menu.style.display = "none"; // 隐藏菜单
if (hamburger) { // 确保汉堡图标存在
hamburger.classList.remove("change"); // 移除汉堡图标的"change"类,恢复其初始状态
}
}
});
});
});注意事项与总结
- DOM内容加载: 确保您的J*aScript代码在DOM完全加载后执行。将脚本放在
以上就是如何在点击锚点链接后关闭下拉菜单而不刷新页面的详细内容,更多请关注其它相关文章!
# 而不
# 农商银行的营销推广
# 库存网站建设哪家好
# 扬中网站优化公司有哪些
# 龙眼营销推广方案
# 网站建设服h
# 四会少儿教育网站推广
# 菏泽推广营销方法
# 太原网站建设海报文案
# 无棣网站建设联系方式
# 宁波高新区网站建设定制
# 流畅性
# 关于我们
# 单选框
# 如何在
# css
# 移除
# 表单
# 小爱
# 回调
# 网页设计
# ai
# ssl
# 回调函数
# access
# node
# js
# html
# java
# javascript
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
c++中的std::launder有什么实际用途_c++对象生命周期与指针优化
深入理解J*aScript中的B样条曲线与节点向量生成
必由学官网快捷入口 必由学网页版在线学习平台
UE5.7引擎表现爆炸优化无敌!5090跑4K稳定60FPS
126邮箱账号注册 电脑版登录入口
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
正确连接J*aScript到HTML实现可点击图片与自定义事件处理
Golang如何使用new_Go new分配内存机制讲解
星露谷物语官网入口 星露谷物语游戏官网入口
PySpark中从现有列右侧提取可变长度字符创建新列的教程
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
大麦的“候补”是什么意思 大麦候补购票规则【详解】
《主播少女的秘密账号迷宫》首支宣传片
VS Code远程开发时如何处理文件权限问题
MAC的“快捷指令”怎么同步到iPhone_MAC利用iCloud同步所有设备的自动化指令
PHP中获取MongoDB服务器运行时间(Uptime)的专业指南
Lar*el DB::listen 事件中的查询执行时间单位解析
蛙漫画网页版全站入口 蛙漫热门作品免费浏览
sublime怎么设置启动时打开的窗口_sublime会话管理与热退出
Composer的 archive 命令怎么用_快速打包你的PHP项目及其Composer依赖
护手霜蹭到袖口上了如何清洗? 怎样避免留下一圈油印?
Lar*el递归关系中排除子孙节点的策略
CSS如何设置hover状态颜色_hover伪类调整背景或文字颜色
《铁拳8》黑皮辣妹新实机:元气满满的18岁少女!
极速漫画官方主页网址 极速漫画漫画在线浏览官网链接
QQ邮箱电脑版登录入口_QQ邮箱官方网站登录平台
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
痛风发作了怎么办? 快速止痛和后期饮食调理
一加 14R 快充无反应_一加 14R 充电优化
BetterDiscord插件中安全更新用户简介的实践指南
极兔快递快件信息查询系统 极兔快递官网运单号追踪
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
Go RPC HTTP服务正确实现与常见陷阱解析
Python中如何避免重复条件判断:利用数据结构实现动态逻辑
俄罗斯Yandex免登录入口_Yandex搜索引擎官网一键直达
最新韩小圈网页版登录入口_官网在线观看官方链接
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
深入理解J*aScript Promise异步执行与微任务队列
优化Log4j2控制台输出性能:解决异步日志瓶颈
C++如何比较两个字符串_C++ string compare函数与操作符对比
AO3最新官网入口公告_2025AO3镜像站实时查询方法
Win10双系统截图高效法 截屏快捷键速记【技巧】
12306几点到几点不能订票? | 官方最新系统维护时间全解析
Archive of Our Own官网直达 AO3最新可用地址一览
2026春节假期票务安排_2026春节放假购票指南
J*aScript 字符串标签转换:使用正则表达式高效替换
利用5118提升短视频内容效果_5118短视频关键词优化方法
J*aScript实现动态背景色下的文本与按钮颜色自适应调整


2025-10-26
浏览次数:次
返回列表
anchors.forEach(item => {
item.addEventListener('click', () => {
if (menu.style.display === "block") { // 仅当菜单打开时才执行关闭操作
menu.style.display = "none"; // 隐藏菜单
if (hamburger) { // 确保汉堡图标存在
hamburger.classList.remove("change"); // 移除汉堡图标的"change"类,恢复其初始状态
}
}
});
});
});