複数選択して、スクロールバーなしでオプションに合わせて高さを調整します


103

どうやらこれは動作しません:

   select[multiple]{
     height: 100%;
   }

選択するとページの高さが100%になります...

auto どちらも機能しませんが、垂直スクロールバーが表示されます。

他のアイデアはありますか?

ここに画像の説明を入力してください


1
JavaScriptの使用に悩んでいると思います。選択ボックスにcssのみを自動的に引き伸ばしてコンテンツを含める方法はないと思います。
random_user_name 2012年

純粋なCSSソリューション:stackoverflow.com/a/55969271/7910454
leonheess

回答:


147

私はあなたがsize属性を使用できると思います。最近のすべてのブラウザで動作します。

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

2
こんにちは、これは機能しないという質問で述べられたものとどう違うのですか?
2012

2
こんにちは。サイズ属性を具体化しているため、違います。最初の質問は高さの属性のみを参照しています
Alex

2
ああ。実際にボックスがコンテンツのサイズに縮小されるわけではありません。数値のサイズ値を手動で設定する必要があります。オプションの数がわかっている場合は問題ありませんが、動的な数のオプションがある場合はさらに問題があります。 。その場合、ボックスにデータを入力するときにサイズ属性のサイズ変更を設定する必要があります。わかりました。ありがとうございます。
2012

20
あら、どうぞ!サーバーに「データを設定」している場合は、サーバーの数がわかります。また、AJAXを使用して「入力」できる場合、適度な属性を変更することは簡単です。「ポピュレート」した後、JSでオプションを数えることもできます。
Tomasz Gandor 2013年

1
それは機能しましたが、サイズに従って<select>の高さが増加し、その結果、レイアウトが歪んでいます。;(–
shubham 2017

67

タグのsize属性を使用してこれを行うことができますselect。8つのオプションがあるとすると、次のようになります。

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

それは機能しましたが、サイズに従って<select>の高さが増加し、その結果、レイアウトが歪んでいます。;(
shubham 2017

この値をCSSで指定するにはどうすればよいですか?
レイヤン

29

古いですが、これはjqueryを必要とせずにあなたが望んでいることを行います。非表示のオーバーフローはスクロールバーを取り除き、JavaScriptはそれを適切なサイズにします。

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

そしてほんの少しのJavaScript

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

13

jQueryの場合、これを試すことができます。私は常に次のことを行い、うまくいきます。

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

10

これはJavascript / JQueryでのみ実行できます。次のJQueryを使用して実行できます(selectにmultiselectのIDを指定した場合)。

$(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パーフェクト!残念ながら、これは受け入れられた回答ではなく、コメントに埋め込まれています。
Nickは

5

質問が古いのはわかっていますが、トピックが閉じられていないので、私は手伝います。

属性「サイズ」は問題を解決します。

例:

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

2
選択に常に30のオプションがあることを条件とします。
AndersLindén2018年

5

selectoptgroupそれぞれに1行かかるものを含めることができます。

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

リストに表示される項目の数がわからないので、私はこの答えを好みます。しかし、私は次のものだけを設定します:l.setAttribute( 'size'、l.childElementCount +1); (上記のコードが示すように長さを2倍にすることはできません)
Robert Achmann

@RobertAchmannサイズは2倍になりません。<optgroup>sと<option>sの数を合計します。
Andrii Nemchenko

3

あなたは簡単なjavascriptでこれを行うことができます...

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

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

size属性を使用することが最も実用的なソリューションですが、2つまたは3つのオプションのみを持つ要素を選択するために適用する場合、問題があります。

  • サイズ属性値を「0」または「1」に設定すると、ほとんどの場合、デフォルトの選択要素(ドロップダウン)がレンダリングされます。
  • サイズ属性を「1」より大きい値に設定すると、ほとんどの場合、少なくとも4つの項目を表示できる高さの選択リストがレンダリングされます。これは、アイテムが2つまたは3つしかないリストにも当てはまり、意図しない空白が生じます。

単純なJavaScriptを使用して、サイズ属性を正しい値に自動的に設定できます。たとえば、このフィドルを参照してください。

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

上記のように、このソリューションは、2つまたは3つのオプションしかない場合の問題を解決しません。


1
このソリューションにはjQueryが必要なので、私の意見では「単純なJavaScript」ではありません。また、このコードはすでに..以前の回答で示されている
ハンドル

0

フレンズ:DBからデータを取得する場合:これを$ registers = * _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)
})

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