2015-06-24 16 views
8

Ho visto la documentazione per il menu a discesa as component e separately using javascript.Come aggiungere un singolo menu a discesa al corpo in Bootstrap

Mi chiedo se sia possibile aggiungere un singolo menu a discesa nel corpo del sito Web (posizionato in modo assoluto rispetto all'elemento pulsante cliccabile).

Perché?

  • Perché se ho una tabella con 500 righe non voglio aggiungere lo stesso elenco di 10 articoli 500 volte rendendo il codice HTML risultante più grande e più lento quando si tratta di JS.

  • Poiché l'elemento genitore può essere nascosto ma voglio ancora che il menu a discesa sia visibile finché non fa clic all'esterno sfocandolo.

ho trovato più persone asking for this feature ma non ho trovato nulla nella documentazione su di esso.

+0

Hai provato qualcosa? Un violino starter sarebbe utile. – isherwood

+0

Qualunque cosa proverei sarebbe un "hack". Sto "Mi chiedo se è possibile" con il bootstrap stesso. – Alvaro

risposta

14

Come dire il bootstrap documents, non ci sono opzioni per i menu a discesa ... Questo è triste, ma significa che attualmente non esiste una soluzione di "bootstrap" per la funzionalità desiderata. Vi è ora, tuttavia, una soluzione nel kit Angular-UI/Bootstrap se la si sta usando. Il ticket a cui si fa riferimento è chiuso perché era finalmente added to the Angular-UI a partire dal 15 luglio 2015.

Tutto quello che devi fare è 'Aggiungi dropdown-append-to-body all'elemento a discesa per aggiungere al menu a discesa interno al corpo. Questo è utile quando il pulsante a discesa è all'interno di un div con overflow: nascosto, e il menu sarebbe altrimenti nascosto. ' (reference)

<div class="btn-group" dropdown dropdown-append-to-body> 
    <button type="button" class="btn btn-primary dropdown-toggle" dropdown-toggle>Dropdown on Body <span class="caret"></span> 
    </button> 
    <ul class="dropdown-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 class="divider"></li> 
    <li><a href="#">Separated link</a></li> 
    </ul> 
</div> 

Spero che questo aiuti!


EDIT

Nel tentativo di rispondere a un'altra domanda SO, ho trovato una soluzione che funziona abbastanza bene, se non si sta utilizzando Angular-UI. Potrebbe essere "hacky", ma non rompere la funzionalità del menu di bootstrap, e sembra giocare bene con la maggior parte dei casi di utilizzo per cui l'ho usato.

Quindi lascerò un po 'di violini nel caso in cui qualcun altro lo veda ed è interessato. Il primo illustra il motivo per cui l'uso di un menu del corpo aggiunto potrebbe essere bello, il secondo mostra la soluzione di lavoro:

Problem FIDDLE

Il problema: un menu a discesa selezionare all'interno di un corpo pannello

<div class="panel panel-default"> 
    <div class="panel-body"> 
    <div class="btn-group"> 
     <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> 
     <span data-bind="label">Select One</span>&nbsp;<span class="caret"></span> 
     </button> 
     <ul class="dropdown-menu" role="menu"> 
     <li><a href="#">Item 1</a></li> 
     <li><a href="#">Another item</a></li> 
     <li><a href="#">This is a longer item that will not fit properly</a></li> 
     </ul> 
    </div> 
    </div> 
</div> 

Solution FIDDLE

(function() { 
    // hold onto the drop down menu            
    var dropdownMenu; 

    // and when you show it, move it to the body          
    $(window).on('show.bs.dropdown', function (e) { 

     // grab the menu   
     dropdownMenu = $(e.target).find('.dropdown-menu'); 

     // detach it and append it to the body 
     $('body').append(dropdownMenu.detach()); 

     // grab the new offset position 
     var eOffset = $(e.target).offset(); 

     // make sure to place it where it would normally go (this could be improved) 
     dropdownMenu.css({ 
      'display': 'block', 
       'top': eOffset.top + $(e.target).outerHeight(), 
       'left': eOffset.left 
     }); 
    }); 

    // and when you hide it, reattach the drop down, and hide it normally             
    $(window).on('hide.bs.dropdown', function (e) { 
     $(e.target).append(dropdownMenu.detach()); 
     dropdownMenu.hide(); 
    }); 
})(); 

EDIT Ho finalmente trovato dove ho trovato questa soluzione originariamente.Devo dare il merito di dove credit is due!

+0

Grazie per la risposta. [L'ho chiesto al forum sui problemi di bootstrap] (https://github.com/twbs/bootstrap/issues/17537) e ho ottenuto un replay abbastanza decente. Ho chiuso l'argomento ma l'hanno riaperto, quindi sembra che potrebbero prendere in considerazione di dargli un'occhiata! – Alvaro

+0

Capisco perché ne hai bisogno ora! La soluzione Angular-UI potrebbe non funzionare per quello allora ... ma la soluzione 'hacky' lo farà. E non dovrebbe rompere nulla. Spero che Bootstrap arrivi con il programma e ci dia quello che vogliamo! Sarebbe una bella caratteristica avere! – Jonathan

+0

Inoltre, l'utilizzo del menu di bootstrap per gli eventi contestuali è fluido! Dovrò ricordarlo per un uso futuro! – Jonathan

Problemi correlati