Reputation: 8408
After implementing a drop down menu within a bootstrap navigation bar, for some reason, the underline animation doesn't underline individual items within the drop down - it only underlines the very bottom. What should be done to fix this?
.navbar>navbar-brand {
color: black;
}
.navbar-default .navbar-nav>li>a {
color: black;
}
.navbar-default .navbar-nav>li>a:active,
.navbar-default .navbar-nav>li>a:focus {
background-color: black;
color: white;
}
.navbar-default ul li a:hover {
color: #000;
}
.navbar-default ul li a:hover:before {
width: 100%;
}
.navbar-default ul li a:before {
content: '';
display: block;
position: absolute;
left: 0;
bottom: 0;
height: 3px;
width: 0;
background: #000;
-webkit-transition: width .25s;
-moz-transition: width .25s;
-ms-transition: width .25s;
-o-transition: width .25s;
transition: width .25s;
}
.navbar-default ul li.last>a:after,
#cssmenu ul li:last-child>a:after {
display: none;
}
@media screen and (max-width: 768px) {
.navbar-default ul li {
float: none;
width: 100%;
}
.navbar-default ul li a {
width: 100%;
line-height: 2em;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.navbar-default ul li a:after {
display: none;
}
.navbar-default ul li a:before {
height: 1px;
background: #000;
width: 100%;
opacity: .2;
}
.navbar-default ul li.last>a:before,
.navbar-default ul li:last-child>a:before {
display: none;
}
}
@media screen and (min-width: 768px) {
#myNavbar ul:not(.dropdown-menu) {
display: flex;
flex-wrap: wrap;
zoom: 1;
}
#myNavbar ul li {
flex-grow: 1;
}
#myNavbar ul li a {
text-align: left;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Hello World</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav flex-row">
<li><a href="#">Link A</a></li>
<li><a href="#">Link B</a></li>
<li><a href="#">Link C</a></li>
<li><a href="#">Link D</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Link E <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Link E.1</a></li>
<li><a href="#">Link E.2</a></li>
<li><a href="#">Link E.3</a></li>
<li><a href="#">Link E.4</a></li>
</ul>
</li>
<li><a href="#">Link F</a></li>
<li><a href="#">Link G</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Link H <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Link H.1</a></li>
<li><a href="#">Link H.2</a></li>
</ul>
</li>
<li><a href="#">Link I</a></li>
<li><a href="#">Link J</a></li>
</ul>
</div>
</div>
</nav>
Upvotes: 1
Views: 113
Reputation: 43574
At the moment the animation is absolutely positioned to the <ul>
element. So it is only visible on the bottom of the <ul>
element (bottom:0
). You need to set position: relative
to the <li>
or <a>
element so the animation is absolutely positioned to the menu items.
So you can add the following CSS to fix the issue:
.navbar-default ul li a {
position:relative;
}
See the following solution:
.navbar>navbar-brand {
color: black;
}
.navbar-default .navbar-nav>li>a {
color: black;
}
.navbar-default .navbar-nav>li>a:active,
.navbar-default .navbar-nav>li>a:focus {
background-color: black;
color: white;
}
.navbar-default ul li a {
position:relative;
}
.navbar-default ul li a:hover {
color: #000;
}
.navbar-default ul li a:hover:before {
width: 100%;
}
.navbar-default ul li a:before {
content: '';
display: block;
position: absolute;
left: 0;
bottom:0;
height: 3px;
width: 0;
background: #000;
-webkit-transition: width .25s;
-moz-transition: width .25s;
-ms-transition: width .25s;
-o-transition: width .25s;
transition: width .25s;
}
.navbar-default ul li.last>a:after,
#cssmenu ul li:last-child>a:after {
display: none;
}
@media screen and (max-width: 768px) {
.navbar-default ul li {
float: none;
width: 100%;
}
.navbar-default ul li a {
width: 100%;
line-height: 2em;
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
}
.navbar-default ul li a:after {
display: none;
}
.navbar-default ul li a:before {
height: 1px;
background: #000;
width: 100%;
opacity: .2;
}
.navbar-default ul li.last>a:before,
.navbar-default ul li:last-child>a:before {
display: none;
}
}
@media screen and (min-width: 768px) {
#myNavbar ul:not(.dropdown-menu) {
display: flex;
flex-wrap: wrap;
zoom: 1;
}
#myNavbar ul li {
flex-grow: 1;
}
#myNavbar ul li a {
text-align: left;
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<nav class="navbar navbar-default">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#myNavbar" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Hello World</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav flex-row">
<li><a href="#">Link A</a></li>
<li><a href="#">Link B</a></li>
<li><a href="#">Link C</a></li>
<li><a href="#">Link D</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Link E <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Link E.1</a></li>
<li><a href="#">Link E.2</a></li>
<li><a href="#">Link E.3</a></li>
<li><a href="#">Link E.4</a></li>
</ul>
</li>
<li><a href="#">Link F</a></li>
<li><a href="#">Link G</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Link H <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Link H.1</a></li>
<li><a href="#">Link H.2</a></li>
</ul>
</li>
<li><a href="#">Link I</a></li>
<li><a href="#">Link J</a></li>
</ul>
</div>
</div>
</nav>
Upvotes: 1
Reputation: 2516
Its because you have not assigned position:relative to the individual items of the dropdown. Try adding this CSS code.
.navbar-default ul li {
position: relative;
}
Upvotes: 0