Effectuez une sélection multiple pour ajuster sa hauteur en fonction des options sans barre de défilement

103

Apparemment, cela ne fonctionne pas:

   select[multiple]{
     height: 100%;
   }

cela fait que la sélection a une hauteur de page de 100% ...

auto ne fonctionne pas non plus, j'obtiens toujours la barre de défilement verticale.

D'autres idées?

entrez la description de l'image ici

Alex
la source
1
Je pense que vous êtes coincé avec l'utilisation de javascript. Je ne pense pas qu'il y ait un moyen d'avoir une boîte de sélection qui étire automatiquement le CSS uniquement pour contenir le contenu.
random_user_name
Solution CSS pure: stackoverflow.com/a/55969271/7910454
leonheess

Réponses:

147

Je suppose que vous pouvez utiliser l' sizeattribut. Cela fonctionne dans tous les navigateurs récents.

<select name="courses" multiple="multiple" size="30" style="height: 100%;">
Alex
la source
2
Salut, En quoi est-ce différent de ce qui était indiqué dans la question de ne pas fonctionner?
Gravitate le
2
Salut, c'est différent car il incarne l'attribut size. La question initiale se réfère uniquement à l'attribut de hauteur
Alex
2
Ah ok. Cela ne réduit pas la taille de la boîte à la taille du contenu, vous devez définir manuellement la valeur de la taille du nombre, ce qui est bien si vous savez combien d'options il y a, mais c'est plus un problème s'il y a un nombre dynamique d'options . Dans ce cas, vous devrez définir redimensionner l'attribut de taille lorsque vous remplissez la zone. Je vois maintenant, merci de clarifier.
Gravitate le
20
Oh, allez! Si vous «remplissez» le serveur, vous savez combien il y en aura. Et si vous pouvez "peupler" en utilisant AJAX, la modification d'un attribut modeste ne sera pas un défi. Vous pouvez même compter les options dans JS après le «remplissage».
Tomasz Gandor
1
Cela a fonctionné, mais aussi la hauteur de <select> augmentant en fonction de la taille et en conséquence déformant ma mise en page. ; (-
shubham
67

Vous pouvez le faire en utilisant l' sizeattribut dans la selectbalise. En supposant que vous ayez 8 options, alors vous le feriez comme:

<select name='courses' multiple="multiple" size='8'>
awc
la source
Cela a fonctionné, mais aussi la hauteur de <select> augmentant en fonction de la taille et en conséquence déformant ma mise en page. ; (
shubham
comment spécifier cette valeur en css?
Lei Yang
29

Vieux, mais cela fera ce que vous recherchez sans avoir besoin de jquery. Le débordement caché supprime la barre de défilement et le javascript lui donne la bonne taille.

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

Et juste une petite quantité de javascript

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

Pour jQuery, vous pouvez essayer ceci. Je fais toujours ce qui suit et ça marche.

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

Vous ne pouvez le faire qu'en Javascript / JQuery, vous pouvez le faire avec le JQuery suivant (en supposant que vous avez donné à votre sélection un identifiant de multiselect):

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

Démo: http://jsfiddle.net/AZEFU/

mattytommo
la source
16
La même idée sans compter sur la hauteur des rangs:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas
2
@ FrancescRosàs Parfait! Dommage que cela soit enterré dans un commentaire au lieu d'être la réponse acceptée.
Nick
5

Je sais que la question est ancienne, mais comment le sujet n'est pas clos, je vais vous aider.

L'attribut "taille" résoudra votre problème.

Exemple:

<select name="courses" multiple="multiple" size="30">
Victor
la source
2
À condition qu'il y ait toujours 30 options dans la sélection.
Anders Lindén du
5

selectpourrait contenir optgroupce qui prend une ligne chacun:

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

Dans cet exemple, le total sizeest (1+1)+(1+2)=5.

Andrii Nemchenko
la source
Les deux réponses ci-dessus sont techniquement correctes, mais c'est la réponse la plus intéressante.
russellmania le
Je préfère cette réponse car je ne sais pas combien d'articles apparaîtront dans la liste. Mais je n'ai défini que: l.setAttribute ('size', l.childElementCount +1); (pas le double de la longueur comme le montre le code ci-dessus)
Robert Achmann
@RobertAchmann Il ne double pas la taille. Il additionne le nombre de <optgroup>s et de <option>s.
Andrii Nemchenko
3

Vous pouvez le faire avec un simple javascript ...

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

... ou limiter la hauteur jusqu'au nombre d'enregistrements ...

<select multiple="multiple" size="return this.length() > 10 ? this.length(): 10;">
juntapao
la source
Apparemment, cela ne fonctionne plus. Mon travail est $('#firstSelect').attr('size', $('#firstSelect').length);. Regardez ce violon: https://jsfiddle.net/ergt5upf/2/
juntapao
2

Pour supprimer la barre de défilement, ajoutez le CSS suivant:

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

Voici un extrait:

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
la source
1

L'utilisation de l' attribut size est la solution la plus pratique, mais il y a des bizarreries quand il est appliqué pour sélectionner des éléments avec seulement deux ou trois options.

  • Définir la valeur de l'attribut size sur "0" ou "1" rendra principalement un élément de sélection par défaut (liste déroulante).
  • La définition de l'attribut size sur une valeur supérieure à "1" rendra principalement une liste de sélection avec une hauteur capable d'afficher au moins quatre éléments. Cela s'applique également aux listes avec seulement deux ou trois éléments, ce qui entraîne des espaces blancs involontaires.

Un simple JavaScript peut être utilisé pour définir automatiquement l'attribut size sur la valeur correcte, par exemple, voyez ce violon .

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

Comme mentionné ci-dessus, cette solution ne résout pas le problème lorsqu'il n'y a que deux ou trois options.

Werner
la source
1
Cette solution nécessite jQuery et donc à mon avis n'est pas "simple JavaScript". En outre, ce code a déjà été montré dans les réponses précédentes ..
gérer le
0

amis: si vous récupérez les données d'un DB: vous pouvez appeler cela $ registers = * _num_rows (Result_query) alors

<select size=<?=$registers + 1; ?>"> 
Darkporn
la source
0

J'ai eu cette exigence récemment et j'ai utilisé d'autres articles de cette question pour créer ce script:

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

Pour ajuster la taille (hauteur) de toutes les sélections multiples au nombre d'options, utilisez jQuery:

$('select[multiple = multiple]').each(function() {
    $(this).attr('size', $(this).find('option').length)
})
Steve
la source
0

Vous pouvez d'abord compter la balise d'option, puis définir l'attribut count for size. Par exemple, en PHP, vous pouvez compter le tableau puis utiliser une boucle foreach pour le tableau.

<?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
la source
-1

La manière dont une zone de sélection est rendue est déterminée par le navigateur lui-même. Ainsi, chaque navigateur vous montrera la hauteur de la zone de liste d'options dans une autre hauteur. Vous ne pouvez pas influencer cela. La seule façon de changer cela est de faire votre propre sélection à partir de zéro.

Sven Bieder
la source
-1

Voici un exemple d'utilisation de package, qui est très populaire dans la communauté 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' : ''),
]) !!}

Paquet: https://laravelcollective.com/

Sinan Eldem
la source
1
Ce n'est pas Laravel, c'est un package Laravel.
emotality
1
Merci d'avoir corrigé. Je vais mettre à jour le message.
Sinan Eldem le