You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JS实现点击链接关闭响应式汉堡菜单?

解决汉堡菜单点击链接后自动关闭的问题

你的汉堡菜单是通过checkbox的:checked伪类控制显示/隐藏的,要实现点击链接后关闭菜单,核心就是取消checkbox的选中状态,触发CSS定义的关闭样式。

实现方案

添加一段简单的JavaScript代码,给所有导航链接绑定点击事件,点击时取消checkbox的选中状态:

// 获取所有导航链接和checkbox元素
const navLinks = document.querySelectorAll('.nav-container ul li a');
const navCheckbox = document.getElementById('nav');

// 给每个链接添加点击事件监听
navLinks.forEach(link => {
  link.addEventListener('click', () => {
    // 取消checkbox选中,触发菜单关闭
    navCheckbox.checked = false;
  });
});

完整整合代码

把上述JS代码放在HTML的</body>之前即可,完整代码如下:

<style>
body {
font-family: 'Helvetica Neue', sans-serif;
font-weight: 400;
}
* {
box-sizing: border-box;
}
nav {
padding: 30px;
}
nav ul {
float: right;
}
nav ul li {
display: inline-block;
float: left;
}
nav ul li:not(:first-child) {
margin-left: 25px;
}
nav ul li a {
display: inline-block;
outline: none;
color: white;
font-size: 16px;
text-decoration: none;
letter-spacing: 0.04em;
}
nav ul li a:hover {
color: #808080;
text-decoration: none;
}
@media screen and (max-width: 560px) {
.nav-container {
position: fixed;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: -1;
background: #1f2227;
opacity: 0;
transition: all 0.2s ease;
}
.nav-container ul {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 100%;
}
.nav-container ul li {
display: block;
float: none;
width: 100%;
text-align: right;
margin-bottom: 10px;
}
.nav-container ul li:nth-child(1) a {
transition-delay: 0.2s;
}
.nav-container ul li:nth-child(2) a {
transition-delay: 0.3s;
}
.nav-container ul li:nth-child(3) a {
transition-delay: 0.4s;
}
.nav-container ul li:nth-child(4) a {
transition-delay: 0.5s;
}
.nav-container ul li:not(:first-child) {
margin-left: 0;
}
.nav-container ul li a {
padding: 10px 25px;
opacity: 0;
color: #fff;
font-size: 24px;
font-weight: 600;
transform: translateY(-20px);
transition: all 0.2s ease;
}
.nav-open {
position: fixed;
right: 10px;
top: 10px;
display: block;
width: 48px;
height: 48px;
cursor: pointer;
z-index: 9999;
border-radius: 50%;
}
.nav-open i {
display: block;
width: 20px;
height: 2px;
background: #1f2227;
border-radius: 2px;
margin-left: 14px;
}
.nav-open i:nth-child(1) {
margin-top: 16px;
}
.nav-open i:nth-child(2) {
margin-top: 4px;
opacity: 1;
}
.nav-open i:nth-child(3) {
margin-top: 4px;
}
}
#nav:checked + .nav-open {
transform: rotate(45deg);
}
#nav:checked + .nav-open i {
background: #fff;
transition: transform 0.2s ease;
}
#nav:checked + .nav-open i:nth-child(1) {
transform: translateY(6px) rotate(180deg);
}
#nav:checked + .nav-open i:nth-child(2) {
opacity: 0;
}
#nav:checked + .nav-open i:nth-child(3) {
transform: translateY(-6px) rotate(90deg);
}
#nav:checked ~ .nav-container {
z-index: 9990;
opacity: 1;
}
#nav:checked ~ .nav-container ul li a {
opacity: 1;
transform: translateY(0);
}
.hidden {
display: none;
}

.show{
    display:block;
}
</style>

<nav>
<input type="checkbox" id="nav" class="hidden"/>
<label for="nav" class="nav-open"><i></i><i></i><i></i></label>
<div class="nav-container">
<ul>
<li><a href="#">Link 1</a></li>
<li><a href="#">Link 2</a></li>
<li><a href="#">Link 3</a></li>
<li><a href="#">Link 4</a></li>
</ul>
</div>
</nav>

<script>
const navLinks = document.querySelectorAll('.nav-container ul li a');
const navCheckbox = document.getElementById('nav');

navLinks.forEach(link => {
  link.addEventListener('click', () => {
    navCheckbox.checked = false;
  });
});
</script>

原理说明

你的菜单样式完全依赖#nav:checked这个CSS选择器触发展开状态,当把checkbox的checked属性设为false时,所有基于:checked的样式会立即失效,菜单会按照CSS中定义的过渡动画自然关闭,和点击汉堡按钮的关闭效果完全一致。如果链接是页面内锚点跳转,该逻辑也不会影响锚点的正常跳转行为。

内容的提问来源于stack exchange,提问作者Septronius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:54:23