2

I'm newbie to css and bootstrap and can not figure out how to solve this. Any help are welcome.

I have two problems with my code.

1) When I click on the 'Welcome, User' menu in small screens (mobile), the dropdown menu opens inside the navigation bar, distorting the bar and changing its height. I want it to behave in the same way as on larger screens (desktops, for example). When I click, I want it to open the menu items without changing the navigation bar, in front of the navigation bar but not inside.

2) Another problem: even on larger screens, I can not see the menu items completely. Some of the text of the items is hidden at the edge of the screen. I would like the menu to appear completely on the screen, no matter if it is desktop or mobile.

To make it clear, I record a very small video demonstrating the problem: https://puu.sh/Bq34w/ac56908be0.mp4

The complete code: https://jsfiddle.net/fredslz/0v7qwjdm/12/

<!doctype html>
<html lang="en">
<body class="text-center">

<nav class="navbar navbar-expand-md navbar-light fixed-top" style="background-color: #FFFFFF;">

        <button class="navbar-toggler navbar-nav mr-auto" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
              <span class="navbar-toggler-icon"></span> 
        </button>

        <a class="navbar-brand mx-auto" href="#">My Brand</a>

        <ul class="nav navbar-nav ml-md--auto"> 

                <li class="dropdown"> 

                    <a href="#" class="nav-link dropdown-toggle" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false"> 
                            Welcome, User <b class="caret"></b>
                        </a>

                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                                <a class="dropdown-item" href="#">Action</a>
                                <a class="dropdown-item" href="#">Another action</a>
                                <div class="dropdown-divider"></div>
                                <a class="dropdown-item" href="#">Something else here</a>
                        </div>

                </li> 
        </ul>



</nav>



</body>
</html>

And the CSS:

.navbar {
   -webkit-box-shadow: 0 8px 6px -6px #999;
   -moz-box-shadow: 0 8px 6px -6px #999;
   box-shadow: 0 8px 6px -6px #999;
}
kukkuz
  • 41,512
  • 6
  • 59
  • 95

2 Answers2

3

You need to use dropdown-menu-right on the dropdown if you want the menu items properly aligned.

What's not clear is why you're using the toggler, because you don't have any collapsible menu items (navbar-collapse). Just remove the toggler and use navbar-expand so that the Navbar doesn't collapse in the mobile view.

<nav class="navbar navbar-expand navbar-light fixed-top" style="background-color: #FFFFFF;">
    <a class="navbar-brand mx-auto" href="#">My Brand</a>
    <ul class="nav navbar-nav">
        <li class="dropdown">
            <a href="#" class="nav-link dropdown-toggle" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false"> 
                Welcome, User <b class="caret"></b>
            </a>
            <div class="dropdown-menu dropdown-menu-right">
                <a class="dropdown-item" href="#">Action</a>
                <a class="dropdown-item" href="#">Another action</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="#">Something else here</a>
            </div>
        </li>
    </ul>
</nav>

https://www.codeply.com/go/j1HZLEdyrC

The dropdown will always open inside the mobile collapsed Navbar which is by-design. If you do want to keep the mobile toggler, and intend to add collapsible items, you can use position-absolute on the dropdown-menu to override the default behavior.

<nav class="navbar navbar-expand-md navbar-light" style="background-color: #FFFFFF;">
    <button class="navbar-toggler navbar-nav mr-auto" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
        <span class="navbar-toggler-icon"></span> 
    </button>
    <a class="navbar-brand mx-auto" href="#">My Brand</a>
    <ul class="nav navbar-nav">
        <li class="dropdown">
            <a href="#" class="nav-link dropdown-toggle" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false"> 
                Welcome, User <b class="caret"></b>
            </a>
            <div class="dropdown-menu dropdown-menu-right position-absolute" aria-labelledby="navbarDropdown">
                <a class="dropdown-item" href="#">Action</a>
                <a class="dropdown-item" href="#">Another action</a>
                <div class="dropdown-divider"></div>
                <a class="dropdown-item" href="#">Something else here</a>
            </div>
        </li>
    </ul>
</nav>

Demo of both options: https://www.codeply.com/go/j1HZLEdyrC


Related: Bootstrap 4 Navbar Dropdown Menu Items Right

Carol Skelly
  • 351,302
  • 90
  • 710
  • 624
  • 1
    Perfect, thank you so much. You answered first because of that you are the accepted solution. I liked your solution because I just add class, I don´t need any change in my css file. – Frederico Augusto Sep 05 '18 at 12:59
0

For the issue with the mobile dropdown, you can use this to position it absolutely in the mobile view too:

.navbar-nav .dropdown-menu {
  position: absolute;
}

For the alignment of the dropdown, just add the class dropdown-menu-right to your dropdown-menu.

See demo below (I have given !important to cope with the cascading order in the snippet) and working fiddle here:

.navbar {
  -webkit-box-shadow: 0 8px 6px -6px #999;
  -moz-box-shadow: 0 8px 6px -6px #999;
  box-shadow: 0 8px 6px -6px #999;
  /* the rest of your styling */
}

.navbar-nav .dropdown-menu {
  position: absolute !important;
}
<script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.js"></script>
<link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"></script>
<script type="text/javascript" src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"></script>


<nav class="navbar navbar-expand-md navbar-light fixed-top" style="background-color: #FFFFFF;">

  <button class="navbar-toggler navbar-nav mr-auto" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
                  <span class="navbar-toggler-icon"></span> 
            </button>

  <a class="navbar-brand mx-auto" href="#">My Brand</a>

  <ul class="nav navbar-nav ml-md--auto">

    <li class="dropdown">

      <a href="#" class="nav-link dropdown-toggle" id="navbarDropdown" data-toggle="dropdown" aria-expanded="false"> 
                                Welcome, User <b class="caret"></b>
                            </a>

      <div class="dropdown-menu  dropdown-menu-right" aria-labelledby="navbarDropdown">
        <!-- ADDED CLASS -->
        <a class="dropdown-item" href="#">Action</a>
        <a class="dropdown-item" href="#">Another action</a>
        <div class="dropdown-divider"></div>
        <a class="dropdown-item" href="#">Something else here</a>
      </div>

    </li>
  </ul>
</nav>
kukkuz
  • 41,512
  • 6
  • 59
  • 95