Jak mogę wyrenderować pole wyboru listy (menu rozwijane) za pomocą bootstrap?


206

Czy jest coś z pudełka, co obsługuje bootstrap, aby renderować „standardowe” pole wyboru listy rozwijanej defacto? To znaczy, gdzie w rozwijanym polu znajduje się lista wartości, a jeśli wybrano, wypełnij zawartość pola listy?

Coś podobnego do tej funkcjonalności?

http://bootstrapformhelpers.com/select/

wprowadź opis zdjęcia tutaj


20
Czy masz na myśli - getbootstrap.com/css/#forms-controls (under Selects )?
cheersjosh,

Tak działa normalny wybór. Jest to lista opcji, wybierz jedną i które stają się wartością. Czym różni się to, o co pytasz?
Burhan Khalid

1
Teraz zastanawiam się, jak mogę zastąpić tę wymyślnie wyglądającą ikonę rozwijaną ładnym wyglądem. :)
genxgeek,

1
From getbootstrap.com: Unikaj używania tutaj elementów <select>, ponieważ nie można ich w pełni stylizować w przeglądarkach WebKit.
stuartdotnet

14
Nie podoba mi się pomysł zignorowania rodzimej kontroli ze względu na ramy wizualne. Jestem naprawdę zaskoczony, że bootstrap nie ma lepszego rozwiązania <select>. podczas gdy bootstrap wykorzystuje <ul>do rozwijania, jest to ostatecznie wprowadzające w błąd użycie tego tagu. Biorąc pod uwagę całą pompę JQuery w bootstrapie, zastanawiam się, dlaczego nie zmienili karetki wyboru. Wydawałoby się to o wiele bardziej wdzięcznym rozwiązaniem niż sprzeniewierzenie ul.
Jay Edwards

Odpowiedzi:


425

Bootstrap 3 wykorzystuje .form-controlklasę do stylowania komponentów formularza.

<select class="form-control">
    <option value="one">One</option>
    <option value="two">Two</option>
    <option value="three">Three</option>
    <option value="four">Four</option>
    <option value="five">Five</option>
</select>

http://getbootstrap.com/css/#forms-controls


Znalazłem się tutaj, ponieważ potrzebowałem wyglądu Wiązu bez użycia bootstrap.js. Kluczową różnicą wizualną między tym a „pełnym” rozwiązaniem bootstrap (o którym wspomina @JonathanEdwards) jest to, że menu, które się pojawia, jest bardziej obskurne, mniej ładne, jak alertpole przeglądarki. Naprawdę mały problem. Jednak niewybrany selektor wygląda dokładnie tak samo jak selektor Bootstrap.
Robert

38

Inną opcją jest sprawienie, aby rozwijane menu Bootstrap zachowywało się jak zaznaczenie za pomocą jQuery ...

$(".dropdown-menu li a").click(function(){
  var selText = $(this).text();
  $(this).parents('.btn-group').find('.dropdown-toggle').html(selText+' <span class="caret"></span>');
});

http://www.bootply.com/b4NKREUPkN


4
Przydatne, gdy nie chcesz formularza. Dzięki.
Jorge Leitao

11

Ładna i łatwa odpowiedź Skelly jest teraz nieaktualna wraz ze zmianami w składni rozwijanej w Bootstap. Zamiast tego użyj tego:

$(".dropdown-menu li a").click(function(){
  var selText = $(this).text();
  $(this).parents('.form-group').find('button[data-toggle="dropdown"]').html(selText+' <span class="caret"></span>');
});

11

Test: http://jsfiddle.net/brynner/hkwhaqsj/6/

HTML

<div class="input-group-btn select" id="select1">
    <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-expanded="false"><span class="selected">One</span> <span class="caret"></span></button>
    <ul class="dropdown-menu option" role="menu">
        <li id="1"><a href="#">One</a></li>
        <li id="2"><a href="#">Two</a></li>
    </ul>
</div>

jQuery

$('body').on('click','.option li',function(){
    var i = $(this).parents('.select').attr('id');
    var v = $(this).children().text();
    var o = $(this).attr('id');
    $('#'+i+' .selected').attr('id',o);
    $('#'+i+' .selected').text(v);
});

CSS

.select button {width:100%; text-align:left;}
.select .caret {position:absolute; right:10px; margin-top:10px;}
.select:last-child>.btn {border-top-left-radius:5px; border-bottom-left-radius:5px;}
.selected {padding-right:10px;}
.option {width:100%;}

Użyj klasy „min-width” w klasie „.select button” zgodnie z tym, czego potrzebujesz.
Brynner Ferreira

