Thực hiện nhiều lựa chọn để điều chỉnh chiều cao của nó cho phù hợp với các tùy chọn mà không cần thanh cuộn


103

Rõ ràng điều này không hoạt động:

   select[multiple]{
     height: 100%;
   }

nó làm cho vùng chọn có chiều cao trang 100% ...

auto cũng không hoạt động, tôi vẫn nhận được thanh cuộn dọc.

Bất kỳ ý tưởng khác?

nhập mô tả hình ảnh ở đây


1
Tôi nghĩ rằng bạn đang gặp khó khăn với việc sử dụng một số javascript. Tôi không tin rằng có cách để hộp chọn tự động kéo dài chỉ css để chứa nội dung.
random_user_name

Giải pháp CSS thuần túy: stackoverflow.com/a/55969271/7910454
leonheess

Câu trả lời:


147

Tôi đoán bạn có thể sử dụng sizethuộc tính. Nó hoạt động trong tất cả các trình duyệt gần đây.

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

2
Xin chào, Điều này khác với những gì đã nêu trong câu hỏi không hoạt động như thế nào?
Hút

2
Xin chào, nó khác vì nó bao gồm thuộc tính size. Câu hỏi ban đầu chỉ đề cập đến các thuộc tính chiều cao
Alex

2
À được rồi. Nó không thực sự làm cho hộp thu nhỏ kích thước của nội dung, bạn phải đặt giá trị kích thước số theo cách thủ công, điều này tốt nếu bạn biết có bao nhiêu tùy chọn nhưng vấn đề nhiều hơn nếu có một số tùy chọn động . Trong trường hợp đó, bạn sẽ phải đặt thay đổi kích thước thuộc tính kích thước khi bạn điền vào hộp. Tôi thấy bây giờ, cảm ơn đã làm rõ.
Hấp dẫn

20
Oh, thôi nào! Nếu bạn đang "cư trú" trên máy chủ, thì bạn biết sẽ có bao nhiêu cái. Và nếu bạn có thể "cư trú" bằng AJAX, việc sửa đổi một thuộc tính khiêm tốn sẽ không có gì là thách thức. Bạn thậm chí có thể đếm các tùy chọn trong JS sau khi "điền".
Tomasz Gandor

