Mehrfachauswahl treffen, um die Höhe an die Optionen ohne Bildlaufleiste anzupassen

103

Anscheinend funktioniert das nicht:

   select[multiple]{
     height: 100%;
   }

Dadurch hat die Auswahl eine Seitenhöhe von 100% ...

auto funktioniert auch nicht, ich bekomme immer noch die vertikale Bildlaufleiste.

Irgendwelche anderen Ideen?

Geben Sie hier die Bildbeschreibung ein

Alex
quelle
1
Ich denke, Sie müssen kein Javascript verwenden. Ich glaube nicht, dass es eine Möglichkeit gibt, ein Auswahlfeld automatisch nur CSS zu strecken, um den Inhalt zu enthalten.
random_user_name
Reine CSS-Lösung: stackoverflow.com/a/55969271/7910454
leonheess

Antworten:

147

Ich denke, Sie können das sizeAttribut verwenden. Es funktioniert in allen aktuellen Browsern.

<select name="courses" multiple="multiple" size="30" style="height: 100%;">
Alex
quelle
2
Hallo, wie unterscheidet sich das von dem, was in der Frage angegeben wurde, nicht zu funktionieren?
Gravitate
2
Hallo, es ist anders, weil es das Größenattribut verkörpert. Die erste Frage bezieht sich nur auf das Höhenattribut
Alex
2
Ah ok. Dadurch wird das Feld nicht auf die Größe des Inhalts verkleinert. Sie müssen den Wert für die Nummerngröße manuell festlegen. Dies ist in Ordnung, wenn Sie wissen, wie viele Optionen es gibt, aber ein größeres Problem, wenn es eine dynamische Anzahl von Optionen gibt . In diesem Fall müssten Sie die Größenänderung des Größenattributs festlegen, wenn Sie das Feld ausfüllen. Ich sehe jetzt, danke für die Klarstellung.
Gravitate
20
Ach komm schon! Wenn Sie auf dem Server "füllen", wissen Sie, wie viele es sein werden. Und wenn Sie mit AJAX "füllen" können, ist das Ändern eines bescheidenen Attributs keine Herausforderung. Sie können die Optionen in JS sogar nach dem "Auffüllen" zählen.
Tomasz Gandor
1
Es hat funktioniert, aber auch die Höhe von <select> wurde je nach Größe erhöht und verzerrte dadurch mein Layout. ; (-
Shubham
66

Sie können dies mithilfe des sizeAttributs im selectTag tun . Angenommen, Sie haben 8 Optionen, dann würden Sie es wie folgt tun:

<select name='courses' multiple="multiple" size='8'>
awc
quelle
Es hat funktioniert, aber auch die Höhe von <select> wurde je nach Größe erhöht und verzerrte dadurch mein Layout. ; (
Shubham
Wie kann man diesen Wert in CSS angeben?
Lei Yang
29

Alt, aber dies wird das tun, wonach Sie suchen, ohne dass Sie Fragen stellen müssen. Durch den versteckten Überlauf wird die Bildlaufleiste entfernt, und das Javascript hat die richtige Größe.

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

Und nur eine winzige Menge Javascript

var select = document.getElementById('select');
select.size = select.length;
Jarrod
quelle
13

Für jQuery können Sie dies versuchen. Ich mache immer folgendes und es funktioniert.

$(function () {
   $("#multiSelect").attr("size",$("#multiSelect option").length);
});
Abhishek Sharma
quelle
10

Sie können dies nur in Javascript / JQuery tun. Sie können dies mit der folgenden JQuery tun (vorausgesetzt, Sie haben Ihrer Auswahl eine ID für Mehrfachauswahl gegeben):

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

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

mattytommo
quelle
16
Die gleiche Idee ohne sich auf die Reihenhöhe zu verlassen:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas
2
@ FrancescRosàs Perfekt! Schade, dass dies in einem Kommentar vergraben ist, anstatt die akzeptierte Antwort zu sein.
Nick
5

Ich weiß, dass die Frage alt ist, aber wie das Thema nicht geschlossen ist, werde ich meine Hilfe geben.

Das Attribut "Größe" löst Ihr Problem.

Beispiel:

<select name="courses" multiple="multiple" size="30">
Sieger
quelle
2
Vorausgesetzt, es gibt immer 30 Optionen in der Auswahl.
Anders Lindén
5

selectkönnte enthalten, optgroupwas jeweils eine Zeile dauert:

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

In diesem Beispiel insgesamt sizeist (1+1)+(1+2)=5.

Andrii Nemchenko
quelle
Beide obigen Antworten sind technisch korrekt, aber dies ist die interessantere Antwort.
Russellmania
Ich bevorzuge diese Antwort, da ich nicht weiß, wie viele Elemente in der Liste angezeigt werden. Aber ich setze nur: l.setAttribute ('size', l.childElementCount +1); (nicht doppelt so lang wie der obige Code zeigt)
Robert Achmann
@ RobertAchmann Es verdoppelt nicht die Größe. Es summiert die Anzahl von <optgroup>s und <option>s.
Andrii Nemchenko
3

Sie können dies mit einfachem Javascript tun ...

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

... oder die Höhe bis zur Anzahl der Datensätze begrenzen ...

<select multiple="multiple" size="return this.length() > 10 ? this.length(): 10;">
Juntapao
quelle
Anscheinend funktioniert das nicht mehr. Meine Arbeit ist $('#firstSelect').attr('size', $('#firstSelect').length);. Schauen Sie sich diese Geige an: https://jsfiddle.net/ergt5upf/2/
juntapao
2

Fügen Sie zum Entfernen der Bildlaufleiste das folgende CSS hinzu:

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

Hier ist ein Ausschnitt:

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

Mit Hilfe der Größe Attribut ist die praktischste Lösung, aber es gibt Macken , wenn sie angewendet wird , wählen Sie mit den Elementen nur zwei oder drei Optionen.

  • Wenn Sie den Größenattributwert auf "0" oder "1" setzen, wird meistens ein Standardauswahlelement (Dropdown) gerendert.
  • Wenn Sie das Größenattribut auf einen Wert größer als "1" setzen, wird meistens eine Auswahlliste mit einer Höhe gerendert, in der mindestens vier Elemente angezeigt werden können. Dies gilt auch für Listen mit nur zwei oder drei Elementen, was zu unbeabsichtigten Leerzeichen führt.

Einfache JavaScript kann das eingestellt wird Größe Attribut auf den korrekten Wert automatisch, siehe zB diese Geige .

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

Wie oben erwähnt, löst diese Lösung das Problem nicht, wenn nur zwei oder drei Optionen vorhanden sind.

Werner
quelle
1
Diese Lösung erfordert jQuery und ist daher meiner Meinung nach kein "einfaches JavaScript". Auch dieser Code wurde bereits in früheren Antworten gezeigt ..
behandeln
0

Freunde: Wenn Sie die Daten aus einer Datenbank abrufen, können Sie diese $ registers = * _num_rows (Result_query) dann aufrufen

<select size=<?=$registers + 1; ?>"> 
Dunkelhorn
quelle
0

Ich hatte diese Anforderung kürzlich und habe andere Beiträge aus dieser Frage verwendet, um dieses Skript zu erstellen:

$("select[multiple]").each(function() {
  $(this).css("height","100%")
    .attr("size",this.length);
})
Andreas
quelle
0

Verwenden Sie jQuery, um die Größe (Höhe) aller Mehrfachauswahlmöglichkeiten an die Anzahl der Optionen anzupassen:

$('select[multiple = multiple]').each(function() {
    $(this).attr('size', $(this).find('option').length)
})
Steve
quelle
-1

Die Art und Weise, wie ein Auswahlfeld gerendert wird, wird vom Browser selbst festgelegt. Jeder Browser zeigt Ihnen also die Höhe des Optionslistenfelds in einer anderen Höhe an. Das kann man nicht beeinflussen. Die einzige Möglichkeit, dies zu ändern, besteht darin, eine eigene Auswahl von Grund auf zu treffen.

Sven Bieder
quelle
-1

Hier ist ein Beispiel für die Verwendung eines Pakets, das in der Laravel-Community sehr beliebt ist:

{!! 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' : ''),
]) !!}

Paket: https://laravelcollective.com/

Sinan Eldem
quelle
1
Das ist nicht Laravel, das ist ein Laravel-Paket.
Emotionalität
1
Danke für die Korrektur. Ich werde den Beitrag aktualisieren.
Sinan Eldem