100%幅のテキストボックスがコンテナを超えて拡張するのを停止できますか?


181

行全体を埋めるテキストボックスがあるとします。私はそれに次のようなスタイルを与えます:

input.wide {display:block; width: 100%}

幅はテキストボックスの内容に基づいているため、これにより問題が発生します。テキストボックスには、デフォルトでマージン、ボーダー、パディングがあり、幅が100%のテキストボックスはコンテナよりも大きくなります。

たとえば、ここの右側:

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

テキストボックスがコンテナの幅を超えて拡大することなく、コンテナの幅を満たす方法はありますか

ここに私が何を意味するかを示すいくつかのHTMLの例があります:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
    <style type="text/css">
        #outer{border: 1px solid #000; width: 320px; margin: 0px;padding:0px}
        #inner{margin: 20px; padding: 20px; background: #999;border: 1px solid #000;}
        input.wide {display:block; margin: 0px}
        input.normal {display:block; float: right}
    </style>
</head>
<body>
    <div id="outer">
        <div id="inner">
            <input type="text" class="wide" />
            <input type="text" class="normal" />
            <div style="clear:both;"></div>
        </div>
    </div>
</body>
</html>

これを実行すると、「通常の」テキストボックスを見ると、「幅の広い」テキストボックスがコンテナの外に突き出ていることがわかります。「通常の」テキストボックスは、コンテナの実際の端にフロートします。「通常の」テキストボックスのように端を超えて拡大することなく、「幅の広い」テキストボックスをコンテナいっぱいに表示しようとしています。

回答:


87

あなたができることは、デフォルトの「エクストラ」を削除することですinput

input.wide {display:block; width:100%;padding:0;border-width:0}

これによりinput、コンテナの内部が保持されます。あなたが国境をしたいならば今、ラップinputdiv上に設定国境で、div(途中削除できることdisplay:blockからinput、あまりにも)。何かのようなもの:

<div style="border:1px solid gray;">
 <input type="text" class="wide" />
</div>

編集: 別のオプションは、からスタイルを削除する代わりinputに、ラップされたスタイルで補正することですdiv

input.wide {width:100%;}

<div style="padding-right:4px;padding-left:1px;margin-right:2px">
  <input type="text" class="wide" />
</div>

これにより、ブラウザによって結果が多少異なりますが、コンテナとは重なりません。divの値は、境界線の大きさと境界線とのinput間に必要なスペースの大きさによって異なりますinput


3
これは非常にクリエイティブなソリューションです。JavaScriptを使用してラッパーdivの境界線を変更しない限り、フォーカスを得たときにテキストボックスにアウトラインを定義できないという唯一の問題があります。
ダンハーバート

@DanHerbert、そうです、それはこの方法の主要なUXの欠陥です
Baumr

275

テキストボックスがコンテナの幅を超えて拡大することなく、コンテナの幅を満たす方法はありますか

はい:CSS3プロパティ 'box-sizing:border-box'を使用することで、外部パディングとボーダーを含めるための「幅」の意味を再定義できます。

残念ながら、CSS3であるため、サポートはあまり成熟しておらず、仕様プロセスがまだ完了していないため、ブラウザでは一時的な名前が異なります。そう:

input.wide {
    width: 100%;
    box-sizing: border-box;
    -moz-box-sizing: border-box;
    -webkit-box-sizing: border-box;
}

昔ながらの代替手段は、囲んでいる<div>要素または<td>要素に、「px」の左右のパディング/ボーダーがブラウザでどれだけ追加されるかと等しい量の「padding-right」を配置することです入力を与えます。(通常、IE <8の場合は6ピクセル)。


私はおそらくこれを何年もサポートしないモバイルデバイスをターゲットにしているので、これを使用できないことを除いて、これはうまくいきます。:-\
ダンハーバート

20
モバイルデバイスはコンピューターよりもHTML5を完全にサポートするようになると思います。
マリアーノカヴァッロ

4
@Kindred:IEMobileとBlackberryが含まれている場合は間違いありません。
ボビンス

1
これは、しかし、デスクトップブラウザのための素晴らしいサポートを持っていますquirksmode.org/css/contents.htmlを
ローガン

2
この素晴らしいバターソースを見つけるのに、これほど長くかかったのはなぜですか?これを受け入れられた回答にしてもいいですか?
streetlogics 2013

14

これで問題は解決しました!

外部divは必要ありません。指定したテキストボックスに適用するだけです。

box-sizing: border-box; 

このプロパティを使用すると、「幅と高さのプロパティ(および最小/最大のプロパティ)にはコンテンツ、パディング、境界線は含まれますが、マージンは含まれません」

w3schoolsのプロパティの説明を参照してください。

これが誰かを助けることを願っています!


素晴らしくシンプル!どうも!
nurider

10

