wbk727
wbk727

Reputation: 8408

Bootstrap dropdown menu not underling individual item on hover

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

Answers (2)

Sebastian Brosch
Sebastian Brosch

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

Aryan Twanju
Aryan Twanju

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

Related Questions