コンテナの残りの幅を満たすためにスタイル入力要素


196

次のようなHTMLスニペットがあるとします。

<div style="width:300px;">
    <label for="MyInput">label text</label>
    <input type="text" id="MyInput" />
</div>

これは私の正確なコードではありませんが、重要なことは、固定幅のコンテナー内の同じ行にラベルとテキスト入力があることです。ラッピングせず、ラベルのサイズを知らなくても、コンテナーの残りの幅を満たすように入力をスタイル設定するにはどうすればよいですか?


私は質問がずっと前だったことを知っていますが、もちろん古くはない良い解決策を追加します。
danijar

回答:


137

レイアウトのためにテーブルが嫌いなのと同じくらい、彼らは明示的なテーブルタグを使用するか、display:table-cellを使用して、このようなことを助けます

<div style="width:300px; display:table">
    <label for="MyInput" style="display:table-cell; width:1px">label&nbsp;text</label>
    <input type="text" id="MyInput" style="display:table-cell; width:100%" />
</div>

これはIE6で動作しますか?そうでなければ、実際にこれのために小さなテーブルを定義しなければならないかもしれません:(
Joel Coehoorn

ないように注意してください、私は彼らが何を見て簡単なテストを行うと言うだろうが、私はIEに簡単にアクセスがありません
cobbal

それは大丈夫です:これは私に何かがうまくいくように向けました。
Joel Coehoorn、2009

42
ジョエルを共有しますか?
ジョン

10
同意します。実際の解決策を私たち全員と共有し、代わりにそれを答えとしてマークする必要があります。
BrainSlugs83 2012年

155

JavaScriptまたはテーブルレイアウトハックを使用しないシンプルでクリーンなソリューションを次に示します。それはこの答えに似ています:入力テキストの自動幅は他の要素がフローティングで100%埋めます

入力フィールドを次のスパンでラップすることが重要です display:block。次に、ボタンを最初に、入力フィールドを2番目に配置する必要があります。

次に、ボタンを右にフロートすると、入力フィールドが残りのスペースを埋めます。

form {
    width: 500px;
    overflow: hidden;
    background-color: yellow;
}
input {
    width: 100%;
}
span {
    display: block;
    overflow: hidden;
    padding-right:10px;
}
button {
    float: right;
}
<form method="post">
     <button>Search</button>
     <span><input type="text" title="Search" /></span>
</form>

簡単なフィドル:http : //jsfiddle.net/v7YTT/90/

アップデート1:ウェブサイトが最新のブラウザのみをターゲットにしている場合は、フレキシブルボックスを使用することをお勧めします。ここでは、現在のサポートを確認できます。

更新2:これは、入力フィールドとフルを共有する複数のボタンまたは他の要素でも機能します。以下に例を示します。


ただし、これによりhtmlが変更されます。最後に必要なアイテムは、htmlの最初にリストされます。
Joel Coehoorn 2013年

@JoelCoehoorn、そうです。テーブルを使用するよりもそれを好むかどうかはあなたの決定です。
danijar 2013年

2
これはうまくいきます。facebookスタイルのタガーなどを作成するには、rightではなくfloat:leftを使用します。
hobberwickey 14

1
これはうまくいきます!しかし、これがどのように機能するかの背後にある論理を誰かが説明できますか?
シャーロック2014

1
これは悪い答えです。見ただけでうまくいくようですが、いじってみてください。実際には入力ボックスの半分を切り刻んでいますが、テストを開始しないとわかりません。目標は、入力ボックスを表示領域の幅に合わせることであり、切り詰めることではありません。スタイリング(角の丸い、境界線、テキストの右揃え)を実行しようとすると、完全に失敗します。
ロジャーヒル

55

フレックスボックスの使用をお勧めします:

ただし、適切なベンダープレフィックスを必ず追加してください。

form {
  width: 400px;
  border: 1px solid black;
  display: flex;
}

input {
  flex: 2;
}

input, label {
  margin: 5px;
}
<form method="post">
  <label for="myInput">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input"/>
</form>


質問は非常に古いです...これはおそらく私が今日それをする方法です。試してみる機会があり、必要なすべてのブラウザで動作する場合は、承認された回答を更新します。たぶん、これを試してみるにはかなり時間がかかるでしょう。私は現在システム管理チームに所属しています。これ以上Webに関することはしないでください。
Joel Coehoorn、2014

を使用した例を提供できますlabelか?私は特に、元の質問のHTMLがborder-box... を使用してレイアウトされる方法に興味があります
lacco

4
なぜflex: 2ありませんかflex: 1
Iulius Curt

42

これにはflexboxを使用してください。子を1行に変更するコンテナーがあります。最初の子は、必要に応じてスペースを取ります。もう1つは、残りのすべてのスペースを取るために屈曲します。

<div style="display:flex;flex-direction:row">
    <label for="MyInput">label&nbsp;text</label>
    <input type="text" id="MyInput" style="flex:1" />
</div>


ハイファイブ!:)追加する価値があることの1つ(まだ多くのフレックスボックスモデルを採用している私たちのコンテキストでは):そのINPUTはFORMになり、最終的には全体のフレックスコンテナー(たとえば、他の非フォームのもの)になる可能性があります)、その後、機能しなくなります。フレックス動作は直接の子孫(つまり子要素)にのみ適用されるためです。したがって、FORMもフレックスコントレイナーである必要があります。
Sz。

