JS实现导航菜单二级下拉的三种方案:纯CSS、原生JS与jQuery
本文介绍了在网页开发中实现导航菜单二级下拉的三种常见方式。首先分析仅使用HTML和CSS的结构与表现分离方案,其次探讨原生JavaScript通过DOM操作实现的方法及其局限性,最后展示利用jQuery库简化交互逻辑的实现代码。通过对比三种方案的结构、行为分离程度及开发复杂度,帮助开发者根据项目需求选择合适的技术栈。
导航菜单二级下拉实现概述
在淘宝、搜狐等大型网站中,二级下拉菜单的应用十分普遍,例如图片所示的效果。那么,具体该如何实现导航栏中的二级下拉菜单功能呢?接下来将分享具体的实现思路。

要实现类似图片中的效果,实际上存在至少三种不同的实现路径,下文将附上相关代码供参考。
纯HTML与CSS方案
第一种方案:仅使用HTML和CSS
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:0;padding: 0;list-style: none;text-decoration: none;}
#nav{width: 500px;height: 40px;background: #ccc;margin: 0 auto;}
ul{background: #aaa}
ul li{float:left; display:block; height: 40px; line-height: 40px; padding: 0 20px; position: relative;}
ul li:hover{background: #cea;}
ul li ul li{float: none;}
/*关键一:将二级菜单设置为display:none;*/
ul li ul{position: absolute;top:40px;left: 0; display: none;}
ul li ul li:hover{background: red;}
/*关键二:在划过二级菜单从属的一级菜单时,设置为display:block;*/
ul li:hover ul{display: block;}
</style>
<div id="nav">
<ul>
<li><a href="">首页</a></li>
<li><a href="">汽车</a>
<ul>
<li><a href="#">奥迪</a> </li>
<li><a href="#">道奇</a> </li>
</ul>
</li>
<li><a href="">手机</a>
<ul>
<li><a href="#">小米</a> </li>
<li><a href="#">华为</a> </li>
</ul>
</li>
<li><a href="">联系我们</a></li>
</ul>
</div>
可以看出,这种方法具有显著优势,它确保了页面结构与视觉表现的完全分离。
原生JavaScript方案
第二种方案:使用JavaScript
<!DOCTYPE htm>
<html lang="en">
<head >
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:0;padding: 0;list-style: none;text-decoration: none;}
#nav{width: 500px;height: 40px;background: #ccc;margin: 0 auto;}
ul{background: #aaa}
ul li{float:left; display:block; height: 40px; line-height: 40px; padding: 0 20px; position: relative;}
ul li:hover{background: #cea;}
ul li ul li{float: none;}
ul li ul{position: absolute;top:40px;left: 0; display:none;}
ul li ul li:hover{background: red;}
</style>
<div id="nav">
<ul>
<li><a href="#">首页</a></li>
<li onmouseover="show(this)" onmouseout="hide(this)"><a href="#">汽车</a>
<!-- 关键一:在二级标题从属的一级标题标签内设置时间执行程序,this代表的时这个li元素 -->
<ul>
<li><a href="#">奥迪</a> </li>
<li><a href="#">道奇</a> </li>
</ul>
</li>
<li onmouseover="show(this)" onmouseout="hide(this)"><a href="#">手机</a>
<ul>
<li><a href="#">小米</a> </li>
<li><a href="#">华为</a> </li>
</ul>
</li>
<li><a href="#">联系我们</a></li>
</ul>
</div>
script>
function show(li){
var ul=li.getElementsByTagName("ul")[0];
// 关建二:在li这个对象内查询标签名为ul的标签,由于二级标签只有一个,所以索引为0即可。
ul.style.display="block";
// 关键三:当鼠标划过li时,其子元素ul标签的display为block
}
function hide(li){
var ul=li.getElementsByTagName("ul")[0];
ul.style.display="none";
// 关键四:当鼠标划出li时,其子元素ul的display为none
}
/script>
采用原生JavaScript实现相对繁琐,且在此场景下结构和行为未能有效分离(尽管可以通过DOM操作在JavaScript中创建元素以实现分离,但过程极为复杂),因此不推荐此方式。
jQuery库方案
第三种方案:使用jQuery实现
jQuery是一个JavaScript库,开发者可以从jQuery官网下载最新版本的库文件。其中,压缩版文件适用于生产环境,未压缩版则便于开发人员学习和调试。下载至本地后,需将库文件引入HTML中。由于jQuery本质上是JavaScript,其引用方式如下:
<script src="路径名称"></script>
使用jQuery实现二级下拉菜单的具体代码如下:
<meta charset="UTF-8">
<title>Document</title>
<style>
*{margin:0;padding: 0;list-style: none;text-decoration: none;}
#nav{width: 500px;height: 40px;background: #ccc;margin: 0 auto;}
ul{background: #aaa}
ul li{float:left; display:block; height: 40px; line-height: 40px; padding: 0 20px; position: relative;}
ul li:hover{background: #cea;}
ul li ul li{float: none;}
ul li ul{position: absolute;top:40px;left: 0; display: none;}
ul li ul li:hover{background: red;}
</style>
<div id="nav">
<ul>
<li><a href="">首页</a></li>
<li class="navmenu"><a href="">汽车</a>
<ul>
<li><a href="#">奥迪</a> </li>
<li><a href="#">道奇</a> </li>
</ul>
</li>
<li class="navmenu"><a href="">手机</a>
<ul>
<li><a href="#">小米</a> </li>
<li><a href="#">华为</a> </li>
</ul>
</li>
<li><a href="">联系我们</a></li>
</ul>
</div>
<!-- 关键一:引入jQuery库文件 -->
script type="text/javascript">
$(function(){
$(".navmenu").mouseover(function(){
$(this).children("ul").show();
})
})
// 关键二:正确使用jQuey的语法完成行为。
$(function(){
$(".navmenu").mouseout(function(){
$(this).children("ul").hide();
})
})
/script>
显然,使用jQuery进行开发非常便捷。
最终的实现效果如下图所示:

即当鼠标悬停在一级菜单上时,会显示对应的二级菜单。
以上介绍了JS中实现导航菜单二级下拉的三种方式,希望对大家有所帮助。如有任何疑问,欢迎留言,小编会及时回复。在此非常感谢大家对本站的支持!
JS监听滚动事件:回到顶部按钮的显示与隐藏逻辑
2026-11-05 16:19:37
JavaScript怎么读写LocalStorage与SessionStorage
2026-11-05 15:40:11
anime.js 与 GSAP 对比:轻量级项目该怎么选择动画库
2026-11-05 11:24:55
flv.js 与 hls.js 在直播场景下的选型对比
2026-11-05 08:18:52
JavaScript能做什么?前端开发中的作用与应用场景解析
2026-11-04 23:17:54
