ทำการเลือกหลายรายการเพื่อปรับความสูงให้พอดีกับตัวเลือกโดยไม่มีแถบเลื่อน


103

เห็นได้ชัดว่าสิ่งนี้ใช้ไม่ได้:

   select[multiple]{
     height: 100%;
   }

ทำให้การเลือกมีความสูงของหน้า 100% ...

auto ใช้งานไม่ได้เช่นกันฉันยังคงได้รับแถบเลื่อนแนวตั้ง

ความคิดอื่น ๆ ?

ใส่คำอธิบายภาพที่นี่


1
ฉันคิดว่าคุณติดอยู่กับการใช้จาวาสคริปต์ ฉันไม่เชื่อว่ามีวิธีที่จะทำให้กล่องเลือกยืดเฉพาะ css โดยอัตโนมัติเพื่อให้มีเนื้อหาได้
random_user_name

โซลูชัน CSS บริสุทธิ์: stackoverflow.com/a/55969271/7910454
leonheess

คำตอบ:


147

ฉันเดาว่าคุณสามารถใช้sizeแอตทริบิวต์ ใช้งานได้ในเบราว์เซอร์ล่าสุดทั้งหมด

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

2
สวัสดีสิ่งนี้แตกต่างจากที่ระบุไว้ในคำถามที่ไม่ทำงานอย่างไร
Gravitate

2
สวัสดีมันแตกต่างกันเพราะมันรวมแอตทริบิวต์ขนาด คำถามเริ่มต้นอ้างถึงแอตทริบิวต์ความสูงเท่านั้น
Alex

2
อาโอเค. มันไม่ได้ทำให้กล่องย่อขนาดของเนื้อหาคุณต้องตั้งค่าขนาดตัวเลขด้วยตนเองซึ่งเป็นเรื่องปกติถ้าคุณรู้ว่ามีตัวเลือกกี่ตัว แต่จะมีปัญหามากขึ้นหากมีจำนวนตัวเลือกแบบไดนามิก . ในกรณีนี้คุณจะต้องตั้งค่าแอตทริบิวต์ resize the size เมื่อคุณเติมข้อมูลในช่อง ฉันเข้าใจแล้วขอบคุณที่ชี้แจง
Gravitate

20
เข้ามา! หากคุณกำลัง "เติมข้อมูล" บนเซิร์ฟเวอร์คุณจะรู้ว่าจะมีจำนวนเท่าใด และถ้าคุณสามารถ "เติมข้อมูล" โดยใช้ AJAX ได้การแก้ไขแอตทริบิวต์ที่เรียบง่ายก็จะไม่ใช่เรื่องท้าทาย คุณสามารถนับตัวเลือกใน JS ได้หลังจาก "เติมข้อมูล"
Tomasz Gandor