11

Inną opcją może być użycie wyboru bootstrap . Własnymi słowami:

Niestandardowy wybór / wybór wielokrotny dla Bootstrap za pomocą menu rozwijanego przycisku, zaprojektowany tak, aby zachowywał się jak zwykłe selekcje Bootstrap.


1
Robi dokładnie to, co mówi i jest dostępny przez cdn.
scharfmn

5

Innym sposobem bez korzystania z .form-control jest:

  $(".dropdown-menu li a").click(function(){
        $(this).parents(".btn-group").find('.btn').html($(this).text() + ' <span class="caret"></span>');
        $(this).parents(".btn-group").find('.btn').val($(this).data('value'));
      });

$(".dropdown-menu li a").click(function(){
  $(this).parents(".btn-group").find('.btn').html($(this).text() + ' <span class="caret"></span>');
  $(this).parents(".btn-group").find('.btn').val($(this).data('value'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<link href="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="http://netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>


<div class="btn-group">
  <button  type="button" class="btn btn-info dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                  Test <span class="caret"> </span>
  </button>
  <ul class="dropdown-menu">
    <li><a href='#'>test 1</a></li>
    <li><a href='#'>test 2</a></li>
    <li><a href='#'>test 3</a></li>
  </ul>
</div>


3

Kod Bena wymaga, aby div nadrzędny miał klasę form-group (użyłem btn-group), jest to nieco inna wersja, która szuka najbliższego div i może być nawet nieco szybsza.

$(".dropdown-menu li a").click(function(){
    var selText = $(this).text();
    $(this).closest('div').find('button[data-toggle="dropdown"]').html(selText + ' <span class="caret"></span>');
});

1

Bootstrap3 .form-controljest fajny, ale dla tych, którzy kochają lub potrzebują rozwijanego menu z opcją przycisku i ul, oto zaktualizowany kod. Edytowałem kod przez Steve'a, aby naprawić przeskakiwanie do linku mieszającego i zamykanie menu rozwijanego po zaznaczeniu.

Dzięki Steve, Ben i Skelly!

$(".dropdown-menu li a").click(function () {
    var selText = $(this).text();
    $(this).closest('div').find('button[data-toggle="dropdown"]').html(selText + ' <span class="caret"></span>');
    $(this).closest('.dropdown').removeClass("open");
    return false;
});

1

Obecnie walczę z listami rozwijanymi i chciałbym podzielić się swoimi doświadczeniami:

Istnieją szczególne sytuacje, w których <select>nie można ich użyć i należy je „emulować” za pomocą menu rozwijanego.

Na przykład, jeśli chcesz utworzyć grupy wejściowe ładowania początkowego, takie jak Przyciski z listami rozwijanymi (patrz http://getbootstrap.com/components/#input-groups-buttons-dropdowns ). Niestety <select>nie jest obsługiwany w grupach wejściowych, nie będzie poprawnie renderowany.

Czy ktoś już to rozwiązał? Byłbym bardzo zainteresowany rozwiązaniem.

I aby uczynić to jeszcze bardziej skomplikowanym, nie możesz użyć tak po prostu, $(this).text()aby złapać tego, który użytkownik wybrał w menu rozwijanym, jeśli używasz glypiconów lub czcionek niesamowite ikony jako zawartość do rozwijania. Na przykład: <li id="someId"><a href="#0"><i class="fa fa-minus"></i></a></li> Ponieważ w tym przypadku nie ma tekstu, a jeśli go dodasz, zostanie on również wyświetlony w rozwijanym elemencie i jest to niepożądane.

Znalazłem dwa możliwe rozwiązania:

1) Użyj, $(this).html()aby uzyskać zawartość wybranego <li>elementu, a następnie ją zbadać, ale dostaniesz coś takiego, <a href="#0"><i class="fa fa-minus"></i></a>więc musisz się tym pobawić, aby wyodrębnić to, czego potrzebujesz.

2) Wykorzystanie $(this).text()i ukryć tekst w elemencie w ukrytym rozpiętości: <li id="someId"><a href="#0"><i class="fa fa-minus"><span class="hidden">text</span></i></a></li>. Dla mnie jest to proste i eleganckie rozwiązanie, możesz umieścić dowolny potrzebny tekst, tekst zostanie ukryty i nie musisz wykonywać żadnych transformacji $(this).html()wyniku, jak w opcji 1), aby uzyskać to, czego potrzebujesz.

Mam nadzieję, że to jasne i może komuś pomóc :-)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.