使用原生JavaScript实现鼠标滑过显示二级菜单
实现鼠标悬停时展开二级导航菜单是Web前端常见的交互需求。本文将详细解析如何利用原生JavaScript监听鼠标移入事件,并通过DOM操作动态控制多个二级菜单块的显示与隐藏状态。
核心实现思路
该特效的核心逻辑在于事件监听与样式切换。当用户鼠标滑过一级导航菜单项时,触发特定的JavaScript函数。该函数负责执行以下动作:
- 定位目标:根据触发的菜单项标识(如ID或索引),找到对应的二级菜单容器。
- 清理状态:将所有相关的二级菜单容器设置为隐藏(
display: none)。 - 激活显示:将目标二级菜单容器设置为显示(
display: block)。
这种方法避免了复杂的CSS层级依赖,完全由JavaScript逻辑驱动交互状态。
代码实现细节
第1步:定义菜单切换函数
首先需要编写一个通用的处理函数,接收一个参数来区分当前操作的是哪个一级菜单。在示例中,使用数字作为标识符,并通过 switch 语句进行判断。
function selectTabMenu(i){
switch(i){
case 71:
// 显示第一个菜单,隐藏其余
document.getElementById("TabMenuCon71").style.display="block";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 72:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="block";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
// 其他case类似...默认逻辑应确保只有一个菜单处于block状态
}
}
关键点:必须同时设置其他菜单为 none,否则多个二级菜单会重叠显示。
第2步:HTML结构与事件绑定
在HTML中,一级导航菜单的每个列表项需绑定 onmouseover 事件,调用上述函数并传入对应的标识符。
<ul class="nav">
<li><a href="#" onmouseover="selectTabMenu(71)">首页</a></li>
<li><a href="#" onmouseover="selectTabMenu(72)">关于协会</a></li>
<!-- 更多导航项 -->
</ul>
第3步:编写二级菜单HTML
二级菜单通常以无序列表呈现,每个菜单块拥有唯一的ID,以便JS精准定位。
<!-- 对应首页的二级菜单 -->
<ul id="TabMenuCon71" class="TabMenuCon">
<li><a href="#">公告</a></li>
<li><a href="#">信息</a></li>
</ul>
<!-- 对应关于协会的二级菜单 -->
<ul id="TabMenuCon72" class="TabMenuCon">
<li>协会简介</li>
<li>组织机构</li>
<li>协会章程</li>
</ul>
第4步:配置CSS样式
为了配合JS的逻辑,CSS需要设定初始隐藏状态以及悬停视觉效果。
/* 一级导航基础样式 */
.navBar{
height: 30px;
background-color: #2B383E;
text-align: center;
}
.nav li{
float: left;
}
.nav li a{
display: block;
padding: 0 20px;
height: 30px;
line-height: 30px;
text-decoration: none;
color: #fff;
}
.nav li a:hover{
background-color: #fff;
color: #4DB6E7
}
/* 二级菜单基础样式 */
.TabMenuCon{
clear: both;
display: none; /* 默认全部隐藏 */
}
.TabMenuCon li{
display: inline-block;
}
完整代码整合
以下是包含HTML、CSS和JavaScript的完整示例,可直接复制用于测试。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>水平导航-二级菜单</title>
<style type="text/css">
*{
padding:0px;
margin: 0px;
}
.navBar{
height: 30px;
background-color: #2B383E;
text-align: center;
}
ul{
list-style: none;
}
.nav li{
float: left;
}
.nav li a{
display: block;
padding: 0 20px;
height: 30px;
line-height: 30px;
text-decoration: none;
color: #fff;
}
.nav li a:hover{
background-color: #fff;
color: #4DB6E7
}
.TabMenuCon{
clear: both;
display: none;
}
.TabMenuCon li{
display: inline-block;
}
</style>
<script type="text/javascript">
function selectTabMenu(i){
switch(i){
case 71:
document.getElementById("TabMenuCon71").style.display="block";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 72:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="block";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 73:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="block";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 74:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="block";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 75:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="block";
document.getElementById("TabMenuCon76").style.display="none";
break;
case 76:
document.getElementById("TabMenuCon71").style.display="none";
document.getElementById("TabMenuCon72").style.display="none";
document.getElementById("TabMenuCon73").style.display="none";
document.getElementById("TabMenuCon74").style.display="none";
document.getElementById("TabMenuCon75").style.display="none";
document.getElementById("TabMenuCon76").style.display="block";
break;
}
}
</script>
</head>
<body>
<div class="navBar">
<ul class="nav">
<li><a href="#" onmouseover="selectTabMenu(71)">首页</a></li>
<li><a href="#" onmouseover="selectTabMenu(72)">关于协会</a></li>
<li><a href="#" onmouseover="selectTabMenu(73)">协会动态</a></li>
<li><a href="#" onmouseover="selectTabMenu(74)">协会活动</a></li>
<li><a href="#" onmouseover="selectTabMenu(75)">会员</a></li>
<li><a href="#" onmouseover="selectTabMenu(76)">资源空间</a></li>
</ul>
</div>
<div id="TabMenuCon">
<ul id="TabMenuCon71" class="TabMenuCon">
<li><a href="#">公告</a></li>
<li><<a href="#">信息</a></li>
</ul>
<ul id="TabMenuCon72" class="TabMenuCon">
<li>协会简介</li>
<li>组织机构</li>
<li>协会章程</li>
</ul>
<ul id="TabMenuCon73" class="TabMenuCon">
<li>协会新闻</li>
<li>活动预告</li>
<li>求职招聘</li>
</ul>
<ul id="TabMenuCon74" class="TabMenuCon">
<li>义务维修月</li>
<li>平面设计活动</li>
<li>程序设计活动</li>
<li>户外拓展</li>
</ul>
<ul id="TabMenuCon75" class="TabMenuCon">
<li>会员登录</li>
<li>会员注册</li>
<li>缴纳会费</li>
<li>会员信息管理</li>
<li>修改密码</li>
</ul>
<ul id="TabMenuCon76" class="TabMenuCon">
<li>PS教程</li>
<li>前端设计</li>
<li>Flash教程</li>
</ul>
</div>
</body>
</html>
完成判断与注意事项
- 视觉反馈:保存文件并在浏览器打开,将鼠标悬停在一级菜单“首页”、“关于协会”等链接上,观察下方是否相应出现不同的二级列表内容。
- 状态互斥:检查确保同一时刻只有一个二级菜单处于可见状态。如果JS逻辑有误,可能导致多个菜单叠加。
- 兼容性:该方法适用于所有现代主流浏览器。若需兼容极老版本IE,可能需要添加
onmouseout事件以实现更流畅的退出体验,但基础悬停显示功能已完备。
以上就是利用原生JavaScript实现鼠标滑过显示二级菜单的详细内容,更多关于JavaScript菜单特效的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









