Dokonaj wielokrotnego wyboru, aby dostosować wysokość i dopasować opcje bez paska przewijania

104

Najwyraźniej to nie działa:

   select[multiple]{
     height: 100%;
   }

sprawia, że ​​zaznaczenie ma 100% wysokości strony ...

auto też nie działa, nadal pojawia się pionowy pasek przewijania.

Jakieś inne pomysły?

wprowadź opis obrazu tutaj

Alex
źródło
1
Myślę, że utknąłeś z używaniem javascript. Nie wierzę, że istnieje sposób, aby pole wyboru automatycznie rozciągało tylko css, aby zawierało zawartość.
random_user_name
Czyste rozwiązanie CSS: stackoverflow.com/a/55969271/7910454
leonheess

Odpowiedzi:

148

Myślę, że możesz użyć sizeatrybutu. Działa we wszystkich najnowszych przeglądarkach.

<select name="courses" multiple="multiple" size="30" style="height: 100%;">
Alex
źródło
2
Cześć, Czym to się różni od tego, co stwierdzono w pytaniu, aby nie działać?
Gravitate,
2
Cześć, jest inny, ponieważ zawiera atrybut rozmiaru. Pierwsze pytanie odnosi się tylko do atrybutu wysokości
Alex
2
Ach ok. W rzeczywistości nie powoduje to, że pudełko zmniejsza się do rozmiaru zawartości, musisz ręcznie ustawić wartość rozmiaru liczby, co jest w porządku, jeśli wiesz, ile jest opcji, ale większy problem, jeśli istnieje dynamiczna liczba opcji . W takim przypadku musisz ustawić atrybut zmiany rozmiaru podczas wypełniania pola. Teraz rozumiem, dzięki za wyjaśnienie.
Gravitate,
20
Och przestań! Jeśli „zapełniasz” serwer, wiesz, ile będzie. A jeśli potrafisz „wypełnić” za pomocą AJAX, modyfikacja skromnego atrybutu nie będzie wyzwaniem. Możesz nawet policzyć opcje w JS po „wypełnieniu”.
Tomasz Gandor
1
Zadziałało, ale także wysokość <select> zwiększała się zgodnie z rozmiarem iw rezultacie zniekształcała mój układ. ; (-
shubham
67

Możesz to zrobić za pomocą sizeatrybutu w selecttagu. Przypuśćmy, że masz 8 opcji, to zrobiłbyś to tak:

<select name='courses' multiple="multiple" size='8'>
awc
źródło
Zadziałało, ale także wysokość <select> zwiększała się zgodnie z rozmiarem iw rezultacie zniekształcała mój układ. ; (
shubham
jak określić tę wartość w css?
Lei Yang
29

Stary, ale to zrobi to, czego szukasz, bez potrzeby korzystania z jquery. Ukryte przepełnienie usuwa pasek przewijania, a javascript nadaje mu odpowiedni rozmiar.

<select multiple='multiple' id='select' style='overflow:hidden'>
<option value='foo'>foo</option>
<option value='bar'>bar</option>
<option value='abc'>abc</option>
<option value='def'>def</option>
<option value='xyz'>xyz</option>
</select>

I tylko niewielka ilość javascript

var select = document.getElementById('select');
select.size = select.length;
Jarrod
źródło
13

W przypadku jQuery możesz tego spróbować. Zawsze wykonuję następujące czynności i to działa.

$(function () {
   $("#multiSelect").attr("size",$("#multiSelect option").length);
});
Abhishek Sharma
źródło
10

Możesz to zrobić tylko w Javascript / JQuery, możesz to zrobić za pomocą następującego JQuery (zakładając, że podałeś wybranemu identyfikator multiselect):

$(function () {
    $("#multiSelect").css("height", parseInt($("#multiSelect option").length) * 20);
});

Demo: http://jsfiddle.net/AZEFU/

mattytommo
źródło
16
Ten sam pomysł bez polegania na wysokości rzędu:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas
2
@ FrancescRosàs Perfect! Szkoda, że ​​jest to ukryte w komentarzu, a nie akceptowana odpowiedź.
Nick
5

Wiem, że pytanie jest stare, ale jak temat nie jest zamknięty, pomogę.

Atrybut „rozmiar” rozwiąże Twój problem.

Przykład:

<select name="courses" multiple="multiple" size="30">
Zwycięzca
źródło
2
Pod warunkiem, że w zaznaczeniu jest zawsze 30 opcji.
Anders Lindén
5

selectmoże zawierać po optgroupjednej linii:

<select id="list">
  <optgroup label="Group 1">
    <option value="1">1</option>
  </optgroup>
  <optgroup label="Group 2">
    <option value="2">2</option>
    <option value="3">3</option>
  </optgroup>
</select>
<script>
  const l = document.getElementById("list")
  l.setAttribute("size", l.childElementCount + l.length)
</script>

W tym przykładzie suma sizewynosi (1+1)+(1+2)=5.

Andrii Nemchenko
źródło
Obie powyższe odpowiedzi są technicznie poprawne, ale jest to odpowiedź bardziej interesująca.
russellmania
Wolę tę odpowiedź, ponieważ nie wiem, ile elementów pojawi się na liście. Ale ustawiam tylko: l.setAttribute ('size', l.childElementCount +1); (nie podwaja długości, jak pokazuje powyższy kod)
Robert Achmann,
@RobertAchmann Nie podwaja rozmiaru. Sumuje liczbę <optgroup>si <option>s.
Andrii Nemchenko,
3

Możesz to zrobić za pomocą prostego javascript ...

<select multiple="multiple" size="return this.length();">

... lub ogranicz wysokość do liczby rekordów ...

<select multiple="multiple" size="return this.length() > 10 ? this.length(): 10;">
juntapao
źródło
Najwyraźniej to już nie działa. Moja praca to $('#firstSelect').attr('size', $('#firstSelect').length);. Spójrz na to skrzypce: https://jsfiddle.net/ergt5upf/2/
juntapao
3

Aby usunąć pasek przewijania, dodaj następujący CSS:

select[multiple] {
    overflow-y: auto;
}

Oto fragment:

select[multiple] {
  overflow-y: auto;
}
<select>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>

<select multiple size="3">
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>

leonheess
źródło
1

Korzystanie z atrybutu rozmiaru jest najbardziej praktycznym rozwiązaniem, jednak istnieją pewne dziwactwa, gdy jest stosowany do wybierania elementów z tylko dwiema lub trzema opcjami.

  • Ustawienie wartości atrybutu rozmiaru na „0” lub „1” spowoduje głównie renderowanie domyślnego elementu wyboru (menu rozwijanego).
  • Ustawienie atrybutu rozmiaru na wartość większą niż „1” spowoduje przeważnie wyświetlenie listy wyboru o wysokości umożliwiającej wyświetlenie co najmniej czterech elementów. Dotyczy to również list zawierających tylko dwa lub trzy elementy, co prowadzi do niezamierzonych białych znaków.

Prosty JavaScript może być użyty do automatycznego ustawienia atrybutu rozmiaru na poprawną wartość, np. Zobacz to skrzypce .

$(function() {
    $("#autoheight").attr("size", parseInt($("#autoheight option").length)); 
});

Jak wspomniano powyżej, to rozwiązanie nie rozwiązuje problemu, gdy dostępne są tylko dwie lub trzy opcje.

Werner
źródło
1
To rozwiązanie wymaga jQuery i dlatego moim zdaniem nie jest „prostym JavaScriptem”. Poza tym, ten kod został już pokazany we wcześniejszych odpowiedzi ..
uchwyt
0

przyjaciele: jeśli pobierasz dane z bazy danych: możesz wywołać to $ registerers = * _num_rows (Result_query) wtedy

<select size=<?=$registers + 1; ?>"> 
darkporn
źródło
0

Niedawno miałem to wymaganie i użyłem innych postów z tego pytania do stworzenia tego skryptu:

$("select[multiple]").each(function() {
  $(this).css("height","100%")
    .attr("size",this.length);
})
Andreas
źródło
0

Aby dostosować rozmiar (wysokość) wszystkich wielokrotnych zaznaczeń do liczby opcji, użyj jQuery:

$('select[multiple = multiple]').each(function() {
    $(this).attr('size', $(this).find('option').length)
})
Steve
źródło
0

Możesz najpierw policzyć tag opcji, a następnie ustawić liczbę dla atrybutu rozmiaru. Na przykład w PHP możesz policzyć tablicę, a następnie użyć pętli foreach dla tablicy.

<?php $count = count($array); ?>
<select size="<?php echo $count; ?>" style="height:100%;">
<?php foreach ($array as $item){ ?>
    <option value="valueItem">Name Item</option>
<?php } ?>
</select>
Amirhossein Tarmast
źródło
-1

Sposób renderowania pola wyboru jest określany przez samą przeglądarkę. Zatem każda przeglądarka pokaże wysokość pola listy opcji w innej wysokości. Nie możesz na to wpłynąć. Jedynym sposobem, w jaki możesz to zmienić, jest dokonanie własnego wyboru od podstaw.

Sven Bieder
źródło
-1

Oto przykładowe użycie pakietu, które jest dość popularne w społeczności Laravel:

{!! Form::select('subdomains[]', $subdomains, null, [
    'id' => 'subdomains',
    'multiple' => true,
    'size' => $subdomains->count(),
    'class' => 'col-12 col-md-4 form-control '.($errors->has('subdomains') ? 'is-invalid' : ''),
]) !!}

Pakiet: https://laravelcollective.com/

Sinan Eldem
źródło
1
To nie jest Laravel, to pakiet Laravel.
emocjonalność
1
Dzięki za poprawienie. Mam zamiar zaktualizować wpis.
Sinan Eldem