Reputation: 139
I have a ul li structure that looks like as in the code below.
I want to display just the first level of drop-down on hover. Now, since the <ul>
has "drop-down menu" in various places withing the same <ul>
tag, it displays all the items that are under this class. One way is to add a parent class either adding in HTML or dynamically by writing some script.
Is there a way we could access this directly using CSS alone ?
.nav-item:hover .dropdown-menu ul { should exclude all the dropdown-menu class where there is also a submenu class - something like this
}
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="#">
Item 1
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Item 2
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Item 3
</a>
<ul class="submenu dropdown-menu">
<li>
<a class="dropdown-item" href="#">
Second Level item1
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Second Level item2
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Second Level item3
</a>
<ul class="submenu dropdown-menu">
<li>
<a class="dropdown-item" href="#">
Third Level item1
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Third Level item2
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Third Level item3
</a>
</li>
</ul>
</li>
</ul>
</li>
<li>
<a class="dropdown-item" href="#">
Item 4
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Item 5
</a>
<ul class="submenu dropdown-menu">
<li>
<a class="dropdown-item" href="#">
Second Level item1
</a>
</li>
<li>
<a class="dropdown-item" href="#">
Second Level item2
</a>
</li>
</ul>
</li>
</ul>
The code runs perfectly in the real application by adding a specific class.
Upvotes: 0
Views: 500
Reputation:
Add > to select direct child .navbar .nav-item:hover > .dropdown-menu
.navbar .nav-item:hover > .dropdown-menu{
display: block;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
To active submenu when hover dropdown-menu
.dropdown-menu li:hover>.submenu{
display: block;
background-color: #233d00;
}
Try this codepen Demo
nav {
vertical-align: middle;
text-align: center;
font-size: 12px;
background: #233d00 0% 0% no-repeat padding-box;
}
li:hover{background: #647e8f;}
@media all and (min-width: 992px) {
.navbar .nav-item:hover .nav-link {color: #fff;}
.navbar .nav-item:hover>.dropdown-menu{
display: block;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
.dropdown-item{color: #fff !important;}
.dropdown-menu li{position: relative;}
.nav-item .submenu{
display: none;
position: absolute;
left:100%;
top:-1px;
}
.dropdown-menu li:hover{ background-color: #f1f1f1 }
.dropdown-menu li:hover>.submenu{
display: block;
background-color: #233d00;
}
.dropdown-submenu li:hover > .dropdown-submenu{
display: block;
background-color: #233d00;
}
ul.dropdown-submenu {
list-style-type: '';
padding: 0;
}
}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" />
<body>
<nav class="navbar py-0 navbar-expand-lg navbar-dark" id="second-navbar">
<button class="navbar-toggler ml-auto" type="button" data-toggle="collapse" data-target="#main_nav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="main_nav">
<ul class="navbar-nav nav-fill w-100 nav-pills">
<li class="nav-item active"><a class="nav-link" href="#">First Level Item 1</a></li>
<li class="nav-item dropdown">
<a class="nav-link" href="#" data-toggle="dropdown">First Level Item 2</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">First Level Sub Item 1</a></li>
<li><a class="dropdown-item" href="#">First Level Sub Item 2</a></li>
<li><a class="dropdown-item" href="#">First Level Sub Item 3</a>
<ul class="submenu dropdown-menu">
<li><a class="dropdown-item" href="#">Second Level item1</a></li>
<li><a class="dropdown-item" href="#">Second Level item1</a></li>
<li><a class="dropdown-item" href="#">Second Level item1</a>
<ul class="submenu dropdown-menu">
<li><a class="dropdown-item" href="#">Third Level item1</a></li>
<li><a class="dropdown-item" href="#">Third Level item2</a></li>
<li><a class="dropdown-item" href="#">Third Level item3</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link" href="#" data-toggle="dropdown">First Level Item 3</a>
<ul class="submenu dropdown-menu">
<li><a class="dropdown-item" href="#">Submenu item 1</a></li>
<li><a class="dropdown-item" href="#">Submenu item 2</a></li>
</ul>
</li>
</ul>
</div>
</nav>
Take screen width greater than 992px to view navbar
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
</body>
Upvotes: 1
Reputation: 6348
As you are having different level, you must make different css setting:
.navbar li:hover ul{
display: block;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
.navbar li:hover ul li ul{
display: none;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
.navbar li ul li:hover ul{
display: block;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
.navbar li ul li:hover ul li ul{
display: none;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
.navbar li ul li ul li:hover ul{
display: block;
border-radius: 0;
background-color: #233d00;
position: absolute;
}
Upvotes: 1