Bootstrap: posizione del menu a discesa rispetto all'elemento della barra di navigazione


108

Ho il seguente menu a discesa

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

L'angolo in alto a sinistra del menu a discesa si trova nell'angolo in basso a sinistra del testo (Azione), ma spero che la posizione dell'angolo in alto a destra del menu a discesa sia nella posizione in basso a destra del testo. Come lo posso fare?

Risposte:


229

Questo è l'effetto che stiamo cercando di ottenere:

Un menu allineato a destra

Le classi che devono essere applicate sono cambiate con il rilascio di Bootstrap 3.1.0 e di nuovo con il rilascio di Bootstrap 4. Se una delle soluzioni seguenti non sembra funzionare, ricontrolla il numero di versione di Bootstrap che stai importando e provane uno diverso.

Bootstrap 3

Prima della v3.1.0

Puoi usare la pull-rightclasse per allineare il lato destro del menu con il cursore:

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

Dopo la v3.1.0

A partire dalla v3.1.0, abbiamo deprecato .pull-right nei menu a discesa. Per allineare a destra un menu, usa .dropdown-menu-right. I componenti di navigazione allineati a destra nella barra di navigazione utilizzano una versione mista di questa classe per allineare automaticamente il menu. Per sovrascriverlo, usa .dropdown-menu-left.

Puoi usare la dropdown-rightclasse per allineare il lato destro del menu con il cursore:

<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

La classe per Bootstrap 4 è la stessa di Bootstrap> 3.1.0, fai attenzione perché il resto del markup circostante è leggermente cambiato:

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


1
Ho testato pull-right e pull-left nel sito Web RTL. Funzionano perfettamente, ma il menu a discesa a destra e il menu a discesa a sinistra no.
curioso 1

Il contenitore (.dropdown) deve avere una visualizzazione di "inline-bock". In questo esempio la LI va bene, ma se fosse un DIV l'allineamento sarebbe posto alla fine dell'elemento di blocco che è influenzato dalla larghezza del sottomenu.
Nicholas

Anche la classe "menu a discesa-destra" ha funzionato con Bootstrap 4 (beta). Grazie! "pull-right" non ha funzionato.
Andreas Vogl

usare è class="dropdown"stata la chiave per me per ottenere un corretto allineamento
Louis

50

Non sono sicuro di come altre persone risolvano questo problema o se Bootstrap abbia una configurazione per questo.

Ho trovato questo thread che fornisce una soluzione:

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

Uno dei post suggerisce l'uso di

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

Ho provato e funziona.

Spero di sapere se Bootstrap fornisce la configurazione per farlo, non tramite il css sopra.

Saluti.


1
grazie, questo ha funzionato per il menu a discesa bootstrap 4 in una barra di navigazione
Petru

20

Basato sul documento Bootstrap:

A partire dalla v3.1.0, .pull-right è deprecato nei menu a discesa. usa .drop-menu-right

per esempio:

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

1
Ho testato pull-right e pull-left nel sito Web RTL. Funzionano perfettamente, ma il menu a discesa a destra e il menu a discesa a sinistra no.
curioso1

10

Se vuoi visualizzare il menu in alto, aggiungi semplicemente
il "menu a discesa" della classe e rimuovi il "menu a discesa" della classe se esiste dallo stesso div.

<div class="btn-group dropup">

inserisci qui la descrizione dell'immagine


1
"Spero che la posizione dell'angolo in alto a destra del dropdwon sia nella posizione in basso a destra del testo" - OP
Joe Czucha

Non riesco a capire il tuo commento, scusa !!
Philip Enc

Sembra buono ma, come possiamo renderlo automatico? Come se avessi un elenco di dati e la parte inferiore non è sicura.
Santosh

2

Anche se è tardi spero di poter aiutare qualcuno. se il menu a discesa o il sottomenu è sul lato destro dello schermo è aperto sul lato sinistro, se il menu o il sottomenu è sulla sinistra è aperto sul lato destro.

$(".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);
    }

});

Per rilevare la posizione verticale puoi anche aggiungere

$( 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/


può essere regolato anche come sopra e sotto? se il collegamento a discesa è in fondo, vorrei aprirlo nella direzione superiore? Possiamo raggiungere questo obiettivo?
Santosh

1
Ho aggiornato la mia risposta per rilevare la posizione verticale?
JD11

1

Boostrap ha una classe per quella chiamata navbar-right. Quindi il tuo codice apparirà come segue:

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

0

Se vuoi centrare il menu a discesa, questa è la soluzione.

<ul class="dropdown-menu" style="right:auto; left: auto;">
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.