Bootstrap: Position of dropdown menu relative to navbar item

250,636

Solution 1

This is the effect that we're trying to achieve:

A right-aligned menu

The classes that need to be applied changed with the release of Bootstrap 3.1.0 and again with the release of Bootstrap 4. If one of the below solutions doesn't seem to be working double check the version number of Bootstrap that you're importing and try a different one.

Before v3.1.0

You can use the pull-right class to line the right hand side of the menu up with the caret:

<li class="dropdown">
  <a class="dropdown-toggle" href="#">Link</a>
  <ul class="dropdown-menu pull-right">
     <li>...</li>
  </ul>
</li>

Fiddle: http://jsfiddle.net/joeczucha/ewzafdju/

After v3.1.0

As of v3.1.0, we've deprecated .pull-right on dropdown menus. To right-align a menu, use .dropdown-menu-right. Right-aligned nav components in the navbar use a mixin version of this class to automatically align the menu. To override it, use .dropdown-menu-left.

You can use the dropdown-right class to line the right hand side of the menu up with the caret:

<li class="dropdown">
  <a class="dropdown-toggle" href="#">Link</a>
  <ul class="dropdown-menu dropdown-menu-right">
     <li>...</li>
  </ul>
</li>

Fiddle: http://jsfiddle.net/joeczucha/1nrLafxc/

Bootstrap 4

The class for Bootstrap 4 are the same as Bootstrap > 3.1.0, just watch out as the rest of the surrounding markup has changed a little:

<li class="nav-item dropdown">
  <a class="nav-link dropdown-toggle" href="#">
    Link
  </a>
  <div class="dropdown-menu dropdown-menu-right">
    <a class="dropdown-item" href="#">...</a>
  </div>
</li>

Fiddle: https://jsfiddle.net/joeczucha/f8h2tLoc/

Bootstrap 5

Again, very similar for Bootstrap 5 except now it's dropdown-menu-end

<li class="nav-item dropdown">
  <a class="nav-link dropdown-toggle" href="#">
    Link
  </a>
  <div class="dropdown-menu dropdown-menu-end">
    <a class="dropdown-item" href="#">...</a>
  </div>
</li>

Fiddle: https://jsfiddle.net/joeczucha/psnz2u36/

Solution 2

Not sure about how other people solve this problem or whether Bootstrap has any configuration for this.

I found this thread that provides a solution:

https://github.com/twbs/bootstrap/issues/1411

One of the post suggests the use of

<ul class="dropdown-menu" style="right: 0; left: auto;">

I tested and it works.

Hope to know whether Bootstrap provides config for doing this, not via the above css.

Cheers.

Solution 3

Based on Bootstrap doc:

As of v3.1.0, .pull-right is deprecated on dropdown menus. use .dropdown-menu-right

eg:

<ul class="dropdown-menu dropdown-menu-right" role="menu" aria-labelledby="dLabel">

Solution 4

If you want to display the menu up, just add the class "dropup"
and remove the class "dropdown" if exists from the same div.

<div class="btn-group dropup">

enter image description here

Solution 5

Even if it s late i hope i can help someone. if dropdown menu or submenu is on the right side of screen it's open on the left side, if menu or submenu is on the left it's open on the right side.

$(".dropdown-toggle").on("click", function(event){//"show.bs.dropdown"
    var liparent=$(this.parentElement);
    var ulChild=liparent.find('ul');
    var xOffset=liparent.offset().left;
    var alignRight=($(document).width()-xOffset)<xOffset;


    if (liparent.hasClass("dropdown-submenu"))
    {
        ulChild.css("left",alignRight?"-101%":"");
    }
    else
    {                
        ulChild.toggleClass("dropdown-menu-right",alignRight);
    }

});

To detect vertical position you can also add

$( document ).ready(function() {
        var liparent=$(".dropdown");
    var yOffset=liparent.offset().top;
        var toTop=($(document).height()-yOffset)<yOffset;
    liparent.toggleClass("dropup",toTop);
});

https://jsfiddle.net/jd1100/rf9zvdhg/28/

Share:
250,636

Related videos on Youtube

curious1
Author by

curious1

Updated on July 08, 2022

Comments

  • curious1
    curious1 almost 2 years

    I have the following dropdown

    <label class="dropdown-toggle" role="button" data-toggle="dropdown" data-target="#">
        Action <b class="caret"></b></label>
    <ul class="dropdown-menu" role="menu" aria-labelledby="lang-selector" id="lang-selector">
        dropdown content goes here
    </ul>
    

    The upper-left corner of the dropdown is at the lower-left corner of the text (Action), but I hope that the position of the upper-right corner of the dropdwon is at the lower-right place of the text. How can I do that?

  • curious1
    curious1 over 9 years
    I tested pull-right and pull-left in RTL website. They work perfect, but dropdown-menu-right and dropdown-menu-left not.
  • curious1
    curious1 over 9 years
    I tested pull-right and pull-left in RTL website. They work perfect, but dropdown-menu-right and dropdown-menu-left not.
  • Joe Czucha
    Joe Czucha over 7 years
    "I hope that the position of the upper-right corner of the dropdwon is at the lower-right place of the text" -- OP
  • Philip Enc
    Philip Enc over 7 years
    I cant understand you comment, sorry!!
  • Nicholas
    Nicholas over 6 years
    The container (.dropdown) must have a display of "inline-bock". In this example the LI is fine, but if it were a DIV the alignment would be placed at the end of the block element which is influenced by the submenu width.
  • Andreas Vogl
    Andreas Vogl over 6 years
    The class "dropdown-menu-right" did the trick with Bootstrap 4 (beta) as well. Thanks! "pull-right" did not work.
  • Louis
    Louis about 6 years
    using class="dropdown" was the key for me in order to get a proper alignment
  • Santosh
    Santosh about 5 years
    can it be adjusted like top and bottom too ? if the dropdown link is at the bottom then I would like to open it to the top direction ? Can we achieve this ?
  • Santosh
    Santosh about 5 years
    It looks good but, how can we make it automatic ? Like i have list of data and the bottom part is not sure.
  • JD11
    JD11 about 5 years
    I have updated my answer to detect vertical position?
  • TYPO3UA
    TYPO3UA about 3 years
    How to do it not relatively side of screen and relatively side of block (div)? for example: <div class="card-body"> <div class="btn-group"> <button type="button" class="btn btn-link" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Action</button> <div class="dropdown-menu"> <span class="text-nowrap">Name</span><br><a href="#">Namber</a> </div> </div> </div>
  • Jaco Pretorius
    Jaco Pretorius over 2 years
    With Bootstrap 5 it's the same as Bootstrap 4, except you would use dropdown-menu-end instead of dropdown-menu-right