
在构建交互式侧边导航时,我们通常会使用html来定义菜单结构,css来美化其外观和定义激活状态,以及javascript来处理用户交互逻辑。
HTML 结构
以下HTML代码展示了一个典型的侧边导航菜单结构,其中包含多个 main_list_item 元素,每个元素代表一个主菜单项。
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>side nav</title>
</head>
<body>
<nav id="nav_menu_query_off">
<menu id="main_menu">
<li class="main_list_item">
<div class="menu_header">menu one</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu two</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu three</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu four</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
</menu>
</nav>
</body>
</html>CSS 样式
CSS用于定义导航的布局和视觉样式。其中,.active 类是实现激活效果的关键,它为菜单项底部添加了一个红色的边框。
立即学习“Java免费学习笔记(深入)”;
* {
margin: 0;
padding: 0;
box-sizing: border-box;
text-decoration: none;
list-style: none;
}
body {
font-family: 'Ebrima';
background-color: #444444;
}
nav#nav_menu_query_off {
position: fixed;
top: 0;
left: 0;
width: 200px;
height: 100vh;
background-color: #222222;
overflow: auto;
z-index: 2;
padding: 20px 0 20px 20px;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_header {
text-transform: uppercase;
padding-bottom: 10px;
}
nav#nav_menu_query_off menu li {
color: #f0f0f0;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:first-child) {
padding-top: 20px;
}
.active {
border-bottom: 1px solid red;
}
nav::-webkit-scrollbar {
display: none;
}最初的JavaScript代码旨在为每个菜单项添加点击事件监听器,并在点击时切换其 active 类。
const cards = document.querySelectorAll('.main_list_item');
cards.forEach((card) => {
const num_btn = card.querySelector('.menu_header')
num_btn.addEventListener('click', () => {
if (!card.classList.contains('active')) {
card.classList.add('active');
} else {
card.classList.remove('active');
}
})
})这段代码的问题在于,当一个菜单项被点击时,它只会根据自身当前是否含有 active 类来决定是添加还是移除该类。它并不会检查或修改其他菜单项的状态。这意味着,如果用户连续点击不同的菜单项,每个被点击的菜单项都会被赋予 active 类,从而导致多个菜单项同时显示红色边框,这与我们期望的“单选”效果不符。
要实现一次只有一个菜单项被激活的效果,核心思想是在激活当前菜单项之前,首先清除所有其他菜单项的激活状态。这可以通过在添加 active 类之前,遍历所有菜单项并移除它们的 active 类来实现。
以下是修改后的JavaScript代码:
const cards = document.querySelectorAll('.main_list_item');
cards.forEach((card) => {
const num_btn = card.querySelector('.menu_header')
num_btn.addEventListener('click', () => {
if (!card.classList.contains('active')) {
// 在添加当前项的active类之前,先清除所有项的active类
cards.forEach((item) => item.classList.remove('active'));
card.classList.add('active');
} else {
// 如果当前项已激活且再次点击,则移除active类(取消激活)
card.classList.remove('active');
}
})
})代码解析:
为了方便理解和实践,以下是包含HTML、CSS和修正后JavaScript的完整代码:
HTML (index.html)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>side nav</title>
<link rel="stylesheet" href="style.css"> <!-- 引入CSS文件 -->
</head>
<body>
<nav id="nav_menu_query_off">
<menu id="main_menu">
<li class="main_list_item">
<div class="menu_header">menu one</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu two</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu three</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
<li class="main_list_item">
<div class="menu_header">menu four</div>
<div class="menu_body">
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
<menu class="sub_menu"></menu>
</div>
</li>
</menu>
</nav>
<script src="script.js"></script> <!-- 引入JavaScript文件 -->
</body>
</html>CSS (style.css)
* {
margin: 0;
padding: 0;
box-sizing: border-box;
text-decoration: none;
list-style: none;
}
body {
font-family: 'Ebrima';
background-color: #444444;
}
nav#nav_menu_query_off {
position: fixed;
top: 0;
left: 0;
width: 200px;
height: 100vh;
background-color: #222222;
overflow: auto;
z-index: 2;
padding: 20px 0 20px 20px;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item div.menu_header {
text-transform: uppercase;
padding-bottom: 10px;
cursor: pointer; /* 添加光标指示可点击 */
}
nav#nav_menu_query_off menu li {
color: #f0f0f0;
}
nav#nav_menu_query_off menu#main_menu li.main_list_item:not(:first-child) {
padding-top: 20px;
}
.active {
border-bottom: 1px solid red;
}
nav::-webkit-scrollbar {
display: none;
}JavaScript (script.js)
const cards = document.querySelectorAll('.main_list_item');
cards.forEach((card) => {
const num_btn = card.querySelector('.menu_header')
num_btn.addEventListener('click', () => {
if (!card.classList.contains('active')) {
// 在添加当前项的active类之前,先清除所有项的active类
cards.forEach((item) => item.classList.remove('active'));
card.classList.add('active');
} else {
// 如果当前项已激活且再次点击,则移除active类(取消激活)
card.classList.remove('active');
}
})
})本教程详细介绍了如何通过修改JavaScript逻辑,实现侧边导航菜单的单选激活效果。核心在于利用 querySelectorAll 获取所有菜单项,并在每次点击激活新项之前,迭代清除所有旧的激活状态。这种模式广泛应用于各种UI组件,确保了界面的清晰性和用户操作的预期性。通过简单的几行代码修改,我们成功地将多选行为修正为符合用户习惯的单选行为。
以上就是实现侧边导航单选激活效果:JavaScript与CSS实践的详细内容,更多请关注php中文网其它相关文章!
Windows激活工具是正版认证的激活工具,永久激活,一键解决windows许可证即将过期。可激活win7系统、win8.1系统、win10系统、win11系统。下载后先看完视频激活教程,再进行操作,100%激活成功。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号