博主信息
博文 36
粉丝 4
评论 3
访问量 39067
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
7.19 二级菜单 css与原生js的2种实现方式小案例
大灰狼的博客
原创
1107人浏览过

二级菜单 css方式与原生js的2种实现方式小案例

先看效果图 二级菜单随一级菜单相对定位(功能性案例未美化UI勿怪)

1.png

首先htm结构使用了 div.nav >ul>li +ul>li 的结构。除了最外层容器设置class="nav" 其子元素均不用任何设置

css实现比较简答个人也觉得这个适合css实现
关键就2个 
ul ul{display: none;} 第一子菜单默认隐藏
ul:hover ul{display: block;} 第二鼠标经过ul显示子菜单ul 很简单把?
看代码

实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>二级菜单css版</title>
		<style type="text/css">
			*{margin: 0;padding: 0;}
			li{list-style: none;line-height: 30px;}
			.nav{position: relative; display: inline-block;background: #44AAFF; padding: 10px;border: 1px solid #393D49;}
			ul{border-bottom: 1px solid #003366;}
			ul ul{display: none;}
			ul ul li{display: inline-block; padding: 8px;}
			ul:hover ul{display: block;position: absolute;margin-top: -30px;left: 85px;width: 260px;border: 1px solid #393D49;background:#EAEAEA;}
			
		</style>
	</head>
	<div class="nav">
		<ul>
			<li>一级菜单1</li>
			<ul>
				<li>111我是二级菜单1</li>
				<li>111我是二级菜单2</li>
				<li>111我是二级菜单3</li>
				<li>111我是二级菜单4</li>
				<li>111我是二级菜单5</li>
				<li>111我是二级菜单6</li>
				<li>111我是二级菜单7</li>
				<li>111我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单2</li>
		</ul>
		<ul>
			<li>一级菜单3</li>
			<ul>
				<li>333我是二级菜单1</li>
				<li>333我是二级菜单2</li>
				<li>333我是二级菜单3</li>
				<li>333我是二级菜单4</li>
				<li>333我是二级菜单5</li>
				<li>333我是二级菜单6</li>
				<li>333我是二级菜单7</li>
				<li>333我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单4</li>
			<ul>
				<li>444我是二级菜单1</li>
				<li>444我是二级菜单2</li>
				<li>444我是二级菜单3</li>
				<li>444我是二级菜单4</li>
				<li>444我是二级菜单5</li>
				<li>444我是二级菜单6</li>
				<li>444我是二级菜单7</li>
				<li>444我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单5</li>
			<ul>
				<li>555我是二级菜单1</li>
				<li>555我是二级菜单2</li>
				<li>555我是二级菜单3</li>
				<li>555我是二级菜单4</li>
				<li>555我是二级菜单5</li>
				<li>555我是二级菜单6</li>
				<li>555我是二级菜单7</li>
				<li>555我是二级菜单8</li>
			</ul>
		</ul>
	</div>
	<body>
	</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


原生js版本

仅仅是在前面css版本上做了小修改通过js来实现(实战中肯定css适合此场景 js太多此一举 但此处就事论事 只是讲js实现)

为了保证dom结构够简单总容器外 其他元素未增加任何id class之类(通过父子兄弟关系选择)。
使用了冒泡事件,鼠标移入移除。

实例

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>二级菜单原生JS版</title>
		<style type="text/css">
			*{margin: 0;padding: 0;}
			li{list-style: none;line-height: 30px;}
			.nav{position: relative; display: inline-block;background: #44AAFF; padding: 10px;border: 1px solid #393D49;}
			ul{border-bottom: 1px solid #003366;}
			ul ul{display: none;}
			ul ul li{display: inline-block; padding: 8px;}
			.active{display: block;position: absolute;margin-top: -30px;left: 85px;width: 350px;border: 1px solid #393D49;background:#EAEAEA;}
			
		</style>
	</head>
	<div class="nav">
		<ul>
			<li>一级菜单1</li>
			<ul>
				<li>111我是二级菜单1</li>
				<li>111我是二级菜单2</li>
				<li>111我是二级菜单3</li>
				<li>111我是二级菜单4</li>
				<li>111我是二级菜单5</li>
				<li>111我是二级菜单6</li>
				<li>111我是二级菜单7</li>
				<li>111我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单2</li>
		</ul>
		<ul>
			<li>一级菜单3</li>
			<ul>
				<li>333我是二级菜单1</li>
				<li>333我是二级菜单2</li>
				<li>333我是二级菜单3</li>
				<li>333我是二级菜单4</li>
				<li>333我是二级菜单5</li>
				<li>333我是二级菜单6</li>
				<li>333我是二级菜单7</li>
				<li>333我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单4</li>
			<ul>
				<li>444我是二级菜单1</li>
				<li>444我是二级菜单2</li>
				<li>444我是二级菜单3</li>
				<li>444我是二级菜单4</li>
				<li>444我是二级菜单5</li>
				<li>444我是二级菜单6</li>
				<li>444我是二级菜单7</li>
				<li>444我是二级菜单8</li>
			</ul>
		</ul>
		<ul>
			<li>一级菜单5</li>
			<ul>
				<li>555我是二级菜单1</li>
				<li>555我是二级菜单2</li>
				<li>555我是二级菜单3</li>
				<li>555我是二级菜单4</li>
				<li>555我是二级菜单5</li>
				<li>555我是二级菜单6</li>
				<li>555我是二级菜单7</li>
				<li>555我是二级菜单8</li>
			</ul>
		</ul>
	</div>
<script type="text/javascript">
	//拿到导航菜单总容器div.nav 	
	var navDIV = document.getElementsByClassName('nav')[0];
	//给菜单导航绑定冒泡事件 鼠标移入和移除
	navDIV.addEventListener('mouseover', subShow, false);
	navDIV.addEventListener('mouseout', subShow, false);
	//鼠标移入 二级菜单显示函数
	function subShow(ev) {
		//判断ul是否属于一级菜单中的ul
		if(ev.target.parentElement.parentElement.nodeName === 'DIV') {
			//判断是否存在二级菜单ul 再添加或取消active样式
			if(ev.target.parentElement.children.length === 2) {
				ev.target.nextElementSibling.classList.toggle('active');
			};
		};
	};
</script>
	<body>
	</body>
</html>

运行实例 »

点击 "运行实例" 按钮查看在线实例


批改状态:合格

老师批语:虽然可以实现效果,但不建议将代码与具体的标签名称绑定, 写html, 应该是面向类, 而不对面得标签, 不推荐在js中判断是否存在某个标签名称, 而应该判断是否存在某个指定的类名, 以实现代码复用与通用性
本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学