如何通过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
相关产品推荐
相关产品推荐

