Faça várias seleções para ajustar sua altura para caber nas opções sem barra de rolagem

103

Aparentemente, isso não funciona:

   select[multiple]{
     height: 100%;
   }

faz com que a seleção tenha 100% da altura da página ...

auto também não funciona, ainda recebo a barra de rolagem vertical.

Alguma outra ideia?

insira a descrição da imagem aqui

Alex
fonte
1
Eu acho que você está preso com o uso de algum javascript. Não acredito que haja uma maneira de fazer com que uma caixa de seleção seja esticada automaticamente somente em css para conter o conteúdo.
random_user_name
Solução CSS pura: stackoverflow.com/a/55969271/7910454
leonheess

Respostas:

147

Eu acho que você pode usar o sizeatributo. Funciona em todos os navegadores recentes.

<select name="courses" multiple="multiple" size="30" style="height: 100%;">
Alex
fonte
2
Olá, Como isso difere do que foi afirmado na pergunta para não funcionar?
Gravitar em
2
Olá, é diferente porque incorpora o atributo de tamanho. A pergunta inicial se refere apenas ao atributo de altura
Alex
2
Ah ok. Na verdade, isso não faz a caixa encolher para o tamanho do conteúdo, você tem que definir manualmente o valor do tamanho do número, o que é bom se você sabe quantas opções existem, mas é mais problemático se houver um número dinâmico de opções . Nesse caso, você teria que definir o atributo de redimensionamento do tamanho ao preencher a caixa. Entendo agora, obrigado por esclarecer.
Gravitar em
20
Oh vamos lá! Se você estiver "populando" no servidor, sabe quantos haverá. E se você pode "preencher" usando AJAX, modificar um atributo modesto não será um desafio. Você pode até contar as opções em JS depois de "preencher".
Tomasz Gandor
1
Funcionou, mas também a altura de <select> ficando aumentada conforme o tamanho e, como resultado, distorcendo meu layout. ; (-
shubham
67

Você pode fazer isso usando o sizeatributo na selecttag. Supondo que você tenha 8 opções, você faria assim:

<select name='courses' multiple="multiple" size='8'>
awc
fonte
Funcionou, mas também a altura de <select> ficando aumentada conforme o tamanho e, como resultado, distorcendo meu layout. ; (
shubham
como especificar esse valor em css?
Lei Yang de
29

Antigo, mas isso fará o que você procura sem a necessidade de jquery. O estouro oculto remove a barra de rolagem e o javascript a torna do tamanho certo.

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

E apenas uma pequena quantidade de javascript

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

Para jQuery, você pode tentar isso. Eu sempre faço o seguinte e funciona.

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

Você só pode fazer isso em Javascript / JQuery, você pode fazer isso com o seguinte JQuery (supondo que você forneceu ao seu select um id de multiselect):

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

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

mattytommo
fonte
16
A mesma ideia sem depender da altura da linha:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas
2
@FrancescRosàs Perfect! Pena que isso esteja enterrado em um comentário em vez de ser a resposta aceita.
Nick
5

Sei que a dúvida é antiga, mas como o tópico não está fechado darei minha ajuda.

O atributo "tamanho" resolverá seu problema.

Exemplo:

<select name="courses" multiple="multiple" size="30">
Vencedor
fonte
2
Desde que sempre haja 30 opções na seleção.
Anders Lindén
5

selectpode conter o optgroupque leva uma linha cada:

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

Neste exemplo, o total sizeé (1+1)+(1+2)=5.

Andrii Nemchenko
fonte
Ambas as respostas acima estão tecnicamente corretas, mas esta é a resposta mais interessante.
russellmania,
Prefiro essa resposta porque não sei quantos itens aparecerão na lista. Mas eu apenas defini: l.setAttribute ('size', l.childElementCount +1); (não duplique o comprimento como mostra o código acima)
Robert Achmann
@RobertAchmann Não dobra de tamanho. Ele resume número de <optgroup>s e <option>s.
Andrii Nemchenko de
3

Você pode fazer isso com javascript simples ...

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

... ou limite a altura até o número de registros ...

<select multiple="multiple" size="return this.length() > 10 ? this.length(): 10;">
Juntapao
fonte
Aparentemente, isso não funciona mais. Meu trabalho é $('#firstSelect').attr('size', $('#firstSelect').length);. Olhe para este violino: https://jsfiddle.net/ergt5upf/2/
juntapao
2

Para remover a barra de rolagem, adicione o seguinte CSS:

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

Aqui está um snippet:

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

Usar o atributo size é a solução mais prática, no entanto, existem peculiaridades quando ele é aplicado para selecionar elementos com apenas duas ou três opções.

  • Definir o valor do atributo size para "0" ou "1" renderizará principalmente um elemento de seleção padrão (lista suspensa).
  • Definir o atributo de tamanho com um valor maior que "1" renderizará principalmente uma lista de seleção com uma altura capaz de exibir pelo menos quatro itens. Isso também se aplica a listas com apenas dois ou três itens, levando a espaços em branco não intencionais.

JavaScript simples pode ser usado para definir o atributo de tamanho para o valor correto automaticamente, por exemplo, veja este violino .

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

Conforme mencionado acima, esta solução não resolve o problema quando há apenas duas ou três opções.

Werner
fonte
1
Esta solução requer jQuery e, portanto, na minha opinião, não é um "JavaScript simples". Além disso, este código já foi mostrado em respostas anteriores ..
lidar com
0

amigos: se você recuperar os dados de um banco de dados: você pode chamar isso de $ registers = * _num_rows (Result_query) então

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

Tive esse requisito recentemente e usei outras postagens desta pergunta para criar este script:

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

Para ajustar o tamanho (altura) de todas as seleções múltiplas para o número de opções, use jQuery:

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

Você pode contar a tag de opção primeiro e, em seguida, definir a contagem para o atributo de tamanho. Por exemplo, em PHP você pode contar o array e então usar um loop foreach para o array.

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

A forma como uma caixa de seleção é renderizada é determinada pelo próprio navegador. Assim, cada navegador mostrará a altura da caixa de lista de opções em outra altura. Você não pode influenciar isso. A única maneira de mudar isso é fazer sua própria seleção do zero.

Sven Bieder
fonte
-1

Aqui está um exemplo de uso de pacote, que é bastante popular na comunidade 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' : ''),
]) !!}

Pacote: https://laravelcollective.com/

Sinan Eldem
fonte
1
Isso não é o Laravel, é um pacote do Laravel.
emotalidade
1
Obrigado por corrigir. Vou atualizar o post.
Sinan Eldem