我试图完成一个移动响应菜单的纯CSS,有下拉。我的问题是,我无法像你所期望的那样显示菜单的移动样式,也就是说,一个简单的列表,将每个列表项目与所有级别都分开(包括适用于子菜单的缩进)。正如您在本演示中所看到的,嵌套的ul开始时,它会从其他菜单项中筛选出来。我该怎么解决这个问题?谢谢。
演示:
#main-nav {
display: flex;
justify-content: space-between;
margin: 20px 16px 20px 16px;
border-bottom: 7px solid rgb(30, 30, 30);
}
.menu-left li{
/*display: inline-block;*/
padding-right: 32px;
}
#main-nav a {
display: flex;
align-items: center;
text-decoration: none;
}
#main-nav ul {
display: flex;
margin: 0;
padding: 0;
list-style: none;
}
#main-nav li {
width:100%;
position: relative;
padding-top: 10px;
padding-bottom: 10px;
}
#main-nav li:hover .submenu > li {
display: block;
top: 0px;
}
.submenu li {
display: none;
position: absolute;
top: 0;
}
.submenu {
display: flex;
flex-direction: column;
position: absolute;
width: 100%;
}
.submenu li {
position: relative;
}
.submenu li:hover .submenu-2 li {
display: block;
}
.submenu-2 li {
display: none;
}
.submenu-2 {
display: flex;
flex-direction: column;
position: absolute;
top: 0;
left: 100%;
width: 120px;
}
.arrow {
margin-left: 8px;
color: rgb(88, 88, 88);
font-size: 12px;
}
/*
Media -------------------------------------------
*/
@media all and (max-width: 768px) {
#main-nav {
display: block;
margin:0;
margin-bottom: 16px;
border-bottom: none;
background-color: #DDD;
border-top: 1px solid MediumTurquoise;
}
li:hover {
background-color: #eee;
}
#main-nav a {
display: block;
}
#main-nav ul {
display: block;
}
#main-nav li {
padding: 10px 0 10px 16px;
border-bottom: 1px solid MediumTurquoise;
position: static;
}
.nav-menu-border {
border-bottom: none;
}
.submenu {
display: block;
position: static;
}
.submenu li {
display: initial;
position: static;
top: auto;
}
.submenu-2 {
display: block;
position: static;
top: auto;
}
.submenu-2 li {
display: initial;
}
#main-nav li:hover .submenu > li {
/* reset the hover styles to disable hover effect */
display: initial;
top: auto;
}
.submenu li:hover .submenu-2 li {
/* reset the hover styles to disable hover effect */
display: initial;
}
.submenu {
margin: 0;
padding: 0;
}
}<nav id="main-nav" class="menu">
<ul class="menu-left">
<li><a href="#">ONE</a></li>
<li><a href="#">TWO</a></li>
<li>
<a href="#" style="color:red;">THREE</a>
<ul class="submenu">
<li><a href="#">FOUR</a></li>
<li><a href="#">FIVE</a></li>
<li>
<a href="#">SIX<span class="arrow">►</span></a>
<ul class="submenu-2">
<li><a href="#">SEVEN</a></li>
<li><a href="#">EIGHT</a></li>
<li><a href="#">NINE</a></li>
<li><a href="#">TEN</a></li>
</ul>
</li>
<li><a href="#">ELEVEN</a></li>
</ul>
</li>
<li><a href="#">TWELVE</a></li>
</ul>
<ul class="menu-right">
<li><a href="#">THIRTEEN</a></li>
</ul>
</nav>
<h2>Drag the screen width slider to see the mobile menu </h2>
发布于 2018-10-04 23:00:54
我不得不做很多改变。我将不详细介绍每个更改,但我将解释我所做的主要更改:
li标记中的a标记中,因为我希望li只负责显示行为。另外,由于您有很多嵌套的li,所以使用这些规则更有意义,因为您将得到额外的填充和边框。text-indent的规则,它能满足你的需要。您可以使用text-indent规则,而不是从一开始就添加自定义填充,它将处理缩进。你可以亲眼看到结果:
#main-nav {
display: flex;
justify-content: space-between;
margin: 20px 16px 20px 16px;
border-bottom: 7px solid rgb(30, 30, 30);
}
.menu-left li{
/*display: inline-block;*/
padding-right: 32px;
}
#main-nav a {
display: flex;
align-items: center;
text-decoration: none;
}
#main-nav ul {
display: flex;
margin: 0;
padding: 0;
list-style: none;
}
#main-nav li {
width:100%;
position: relative;
padding-top: 10px;
padding-bottom: 10px;
}
#main-nav li:hover .submenu > li {
display: block;
top: 0px;
}
.submenu li {
display: none;
position: absolute;
top: 0;
}
.submenu {
display: flex;
flex-direction: column;
position: absolute;
width: 100%;
}
.submenu li {
position: relative;
}
.submenu li:hover .submenu-2 li {
display: block;
}
.submenu-2 li {
display: none;
}
.submenu-2 {
display: flex;
flex-direction: column;
position: absolute;
top: 0;
left: 100%;
width: 120px;
}
.arrow {
margin-left: 8px;
color: rgb(88, 88, 88);
font-size: 12px;
}
/*
Media -------------------------------------------
*/
@media all and (max-width: 768px) {
#main-nav {
display: flex;
flex-direction: column;
margin: 0 0 16px;
margin-bottom: 16px;
border-bottom: none;
background-color: #DDD;
border-top: 1px solid MediumTurquoise;
}
li:hover {
background-color: #eee;
}
#main-nav a {
padding: 10px;
border-bottom: 1px solid MediumTurquoise;
display: block;
}
#main-nav ul {
flex-direction: column;
}
#main-nav li {
padding: 0;
margin: 0;
position: static;
box-sizing: border-box;
}
.nav-menu-border {
border-bottom: none;
}
.submenu {
display: flex;
flex-direction: column;
position: static;
text-indent: 10px
}
.submenu li {
display: block;
position: static;
}
.submenu-2 {
display: flex;
flex-direction: column;
position: static;
width: auto;
text-indent: 20px;
}
.submenu-2 li {
display: block;
}
.submenu {
margin: 0;
padding: 0;
}
}<nav id="main-nav" class="menu">
<ul class="menu-left">
<li><a href="#">ONE</a></li>
<li><a href="#">TWO</a></li>
<li>
<a href="#" style="color:red;">THREE</a>
<ul class="submenu">
<li><a href="#">FOUR</a></li>
<li><a href="#">FIVE</a></li>
<li>
<a href="#">SIX<span class="arrow">►</span></a>
<ul class="submenu-2">
<li><a href="#">SEVEN</a></li>
<li><a href="#">EIGHT</a></li>
<li><a href="#">NINE</a></li>
<li><a href="#">TEN</a></li>
</ul>
</li>
<li><a href="#">ELEVEN</a></li>
</ul>
</li>
<li><a href="#">TWELVE</a></li>
</ul>
<ul class="menu-right">
<li><a href="#">THIRTEEN</a></li>
</ul>
</nav>
<h2>Drag the screen width slider to see the mobile menu </h2>
PS:
您可以考虑使用移动第一方法进行样式设计。它将使您的代码更易于管理。
https://stackoverflow.com/questions/52655511
复制相似问题