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í


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

Respuestas:


147

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

<select name="courses" multiple="multiple" size="30" style="height: 100%;">

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

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;

13

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

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

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/


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

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.


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

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>


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.


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; ?>"> 

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);
})

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

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>

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


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


1
Eso no es Laravel, es un paquete de Laravel.
emotality

1
Gracias por corregir. Voy a actualizar la publicación.
Sinan Eldem
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.