1
Nó hoạt động, nhưng chiều cao của <select> cũng tăng lên theo kích thước và kết quả là làm sai lệch bố cục của tôi. ; (-
shubham

67

Bạn có thể làm điều này bằng cách sử dụng sizethuộc tính trong selectthẻ. Giả sử bạn có 8 tùy chọn, sau đó bạn sẽ làm như sau:

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

Nó hoạt động, nhưng chiều cao của <select> cũng tăng lên theo kích thước và kết quả là làm sai lệch bố cục của tôi. ; (
shubham

làm thế nào để chỉ định giá trị này trong css?
Lei Yang

29

Cũ, nhưng điều này sẽ làm những gì bạn đang theo đuổi mà không cần jquery. Phần tràn ẩn sẽ loại bỏ thanh cuộn và javascript làm cho nó có kích thước phù hợp.

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

Và chỉ một lượng nhỏ javascript

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

13

Đối với jQuery, bạn có thể thử điều này. Tôi luôn làm những điều sau đây và nó hoạt động.

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

10

Bạn chỉ có thể thực hiện việc này trong Javascript / JQuery, bạn có thể thực hiện điều đó với JQuery sau (giả sử bạn đã cung cấp cho mình một id gồm nhiều lựa chọn):

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

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


16
Các ý tưởng tương tự mà không dựa vào chiều cao hàng:$('select.expandable').each(function() { $(this).attr('size', $(this).find('option').length) })
Francesc Rosas

2
@ FrancescRosàs Hoàn hảo! Đáng tiếc, điều này bị chôn vùi trong một bình luận thay vì là câu trả lời được chấp nhận.
Nick

5

Tôi biết câu hỏi đã cũ, nhưng làm thế nào để chủ đề không bị đóng, tôi sẽ giúp đỡ.

Thuộc tính "size" sẽ giải quyết vấn đề của bạn.

Thí dụ:

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

2
Với điều kiện luôn có 30 tùy chọn trong lựa chọn.
Anders Lindén

5

selectcó thể chứa optgroupmỗi dòng có một dòng:

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

Trong ví dụ này, tổng số size(1+1)+(1+2)=5.


Cả hai câu trả lời trên đều đúng về mặt kỹ thuật, nhưng đây là câu trả lời thú vị hơn.
russellmania

Tôi thích câu trả lời này hơn vì tôi không biết có bao nhiêu mục sẽ xuất hiện trong danh sách. Nhưng tôi chỉ đặt: l.setAttribute ('size', l.childElementCount +1); (không tăng gấp đôi chiều dài như đoạn mã trên chương trình)
Robert Achmann

@RobertAchmann Nó không tăng gấp đôi kích thước. Nó tính tổng số <optgroup>s và <option>s.
Andrii Nemchenko

3

Bạn có thể làm điều này với javascript đơn giản ...

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

... hoặc giới hạn chiều cao cho đến khi số lượng bản ghi ...

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

Rõ ràng, điều này không hoạt động nữa. Công việc của tôi xung quanh là $('#firstSelect').attr('size', $('#firstSelect').length);. Nhìn vào trò chơi này: https://jsfiddle.net/ergt5upf/2/
juntapao

2

Để xóa thanh cuộn, hãy thêm CSS sau:

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

Đây là một đoạn mã:

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

Sử dụng thuộc tính kích thước là giải pháp thiết thực nhất, tuy nhiên có những điều kỳ quặc khi nó được áp dụng để chọn các phần tử chỉ có hai hoặc ba tùy chọn.

  • Đặt giá trị thuộc tính kích thước thành "0" hoặc "1" hầu hết sẽ hiển thị phần tử chọn mặc định (trình đơn thả xuống).
  • Đặt thuộc tính kích thước thành giá trị lớn hơn "1" hầu hết sẽ hiển thị danh sách lựa chọn có chiều cao có khả năng hiển thị ít nhất bốn mục. Điều này cũng áp dụng cho danh sách chỉ có hai hoặc ba mục, dẫn đến khoảng trắng ngoài ý muốn.

JavaScript đơn giản có thể được sử dụng để tự động đặt thuộc tính size thành giá trị chính xác, ví dụ: xem fiddle này .

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

Như đã đề cập ở trên, giải pháp này không giải quyết được vấn đề khi chỉ có hai hoặc ba lựa chọn.


1
Giải pháp này yêu cầu jQuery và do đó theo tôi không phải là "JavaScript đơn giản". Ngoài ra, mã này đã được hiển thị trong các câu trả lời trước đó ..
xử lý

0

bạn bè: nếu bạn truy xuất dữ liệu de từ một DB: bạn có thể gọi đây là $ register = * _num_rows (Result_query) sau đó

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

0

Tôi đã có yêu cầu này gần đây và đã sử dụng các bài đăng khác từ câu hỏi này để tạo tập lệnh này:

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

0

Để điều chỉnh kích thước (chiều cao) của tất cả các lựa chọn theo số lượng tùy chọn, hãy sử dụng jQuery:

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

0

Trước tiên, bạn có thể đếm thẻ tùy chọn, sau đó đặt số lượng cho thuộc tính kích thước. Ví dụ, trong PHP, bạn có thể đếm mảng và sau đó sử dụng vòng lặp foreach cho mảng.

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

Cách hiển thị hộp chọn do chính trình duyệt xác định. Vì vậy, mọi trình duyệt sẽ hiển thị cho bạn chiều cao của hộp danh sách tùy chọn ở một chiều cao khác. Bạn không thể ảnh hưởng đến điều đó. Cách duy nhất bạn có thể thay đổi đó là thực hiện một lựa chọn riêng từ đầu.


-1

Đây là cách sử dụng gói mẫu, khá phổ biến trong cộng đồng 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' : ''),
]) !!}

Gói: https://laravelcollective.com/


1
Đó không phải là Laravel, đó là một gói Laravel.
emotality

1
Cảm ơn đã sửa chữa. Tôi sẽ cập nhật bài viết.
Sinan Eldem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.