私自身がこの問題に遭遇したばかりであり、すべてのテストブラウザ(IE6、IE7、Firefox)で機能することがわかった唯一の解決策は次のとおりです。

  1. 入力フィールドを2つの個別のDIVでラップする
  2. 外側のDIVを幅100%に設定します。これにより、コンテナーがドキュメントからオーバーフローするのを防ぎます
  3. 入力の水平オーバーフローを補正するために、正確な量の内側のDIVにパディングを配置します。
  4. 入力にカスタムパディングを設定して、内側のDIVで許可したのと同じ量でオーバーフローするようにします

コード:

<div style="width: 100%">
    <div style="padding-right: 6px;">
        <input type="text" style="width: 100%; padding: 2px; margin: 0;
                                  border : solid 1px #999" />
    </div>
</div>

ここでは、入力要素の合計水平オーバーフローは6px-2x(パディング+ボーダー)-なので、内側のDIVのパディング右を6pxに設定します。


input要素に8pxのパディングを追加すると機能しなくなります
JuHwon

7

実際のボックスサイズのサポートはかなり良いです:http : //caniuse.com/#search=box-sizing

したがって、IE7を対象としない限り、このプロパティを使用してこの種の問題を解決できるはずです。sass以下などのレイヤーを使用すると、このような接頭辞付きのルールを簡単に処理できます。


3

実際には、CSSがマージン、ボーダー、パディングを含むコンテナーの幅全体に対して100%を定義しているためです。つまり、スペースが有効であることを意味します。コンテナにマージン、境界線、またはパディングがない場合を除いて、そのコンテンツに対する量は100%未満です。

これは直観に反しており、多くの人が私たちが今直面している間違いであると広く認識しています。これは事実上、%寸法がトップレベルのコンテナー以外には何の役にも立たないことを意味します。それでも、マージン、境界線、またはパディングがない場合のみです。

テキストフィールドのマージン、ボーダー、パディング、それに指定されたCSSサイズに含まれていることに注意してください-物事をスローするのはコンテナです。

私は許容範囲内で98%を使用して回避しましたが、コンテナーが大きくなると入力フィールドがさらに短くなる傾向があるため、完全なソリューションとは言えません。


編集:私はこの同様の質問に出くわしました-私は与えられた答えを試したことはありません、そしてそれがあなたの問題に当てはまるかどうか確かではありませんが、そうなるようです。


1

うまくいく(私にとってはうまくいく)1つの解決策は、入力(テキストボックス)に負のマージンを適用するか、ie7に固定幅を適用するか、ie7サポートを削除することです。この結果、ピクセルは完璧な幅になります。私にとっては7なので、3と4を追加しましたが、それでもピクセルは完璧です。

私は同じ問題を抱えていたので、ボーダーなどに余分なdivが必要でした!

だから、これはうまくいくように見える私の解決策です!

スターハックを回避するには、ie7のみのスタイルシートを使用する必要があります。

input.text{
    background-color: #fbfbfb;
    border : solid #eee 1px;
    width: 100%;
    -box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    height: 32px;

    *line-height:32px;
    *margin-left:-3px;
    *margin-right:-4px;
    display: inline;   
    padding: 0px 0 0 5px;

}

1

使用できない場合box-sizing:border-boxwidth:100%、を削除sizeして<input>要素に非常に大きな属性を配置してみてください。ただし、HTMLを変更する必要があり、CSSだけではそれができないという欠点があります。

<input size="1000"></input>

0

動的に行う必要がない場合(たとえば、フォームの幅が固定されている場合)は、子<input>要素の幅を、コンテナの幅からパディング、マージン、ボーダーなどの装飾を差し引いて設定できます。

 // the parent div here has a width of 200px:
.form-signin input[type="text"], .form-signin input[type="password"], .form-signin input[type="email"], .form-signin input[type="number"] {
  font-size: 16px;
  height: auto;
  display: block;
  width: 280px;
  margin-bottom: 15px;
  padding: 7px 9px;
}

0

ボックスサイズを使用できない場合(iTextを使用してHTMLをPDFに変換する場合など)。これを試して:

CSS

.input-wrapper { border: 1px solid #ccc; padding: 0 5px; min-height: 20px; } 
.input-wrapper input[type=text] { border: none; height: 20px; width: 100%; padding: 0; margin: 0; }

HTML

<div class="input-wrapper">
     <input type="text" value="" name="city"/>
</div>

0

これは機能します:

<div>
    <input type="text" 
        style="margin: 5px; padding: 4px; border: 1px solid; 
        width: 200px; width: calc(100% - 20px);">
</div>

最初の「幅」は、古いブラウザのフォールバックルールです。


0

余分なパディングのために入力をオフセットするようにスタイルするだけです。次の例では、入力のパディングは左右に10pxで、パディングオフセットの合計は20pxになります。

input[type=text]{
   width: calc(100% - 20px);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.