Realice una selección múltiple para ajustar su altura para adaptarse a las opciones sin barra de desplazamiento

103

Aparentemente esto no funciona:

   select[multiple]{
     height: 100%;
   }

hace que la selección tenga un 100% de altura de página ...

auto tampoco funciona, todavía obtengo la barra de desplazamiento vertical.

¿Alguna otra idea?

ingrese la descripción de la imagen aquí

Alex
fuente
1
Creo que estás atascado con el uso de javascript. No creo que haya una manera de hacer que un cuadro de selección estire automáticamente css solo para contener el contenido.
random_user_name
Solución CSS pura: stackoverflow.com/a/55969271/7910454
leonheess

Respuestas:

147

Supongo que puedes usar el sizeatributo. Funciona en todos los navegadores recientes.

<select name="courses" multiple="multiple" size="30" style="height: 100%;">
Alex
fuente
2
Hola, ¿En qué se diferencia esto de lo que se indicó en la pregunta para no funcionar?
Gravitate el
2
Hola, es diferente porque incorpora el atributo de tamaño. La pregunta inicial solo se refiere al atributo de altura
Alex
2
Ah ok. En realidad, no hace que el cuadro se reduzca al tamaño del contenido, debe establecer manualmente el valor del tamaño del número, lo cual está bien si sabe cuántas opciones hay, pero es más problemático si hay un número dinámico de opciones. . En cuyo caso, tendría que establecer el cambio de tamaño del atributo de tamaño cuando rellene el cuadro. Ya veo, gracias por aclarar.
Gravitate
20
¡Oh vamos! Si está "rellenando" en el servidor, entonces sabrá cuántos habrá. Y si puede "poblar" usando AJAX, modificar un atributo modesto no será un desafío. Incluso puede contar las opciones en JS después de "poblar".
Tomasz Gandor
1
Funcionó, pero también la altura de <select> aumentó según el tamaño y, como resultado, distorsionó mi diseño. ; (-
shubham
67

Puede hacer esto usando el sizeatributo en la selectetiqueta. Suponiendo que tiene 8 opciones, lo haría así:

<select name='courses' multiple="multiple" size='8'>
awc
fuente
Funcionó, pero también la altura de <select> aumentó según el tamaño y, como resultado, distorsionó mi diseño. ; (
shubham
¿cómo especificar este valor en css?
Lei Yang
29

Viejo, pero esto hará lo que buscas sin necesidad de jquery. El desbordamiento oculto elimina la barra de desplazamiento y el javascript la hace del tamaño correcto.

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

Y solo una pequeña cantidad de javascript

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

Para jQuery puedes probar esto. Siempre hago lo siguiente y funciona.

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

Solo puede hacer esto en Javascript / JQuery, puede hacerlo con el siguiente JQuery (suponiendo que le haya dado a su selección una identificación de selección múltiple):

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

Demostración: http://jsfiddle.net/AZEFU/

mattytommo
fuente
16
La misma idea sin depender de la altura de la fila:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas
2
@ FrancescRosàs ¡Perfecto! Lástima que esto esté enterrado en un comentario en lugar de ser la respuesta aceptada.
Nick
5

Sé que la pregunta es antigua, pero como el tema no se cierra, daré mi ayuda.

El atributo "tamaño" resolverá su problema.

Ejemplo:

<select name="courses" multiple="multiple" size="30">
Víctor
fuente
2
Siempre que haya siempre 30 opciones en la selección.
Anders Lindén
5

selectpodría contener lo optgroupque toma una línea cada uno:

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

En este ejemplo, el total sizees (1+1)+(1+2)=5.

Andrii Nemchenko
fuente
Ambas respuestas anteriores son técnicamente correctas, pero esta es la respuesta más interesante.
russellmania
Prefiero esta respuesta porque no sé cuántos elementos aparecerán en la lista. Pero solo configuro: l.setAttribute ('tamaño', l.childElementCount +1); (no duplicar la longitud como muestra el código anterior)
Robert Achmann
@RobertAchmann No duplica el tamaño. Suma el número de <optgroup>sy <option>s.
Andrii Nemchenko
3

Puede hacer esto con un simple javascript ...

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

... o limitar la altura hasta el número de registros ...

<select multiple="multiple" size="return this.length() > 10 ? this.length(): 10;">
juntapao
fuente
Aparentemente, esto ya no funciona. Mi trabajo es $('#firstSelect').attr('size', $('#firstSelect').length);. Mira este violín: https://jsfiddle.net/ergt5upf/2/
juntapao
2

Para eliminar la barra de desplazamiento, agregue el siguiente CSS:

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

Aquí hay un fragmento:

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

Usar el atributo de tamaño es la solución más práctica, sin embargo, existen peculiaridades cuando se aplica a elementos seleccionados con solo dos o tres opciones.

  • Establecer el valor del atributo de tamaño en "0" o "1" representará principalmente un elemento de selección predeterminado (menú desplegable).
  • Establecer el atributo de tamaño en un valor mayor que "1" generará principalmente una lista de selección con una altura capaz de mostrar al menos cuatro elementos. Esto también se aplica a las listas con solo dos o tres elementos, lo que genera espacios en blanco no deseados.

Se puede usar JavaScript simple para establecer el atributo de tamaño en el valor correcto automáticamente, por ejemplo, vea este violín .

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

Como se mencionó anteriormente, esta solución no resuelve el problema cuando solo hay dos o tres opciones.

Werner
fuente
1
Esta solución requiere jQuery y, por lo tanto, en mi opinión, no es un "JavaScript simple". Además, este código ya se ha mostrado en respuestas anteriores ..
maneje el
0

amigos: si recupera los datos de una base de datos: puede llamar a esto $ registros = * _num_rows (Result_query) entonces

<select size=<?=$registers + 1; ?>"> 
darkporn
fuente
0

Recientemente tuve este requisito y usé otras publicaciones de esta pregunta para crear este script:

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

Para ajustar el tamaño (altura) de todas las selecciones múltiples al número de opciones, use jQuery:

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

Primero puede contar la etiqueta de opción y luego establecer el recuento para el atributo de tamaño. Por ejemplo, en PHP puede contar la matriz y luego usar un bucle foreach para la matriz.

<?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
fuente
-1

El navegador determina la forma en que se representa un cuadro de selección. Entonces, cada navegador le mostrará la altura del cuadro de lista de opciones en otra altura. No puedes influir en eso. La única forma de cambiar eso es hacer una selección propia desde cero.

Sven Bieder
fuente
-1

Aquí hay un ejemplo de uso del paquete, que es bastante popular en la comunidad de 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' : ''),
]) !!}

Paquete: https://laravelcollective.com/

Sinan Eldem
fuente
1
Eso no es Laravel, es un paquete de Laravel.
emotality
1
Gracias por corregir. Voy a actualizar la publicación.
Sinan Eldem