Buat beberapa pilihan untuk menyesuaikan ketinggiannya agar pas dengan opsi tanpa bilah gulir


103

Ternyata ini tidak berhasil:

   select[multiple]{
     height: 100%;
   }

itu membuat yang dipilih memiliki 100% tinggi halaman ...

auto tidak berfungsi juga, saya masih mendapatkan scrollbar vertikal.

Ada ide lain?

masukkan deskripsi gambar di sini


1
Saya pikir Anda terjebak dengan menggunakan beberapa javascript. Saya tidak yakin ada cara agar kotak pilih secara otomatis meregangkan css-only untuk memuat konten.
random_user_name

Jawaban:


147

Saya kira Anda dapat menggunakan sizeatribut tersebut. Ia bekerja di semua browser terbaru.

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

2
Hai, Apa bedanya ini dengan apa yang dinyatakan dalam pertanyaan tidak berfungsi?
Gravitasi

2
Hai, ini berbeda karena mengandung atribut ukuran. Pertanyaan awal hanya mengacu pada atribut tinggi
Alex

2
Ah ok. Itu tidak benar-benar membuat kotak menyusut ke ukuran konten, Anda harus mengatur nilai ukuran angka secara manual, yang tidak masalah jika Anda tahu berapa banyak opsi yang ada tetapi lebih menjadi masalah jika ada sejumlah opsi dinamis . Dalam hal ini Anda harus menyetel atribut ubah ukuran ukuran saat Anda mengisi kotak. Saya mengerti sekarang, terima kasih telah mengklarifikasi.
Gravitasi

20
Oh ayolah! Jika Anda "mengisi" di server, maka Anda tahu berapa banyak yang akan ada. Dan jika Anda dapat "mengisi" menggunakan AJAX, memodifikasi atribut sederhana tidak akan menjadi tantangan. Anda bahkan dapat menghitung opsi di JS setelah "mengisi".
Tomasz Gandor

1
Itu berhasil, tetapi juga ketinggian <select> semakin meningkat sesuai ukurannya dan akibatnya mengubah tata letak saya. ; (-
shubham

67

Anda dapat melakukannya dengan menggunakan sizeatribut di selecttag. Misalkan Anda memiliki 8 opsi, maka Anda akan melakukannya seperti:

<select name='courses' multiple="multiple" size='8'>

Itu berhasil, tetapi juga ketinggian <select> semakin meningkat sesuai ukurannya dan akibatnya mengubah tata letak saya. ; (
shubham

bagaimana menentukan nilai ini di css?
Lei Yang

29

Tua, tapi ini akan melakukan apa yang Anda cari tanpa perlu jquery. Overflow yang tersembunyi menghilangkan scrollbar, dan javascript membuatnya dalam ukuran yang tepat.

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

Dan hanya sedikit javascript

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

13

Untuk jQuery Anda dapat mencoba ini. Saya selalu melakukan hal berikut dan berhasil.

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

10

Anda hanya dapat melakukan ini di Javascript / JQuery, Anda dapat melakukannya dengan JQuery berikut (dengan asumsi Anda telah memberikan id pilihan multiselect):

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

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


16
Ide yang sama tanpa bergantung pada tinggi baris:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas

2
@ FrancescRosàs Sempurna! Sayangnya ini terkubur dalam komentar alih-alih menjadi jawaban yang diterima.
Nick

5

Saya tahu pertanyaannya sudah tua, tetapi bagaimana topiknya tidak ditutup, saya akan memberikan bantuan saya.

Atribut "size" akan menyelesaikan masalah Anda.

Contoh:

<select name="courses" multiple="multiple" size="30">

2
Asalkan selalu ada 30 pilihan yang di pilih.
Anders Lindén

5

selectbisa berisi optgroupyang masing-masing membutuhkan satu baris:

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

Dalam contoh ini, totalnya sizeadalah (1+1)+(1+2)=5.


Kedua jawaban di atas secara teknis benar, tetapi ini adalah jawaban yang lebih menarik.
russellmania

Saya lebih suka jawaban ini karena saya tidak tahu berapa banyak item yang akan muncul di daftar. Tapi saya hanya menyetel: l.setAttribute ('size', l.childElementCount +1); (bukan dua kali lipat panjang seperti yang ditunjukkan kode di atas)
Robert Achmann

@RobertAchmann Itu tidak menggandakan ukuran. Ini menjumlahkan jumlah <optgroup>s dan <option>s.
Andrii Nemchenko

3

Anda dapat melakukan ini dengan javascript sederhana ...

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

... atau batasi tinggi hingga jumlah catatan ...

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

Ternyata, ini tidak berfungsi lagi. Pekerjaan saya adalah $('#firstSelect').attr('size', $('#firstSelect').length);. Lihatlah biola ini: https://jsfiddle.net/ergt5upf/2/
juntapao

2

Untuk menghapus scrollbar tambahkan CSS berikut:

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

Berikut cuplikannya:

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

Menggunakan atribut size adalah solusi paling praktis, namun ada kebiasaan ketika diterapkan untuk memilih elemen dengan hanya dua atau tiga opsi.

  • Menyetel nilai atribut ukuran ke "0" atau "1" sebagian besar akan merender elemen pemilihan default (tarik-turun).
  • Menyetel atribut ukuran ke nilai yang lebih besar dari "1" sebagian besar akan membuat daftar pilihan dengan ketinggian yang mampu menampilkan setidaknya empat item. Ini juga berlaku untuk daftar dengan hanya dua atau tiga item, yang mengarah ke ruang kosong yang tidak diinginkan.

JavaScript sederhana dapat digunakan untuk mengatur atribut ukuran ke nilai yang benar secara otomatis, misalnya lihat biola ini .

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

Seperti disebutkan di atas, solusi ini tidak menyelesaikan masalah jika hanya ada dua atau tiga opsi.


1
Solusi ini membutuhkan jQuery dan karenanya menurut saya bukan "JavaScript sederhana". Juga, kode ini telah diperlihatkan dalam jawaban sebelumnya ..
menangani

0

teman: jika Anda mengambil de data dari DB: Anda dapat memanggil ini $ register = * _num_rows (Result_query) lalu

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

0

Saya memiliki persyaratan ini baru-baru ini dan menggunakan postingan lain dari pertanyaan ini untuk membuat skrip ini:

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

0

Untuk menyesuaikan ukuran (tinggi) dari semua pilihan ganda dengan jumlah pilihan, gunakan jQuery:

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

0

Anda dapat menghitung tag opsi terlebih dahulu, lalu mengatur atribut hitungan ukuran. Misalnya, di PHP Anda dapat menghitung array dan kemudian menggunakan loop foreach untuk array tersebut.

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

Cara kotak pilih ditampilkan ditentukan oleh browser itu sendiri. Jadi setiap browser akan menunjukkan ketinggian kotak daftar opsi di ketinggian lain. Anda tidak dapat mempengaruhi itu. Satu-satunya cara Anda dapat mengubahnya adalah dengan membuat pilihan sendiri dari awal.


-1

Berikut adalah contoh penggunaan paket yang cukup populer di komunitas 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' : ''),
]) !!}

Paket: https://laravelcollective.com/


1
Itu bukan Laravel, itu paket Laravel.
emosionalitas

1
Terima kasih telah mengoreksi. Saya akan mengupdate postingan.
Sinan Eldem
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.