效果:
html页面
<body>
<div class="menu">
<ul>
<li>
<a href="#">一级菜单</a>
<ul>
<li><a href="#">二级菜单</a></li>
<li><a href="#">二级菜单</a></li>
<li><a href="#">二级菜单</a></li>
<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>
<li><a href="#">二级菜单</a></li>
<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>
<li><a href="#">二级菜单</a></li>
<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>
<li><a href="#">二级菜单</a></li>
<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>
<li><a href="#">二级菜单</a></li>
<li><a href="#">二级菜单</a></li>
<li><a href="#">二级菜单</a></li>
</ul>
</li>
</ul>
</div>
</body>
JS代码
<script>
$(function() {
$(".menu>ul>li").hover(function() {
$(this.querySelector("ul")).slideToggle()
})
})
</script>
JS代码详解:
-
$(function() { ... })
: 这是jQuery的快捷方式,用于在DOM加载完成后执行代码。它等价于$(document).ready(function() { ... })
,表示代码会在页面加载完成后执行。 -
$(".menu>ul>li").hover(function() { ... })
: 这是一个选择器,它选中所有具有"class"为"menu"的元素中的直接子元素的<li>
(列表项)。然后,通过.hover()
方法为这些<li>
元素添加悬停事件的监听。 -
function() { ... }
: 这是一个悬停事件的回调函数。当鼠标悬停在匹配的菜单项上时,这个函数会被执行。 -
$(this.querySelector("ul")).slid
Toggle()
: 在悬停事件回调函数中,首先使用this
来获取当前鼠标悬停的菜单项元素。然后,通过querySelector("ul")
来选择这个菜单项元素下的<ul>
(无序列表,也就是子菜单)元素。接着,通过.slideToggle()
方法来切换子菜单的显示状态,如果子菜单是隐藏的,则显示它;如果子菜单是显示的,则隐藏它。.slideToggle()
方法会为显示和隐藏添加动画效果。
CSS代码
* {
padding: 0;
margin: 0;
}
.menu {
background: #910000;
}
.menu>ul {
display: flex;
justify-content: space-between;
width: 80%;
margin: auto;
}
.menu ul li {
list-style: none;
}
.menu>ul>li {
position: relative;
}
.menu ul li a {
padding: 10px;
display: block;
color: white;
text-decoration: none;
}
.menu ul ul {
position: absolute;
width: 100%;
background: #910000;
display: none;
}
CSS代码详解:
*
选择器将页面上所有元素的内边距和外边距设置为0,以消除默认的内边距和外边距。.menu
类选择器选中具有 “menu” 类的元素,设置了背景颜色为深红色 (#910000)。.menu>ul
选择器选中直接子元素是ul
的.menu
元素,将其样式设置为弹性布局 (display: flex
),并使用justify-content: space-between
属性使子元素在水平方向上等间距分布。.menu ul li
选择器选中所有ul
元素下的li
元素,并移除其默认的列表样式。.menu>ul>li
选择器选中.menu
元素下的直接子元素li
,设置其位置为相对定位。.menu ul li a
选择器选中所有ul
元素内的li
元素中的锚点 (<a>
标签),设置了内边距、显示为块级元素、文字颜色为白色、去除下划线。.menu ul ul
选择器选中ul
元素的子ul
元素(子菜单),设置其位置为绝对定位,宽度为100%,背景颜色与父菜单一致,且初始状态为不显示。