原生js写一个三级导航
时间: 2023-12-14 07:05:39 浏览: 78
好的,以下是一个基于原生js的三级导航的代码实现:
HTML代码:
```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>三级导航</title>
<style>
ul {
list-style: none;
padding: 0;
margin: 0;
}
li {
float: left;
position: relative;
}
a {
display: block;
padding: 10px;
background-color: #eee;
text-decoration: none;
color: #333;
}
ul ul {
display: none;
position: absolute;
top: 100%;
left: 0;
}
ul ul ul {
top: 0;
left: 100%;
}
li:hover > ul {
display: block;
}
</style>
</head>
<body>
<h1>三级导航</h1>
<ul>
<li>
<a href="#">菜单1</a>
<ul>
<li>
<a href="#">子菜单1</a>
<ul>
<li>
<a href="#">子子菜单1</a>
</li>
<li>
<a href="#">子子菜单2</a>
</li>
</ul>
</li>
<li>
<a href="#">子菜单2</a>
</li>
</ul>
</li>
<li>
<a href="#">菜单2</a>
<ul>
<li>
<a href="#">子菜单3</a>
</li>
<li>
<a href="#">子菜单4</a>
</li>
</ul>
</li>
</ul>
</body>
</html>
```
JS代码:
```javascript
// 获取所有含有子菜单的li元素
var items = document.querySelectorAll('li:has(ul)');
// 遍历所有含有子菜单的li元素
for (var i = 0; i < items.length; i++) {
// 获取当前li元素的子菜单ul元素
var submenu = items[i].querySelector('ul');
// 将子菜单的第一个li元素的上边框设置为0,以解决二级菜单之间的间隙问题
if (submenu.firstElementChild.nodeName === 'LI') {
submenu.firstElementChild.style.borderTop = '0';
}
// 将当前li元素的子菜单ul元素的左边距设置为当前li元素的宽度,以实现横向排列
submenu.style.left = items[i].offsetWidth + 'px';
}
```
这个三级导航的基本逻辑是,使用CSS实现一级菜单和二级菜单的显示和隐藏,使用原生JS实现横向排列和处理二级菜单之间的间隙问题。
阅读全文