Menu déroulant avec Bootstrap - Menu développant son conteneur alors qu'il ne devrait pas

138

J'ai essayé cette méthode ( leur violon ) pour activer le menu déroulant avec Bootstrap, mais avec cette approche, le menu déroulant étend son conteneur - violon - le menu non déroulant, correctement, ne le fait pas.

Comment puis-je réparer cela? Les suggestions sur d'autres approches compatibles avec Bootstrap sont également appréciées!


Pour référence, voici le code HTML du violon de la première méthode:

<ul class="nav">
    <li class="dropdown">
        <a class="icon-key icon-white" data-toggle="dropdown" href="#" style=
        "font-weight: bold"></a>

        <div class="dropdown-menu" style="margin-left: 2em">
            <ul class="dropdown-menu">
                <!-- static non-scrollable menu header 1 -->
            </ul>
        </div>

        <div class="dropdown-menu" style="margin-left: 2em">
            <ul class="dropdown-menu">
                <li class="disabled">
                    <a href="#"><i class="icon-group"></i> <b>My Groups</b></a>
                </li>

                <li>
                    <div class="dropdown-menu scroll-menu scroll-menu-2x"
                    style="margin-left: 2em">
                        <ul class="dropdown-menu scroll-menu scroll-menu-2x">
                            <li>
                                <a href="#">User</a>
                            </li>

                            <li>
                                <a href="#">Administrators</a>
                            </li>

                            <li>
                                <a href="#">Some Other Group</a>
                            </li>
                        </ul>
                    </div>

                    <ul class="dropdown-menu scroll-menu scroll-menu-2x">
                        <!-- Additional menu items omitted for brevity -->
                    </ul>
                </li>
            </ul>
        </div>

        <div class="dropdown-menu" style="margin-left: 2em">
            <ul class="dropdown-menu">
                <!-- static non-scrollable menu header 2 -->
            </ul>
        </div>

        <div class="dropdown-menu" style="margin-left: 2em">
            <ul class="dropdown-menu">
                <li class="disabled">
                    <a href="#"><i class="icon-user"></i> <b>My Roles</b></a>
                </li>

                <li>
                    <div class="dropdown-menu scroll-menu scroll-menu-2x"
                    style="margin-left: 2em">
                        <ul class="dropdown-menu scroll-menu scroll-menu-2x">
                            <li>
                                <a href="#">Core Users</a>
                            </li>

                            <li>
                                <a href="#">Admin</a>
                            </li>

                            <li>
                                <a href="#">Some Other Role</a>
                            </li>
                        </ul>
                    </div>

                    <ul class="dropdown-menu scroll-menu scroll-menu-2x">
                        <!-- Additional menu items omitted for brevity -->
                    </ul>
                </li>
            </ul>
        </div>

        <div class="dropdown-menu" style="margin-left: 2em">
            <ul class="dropdown-menu">
                <!-- static non-scrollable menu footer -->
            </ul>
        </div>

        <ul class="dropdown-menu">
            <li class="disabled">
                <a href="#"><i class="icon-chevron-up pull-left"></i> <i class="icon-chevron-up pull-right"></i></a>
            </li>
        </ul>
    </li>
</ul>

Et le CSS:

/* So we wont impact the original bootstrap menu or it's pseudo call-out
arrow the menu is wrapped in a sub dropdown-menu with a chained scroll-menu */
ul.scroll-menu {
    position:relative;
    display:inherit!important;
    overflow-x:auto;
    -webkit-overflow-scrolling:touch;
    -moz-overflow-scrolling:touch;
    -ms-overflow-scrolling:touch;
    -o-overflow-scrolling:touch;
    overflow-scrolling:touch;
    top:0!important;
    left:0!important;
    width:100%;
    height:auto;
    max-height:500px;
    margin:0;
    border-left:none;
    border-right:none;
    -webkit-border-radius:0!important;
    -moz-border-radius:0!important;
    -ms-border-radius:0!important;
    -o-border-radius:0!important;
    border-radius:0!important;
    -webkit-box-shadow:none;
    -moz-box-shadow:none;
    -ms-box-shadow:none;
    -o-box-shadow:none;
    box-shadow:none
}
eliashdezr
la source
1
Cela fonctionne également pour Bootstrap V4
Tes3awy

Réponses:

357

Je pense que vous pouvez simplifier cela en ajoutant simplement les propriétés CSS nécessaires à votre classe de menu déroulant spécial.

CSS:

.scrollable-menu {
    height: auto;
    max-height: 200px;
    overflow-x: hidden;
}

HTML

       <ul class="dropdown-menu scrollable-menu" role="menu">
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
          <li><a href="#">Something else here</a></li>
          <li><a href="#">Action</a></li>
            ..
          <li><a href="#">Action</a></li>
          <li><a href="#">Another action</a></li>
       </ul>

Exemple de travail: https://www.bootply.com/86116

Bootstrap 4

Un autre exemple pour Bootstrap 4 utilisant flexbox

Zim
la source
6
Si l'on préfère Plunker à Bootply, le voici: plnkr.co/edit/3VhYW1?p=preview
tanguy_k
La barre de défilement coupe une partie du texte. Je me demande quelle est la manière la plus propre d'augmenter la taille pour accueillir l'élément le plus large.
lintmouse
et si je veux un en-tête et des pieds de page fixes dans le menu déroulant
Innovation
15
J'ai utilisé max-height: 100vh pour donner une hauteur de 100%
Rob Sedgwick
Solution très élégante et super simple. +1
Gianluca Ghettini
50

Vous pouvez utiliser la classe CSS intégrée pré-défilable dans bootstrap 3 à l'intérieur de l'élément span de la liste déroulante et cela fonctionne immédiatement sans implémenter de css personnalisé.

 <ul class="dropdown-menu pre-scrollable">
                <li>item 1 </li>
                <li>item 2 </li>

 </ul>
Adrian Hedley
la source
13

Pour CSS, j'ai trouvé qu'une hauteur maximale de 180 est meilleure pour le paysage de téléphones mobiles 320 lors de l'affichage du chrome du navigateur.

.scrollable-menu {
    height: auto;
    max-height: 180px;
    overflow-x: hidden;
}

Aussi, pour ajouter des barres de défilement visibles, ce CSS devrait faire l'affaire:

.scrollable-menu::-webkit-scrollbar {
    -webkit-appearance: none;
    width: 4px;        
}    
.scrollable-menu::-webkit-scrollbar-thumb {
    border-radius: 3px;
    background-color: lightgray;
    -webkit-box-shadow: 0 0 1px rgba(255,255,255,.75);        
}

Les changements sont reflétés ici: https://www.bootply.com/BhkCKFEELL

blond
la source
1

Faites tout dans la ligne du tag UL

<ul class="dropdown-menu scrollable-menu" role="menu" style="height: auto;max-height: 200px; overflow-x: hidden;">
                <li><a href="#">Action</a></li>
                <li><a href="#">Another action</a></li>
                <li><a href="#">Something else here</a></li>
                <li><a href="#">Action</a></li>
                ..
                <li><a href="#">Action</a></li>
                <li><a href="#">Another action</a></li>
            </ul>
Rajeshwar Reddy
la source
1

Je viens de résoudre ce problème dans mon projet-

Code CSS

.scroll-menu{
   min-width: 220px;
   max-height: 90vh;
   overflow: auto;
 }

Code HTML

<ul class="dropdown-menu scroll-menu" role="menu">
   <li><a href="#">Action</a></li>
   <li><a href="#">Another action</a></li>
   <li><a href="#">Something else here</a></li>
   <li><a href="#">Action</a></li>
   ..
   <li><a href="#">Action</a></li>
   <li><a href="#">Another action</a></li>
</ul>
Jilani A
la source
0

j'espère que ce code fonctionne bien, essayez ceci.

ajouter un fichier css.

.scrollbar {
    height: auto;
    max-height: 180px;
    overflow-x: hidden;
}

Code HTML:

<div class="col-sm-2  scrollable-menu" role="menu">
    <div>
   <ul>
  <li><a class="active" href="#home">Tutorials</a></li>
  <li><a href="#news">News</a></li>
  <li><a href="#contact">Contact</a></li>
  <li><a href="#about">About</a></li>
  <li><a href="#news">News</a></li>
  <li><a href="#contact">Contact</a></li>
  <li><a href="#about">About</a></li>
  <li><a href="#news">News</a></li>
  <li><a href="#contact">Contact</a></li>
  <li><a href="#about">About</a></li>
  <li><a href="#news">News</a></li>
  <li><a href="#contact">Contact</a></li>
  <li><a href="#about">About</a></li>
  <li><a href="#news">News</a></li>
  <li><a href="#contact">Contact</a></li>
  <li><a href="#about">About</a></li>

    </ul>
   </div>
   </div>
Darshak Malvi
la source