flex-directionはすでにrowデフォルトであり、指定する必要はありません。
Fabian Picone

勝利のためのフレックス(再び)。2019年に非常に関連した答え
secretwep

17

これを実現する最も簡単な方法は次のとおりです。

CSS:

label{ float: left; }

span
{
    display: block;
    overflow: hidden;
    padding-right: 5px;
    padding-left: 10px;
}

span > input{ width: 100%; }

HTML:

<fieldset>
    <label>label</label><span><input type="text" /></span>
    <label>longer label</label><span><input type="text" /></span>
</fieldset>

のように見えます: http : //jsfiddle.net/JwfRX/


これは私にはうまくいきます。オーバーフローは物事が折り返されないようにし、パディング右は右側が切り落とされないようにします。
Von Lemongargle教授2013年

PS:最近のブラウザでは、上記の
leishmanの

4

非常に簡単なトリックは、CSS calc数式を使用することです。最新のすべてのブラウザー、IE9、幅広いモバイルブラウザーがこれをサポートする必要があります。

<div style='white-space:nowrap'>
  <span style='display:inline-block;width:80px;font-weight:bold'>
    <label for='field1'>Field1</label>
  </span>
  <input id='field1' name='field1' type='text' value='Some text' size='30' style='width:calc(100% - 80px)' />
</div>

4
これは、ラベルの正確な幅を知っているか、余分なスペースを用意しても構わないと想定しています。
ネルソンロザーメル2015年

2

あなたはこれを試すことができます:

div#panel {
    border:solid;
    width:500px;
    height:300px;
}
div#content {
	height:90%;
	background-color:#1ea8d1; /*light blue*/
}
div#panel input {
	width:100%;
	height:10%;
	/*make input doesnt overflow inside div*/
	-webkit-box-sizing: border-box;
       -moz-box-sizing: border-box;
            box-sizing: border-box;
	/*make input doesnt overflow inside div*/
}
<div id="panel">
  <div id="content"></div>
  <input type="text" placeholder="write here..."/>
</div>


今日の最良の方法
yota

0

Bootstrap 4を使用している場合:

<form class="d-flex">
  <label for="myInput" class="align-items-center">Sample label</label>
  <input type="text" id="myInput" placeholder="Sample Input" class="flex-grow-1"/>
</form>

さらに良いことに、Bootstrapに組み込まれているものを使用します。

  <form>
    <div class="input-group">
      <div class="input-group-prepend">
        <label for="myInput" class="input-group-text">Default</label>
      </div>
      <input type="text" class="form-control" id="myInput">
    </div>
  </form>

https://jsfiddle.net/nap1ykbr/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.