169 votes

Menu déroulant avec Bootstrap - Le menu étend son conteneur alors qu'il ne devrait pas le faire

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éfilant, correctement, ne fait pas cela.

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 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
}

1 votes

Il fonctionne également pour Bootstrap V4

0 votes

Pour les BS 3, 4 et 4.5, voir cette réponse : stackoverflow.com/a/46891758/888472 car celui qui est accepté est obsolète.

429voto

Skelly Points 27772

Bootstrap 5 (mise à jour 2021)

Le balisage de la liste déroulante a été modifié pour BS 5, car l'étiquette de la liste déroulante a été modifiée. data- ont été remplacés par data-bs- . Cependant, la définition de la hauteur maximale fonctionne toujours pour rendre la liste déroulante défilable...

.dropdown-menu {
    max-height: 280px;
    overflow-y: auto;
}

https://codeply.com/p/shJzHGE84z

Bootstrap 4 (mise à jour 2018)

Le balisage de la liste déroulante a été modifié pour BS 4, car les éléments ont leur propre code d'accès. dropdown-item classe. Cependant, le réglage max-height fonctionne toujours pour rendre la liste déroulante déroulante...

.dropdown-menu {
    max-height: 280px;
    overflow-y: auto;
}

Déroulement de Bootstrap

Menu horizontal alternatif pour Bootstrap 4 à l'aide de flexbox


Bootstrap 3 (réponse originale)

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

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://codeply.com/p/ox7JC49vmT

7 votes

Si l'on préfère Plunker à Bootply, le voici : plnkr.co/edit/3VhYW1?p=preview

0 votes

La barre de défilement coupe une partie du texte. Je me demande quel est le moyen le plus propre d'augmenter la taille pour accueillir l'élément le plus large.

0 votes

Et si je veux un en-tête et un pied de page fixes dans le menu déroulant ?

68voto

TopDev Points 134

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

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

 </ul>

16voto

Brian LaLonde Points 11

Pour le CSS, j'ai trouvé que la hauteur maximale de 180 est meilleure pour les téléphones mobiles en paysage 320 lorsque le navigateur chrome est affiché.

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

De même, 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

3voto

Rajeshwar Reddy Points 41

Faites tout ce qui se trouve dans la ligne de la balise 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>

1voto

Jilani A Points 128

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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X