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

Alex
sumber
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
Solusi CSS murni: stackoverflow.com/a/55969271/7910454
leonheess

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%;">
Alex
sumber
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'>
awc
sumber
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;
Jarrod
sumber
13

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

$(function () {
   $("#multiSelect").attr("size",$("#multiSelect option").length);
});
Abhishek Sharma
sumber
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/

mattytommo
sumber
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">
Pemenang
sumber
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.

Andrii Nemchenko
sumber
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;">
juntapao
sumber
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>

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

Werner
sumber
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; ?>"> 
darkporn
sumber
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);
})
Andreas
sumber
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)
})
Steve
sumber
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>
Amirhossein Tarmast
sumber
-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.

Sven Bieder
sumber
-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/

Sinan Eldem
sumber
1
Itu bukan Laravel, itu paket Laravel.
emosionalitas
1
Terima kasih telah mengoreksi. Saya akan mengupdate postingan.
Sinan Eldem