1
มันใช้งานได้ แต่ความสูงของ <select> ก็เพิ่มขึ้นตามขนาดและส่งผลให้เค้าโครงของฉันบิดเบี้ยว ; (-
shubham

67

คุณสามารถทำได้โดยใช้sizeแอตทริบิวต์ในselectแท็ก สมมติว่าคุณมี 8 ตัวเลือกคุณจะทำดังนี้

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

มันใช้งานได้ แต่ความสูงของ <select> ก็เพิ่มขึ้นตามขนาดและส่งผลให้เค้าโครงของฉันบิดเบี้ยว ; (
shubham

วิธีระบุค่านี้ใน css?
Lei Yang

29

เก่า แต่สิ่งนี้จะทำในสิ่งที่คุณต้องการโดยไม่ต้องใช้ jquery ล้นที่ซ่อนอยู่จะกำจัดแถบเลื่อนและจาวาสคริปต์ทำให้มีขนาดที่เหมาะสม

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

และจาวาสคริปต์เพียงเล็กน้อย

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

13

สำหรับ jQuery คุณสามารถลองสิ่งนี้ ฉันมักจะทำสิ่งต่อไปนี้และได้ผล

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

10

คุณสามารถทำได้ใน Javascript / JQuery เท่านั้นคุณสามารถทำได้ด้วย JQuery ต่อไปนี้ (สมมติว่าคุณได้ให้รหัสการเลือกหลายรายการ):

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

การสาธิต: http://jsfiddle.net/AZEFU/


16
ความคิดเดียวกันโดยไม่ต้องอาศัยความสูงของแถว:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas

2
@ FrancescRosàsสมบูรณ์แบบ! สงสารสิ่งนี้ถูกฝังอยู่ในความคิดเห็นแทนที่จะเป็นคำตอบที่ยอมรับ
นิค

5

ฉันรู้ว่าคำถามเก่า แต่จะปิดหัวข้อได้อย่างไรฉันจะให้ความช่วยเหลือ

แอตทริบิวต์ "size" จะช่วยแก้ปัญหาของคุณได้

ตัวอย่าง:

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

2
มีให้เลือก 30 ตัวเลือกเสมอ
Anders Lindén

5

selectอาจมีoptgroupซึ่งใช้เวลาหนึ่งบรรทัด:

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

ในตัวอย่างนี้รวมเป็นsize(1+1)+(1+2)=5


คำตอบทั้งสองข้อข้างต้นถูกต้องในทางเทคนิค แต่นี่เป็นคำตอบที่น่าสนใจกว่า
russellmania

ฉันชอบคำตอบนี้มากกว่าเพราะฉันไม่รู้ว่าจะมีกี่รายการที่จะปรากฏในรายการ แต่ฉันตั้งค่า: l.setAttribute ('size', l.childElementCount +1); (ไม่เพิ่มความยาวเป็นสองเท่าตามที่โค้ดด้านบนแสดง)
Robert Achmann

@RobertAchmann มันไม่ได้เป็นสองเท่า มันรวมจำนวน<optgroup>s และ<option>s
Andrii Nemchenko

3

คุณสามารถทำได้ด้วยจาวาสคริปต์ง่ายๆ ...

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

... หรือจำกัดความสูงจนถึงจำนวนบันทึก ...

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

เห็นได้ชัดว่าสิ่งนี้ใช้ไม่ได้อีกต่อไป งานของฉันคือ$('#firstSelect').attr('size', $('#firstSelect').length);. ดูซอนี้: https://jsfiddle.net/ergt5upf/2/
juntapao

2

ในการลบแถบเลื่อนให้เพิ่ม CSS ต่อไปนี้:

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

นี่คือตัวอย่าง:

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

การใช้แอตทริบิวต์ขนาดเป็นวิธีแก้ปัญหาที่ใช้งานได้จริงที่สุดอย่างไรก็ตามมีความแปลกประหลาดเมื่อนำไปใช้เพื่อเลือกองค์ประกอบที่มีเพียงสองหรือสามตัวเลือก

  • การตั้งค่าแอตทริบิวต์ขนาดเป็น "0" หรือ "1" ส่วนใหญ่จะแสดงองค์ประกอบเลือกเริ่มต้น (แบบเลื่อนลง)
  • การตั้งค่าแอตทริบิวต์ขนาดเป็นค่าที่มากกว่า "1" ส่วนใหญ่จะแสดงรายการการเลือกที่มีความสูงซึ่งสามารถแสดงรายการได้อย่างน้อยสี่รายการ นอกจากนี้ยังใช้กับรายการที่มีเพียงสองหรือสามรายการซึ่งนำไปสู่การเว้นวรรคโดยไม่ได้ตั้งใจ

สามารถใช้ JavaScript แบบง่ายเพื่อตั้งค่าแอตทริบิวต์ขนาดให้เป็นค่าที่ถูกต้องโดยอัตโนมัติเช่นดูซอนี้

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

ดังที่ได้กล่าวไว้ข้างต้นโซลูชันนี้ไม่สามารถแก้ปัญหาได้เมื่อมีเพียงสองหรือสามตัวเลือก


1
วิธีนี้ต้องใช้ jQuery ดังนั้นในความคิดของฉันไม่ใช่ "JavaScript ธรรมดา" นอกจากนี้รหัสนี้ได้แสดงไว้แล้วในคำตอบก่อนหน้านี้ ..
จัดการ

0

เพื่อน: ถ้าคุณดึงข้อมูลจากฐานข้อมูล: คุณสามารถเรียกสิ่งนี้ว่า $ register = * _num_rows (Result_query) จากนั้น

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

0

เมื่อเร็ว ๆ นี้ฉันมีข้อกำหนดนี้และใช้โพสต์อื่นจากคำถามนี้เพื่อสร้างสคริปต์นี้:

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

0

ในการปรับขนาด (ความสูง) ของการเลือกหลายรายการให้เป็นจำนวนตัวเลือกให้ใช้ jQuery:

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

0

คุณสามารถนับแท็กตัวเลือกก่อนจากนั้นตั้งค่าจำนวนสำหรับแอตทริบิวต์ขนาด ตัวอย่างเช่นใน PHP คุณสามารถนับอาร์เรย์แล้วใช้ foreach loop สำหรับอาร์เรย์

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

วิธีการแสดงผลกล่องเลือกจะถูกกำหนดโดยเบราว์เซอร์เอง ดังนั้นทุกเบราว์เซอร์จะแสดงความสูงของกล่องรายการตัวเลือกในความสูงอื่น คุณไม่สามารถมีอิทธิพลต่อสิ่งนั้นได้ วิธีเดียวที่คุณสามารถเปลี่ยนแปลงได้คือทำการเลือกเองตั้งแต่ต้น


-1

นี่คือตัวอย่างการใช้งานแพ็คเกจซึ่งค่อนข้างเป็นที่นิยมในชุมชน 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' : ''),
]) !!}

แพ็คเกจ: https://laravelcollective.com/


1
นั่นไม่ใช่ Laravel นั่นคือแพ็คเกจ Laravel
อารมณ์

1
ขอบคุณสำหรับการแก้ไข ฉันกำลังจะอัปเดตโพสต์
Sinan Eldem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.