要素の幅を作る方法:100%マイナスパディング?


397

HTML入力があります。

入力にはpadding: 5px 10px;、親divの幅(流体)の100%にする必要があります。

しかし、使用するwidth: 100%;と、入力は100% + 20pxどうすればこれを回避できますか?


1
この回答を参照してください。私は15分前にいない投稿:stackoverflow.com/questions/5219030/...あなたはIE7で動作するように、それを必要としない限り、これがあなたのために完璧に動作するはずです。
thirtydot 2011年

私の方法を使用した場合は、私の答えに加えたわずかな編集を参照してください。一部のブラウザでは「均等なパディング」が保証されます。
thirtydot 2011年

@Hailwood私はinputIE7のパディングとサポートを維持するソリューションを持っています
Vladimir Starkov

計算機能を使用して以下の回答もご覧ください
Daan

回答:


486

box-sizing: border-box それを修正するための迅速で簡単な方法です:

これは、すべての最新のブラウザ、およびIE8 +で機能します。

ここにデモがあります:http : //jsfiddle.net/thirtydot/QkmSk/301/

.content {
    width: 100%;
    box-sizing: border-box;
}

ブラウザのプレフィックス付きバージョン(-webkit-box-sizingなど)は、最新のブラウザでは必要ありません。


5
これはそれほど悪い解決策ではないと思います。通常、追加のdivで要素をラップすることは、要素の全体の幅をその親コン​​テナーを超えてプッシュせずに要素を埋め込むための良い方法です。
ジェイクウィルソン

1
ラッピングdivをパディングすると、入力に直接パディングを追加した場合と同じ結果が得られません。
Felix Fung

@thirtydot私は入力の幅を維持するいくつかのより柔軟でエレガントなソリューションを持っています
Vladimir Starkov '28

8
@thirtydotええ、IE7にそのままにして、M $に修正させてください:)
Petr Peller

これにより、非表示のdivに適用しない限り、jQuery担当者のテキスト領域の自動サイズ変更とボックスサイズの変更が保持されます。
マイケルJ.カルキンス2013

276

これがbox-sizingCSSにある理由です。

あなたの例を編集しましたが、今ではSafari、Chrome、Firefox、Operaで動作します。チェックしてみてください:http : //jsfiddle.net/mathias/Bupr3/ 追加したのはこれだけです:

input {
  -webkit-box-sizing: border-box;
     -moz-box-sizing: border-box;
          box-sizing: border-box;
}

残念ながら、IE7などの古いブラウザはこれをサポートしていません。古いIEで機能するソリューションを探している場合は、他の回答を確認してください。


3
+1、しかしcaniuse.com/#search=box-sizing IE 8?また、github.com / Schepp / box-sizing-polyfillはIE 6-7のソリューションを提供するようです。
Alix Axel

1
+1、これはIEを気にしない場合に最適です(たとえば、PhoneGapを使用している場合)
Luke B.

3
これはどんな魔法ですか?私の上の回答の+1とコメントの+1(それがまさに私が必要としていることです)。
Eduard Luca

20
これは、デフォルトの動作であるはずです。幅の+20ではなく。CSSがひどく混乱しているように見えることがあります。
Soth 2013年

2
IEでのボックスサイズのサポートを明確にするために、IEボックスサイズプロパティはIEドキュメントモードに依存するため、「IE8標準モード」以上で機能します。そのため、ドキュメントモードが「IE8標準モード」の場合でも、IE8ブラウザーバージョンで動作します。お役に立てれば。
Sanjeev 2014年

40

パーセンテージでもパディングを使用し、幅から削除します。

パディング:5%;
幅:90%;

19
Fyi、このソリューションは、柔軟性のないレイアウトにのみ理想的です。
マフ

+1、これの問題は私が推測している国境でしょう。通常、それらは最大1〜3ピクセルで「正しく」見えるだけです。サブピクセルの丸めに関するブラウザーの不整合を考慮すると、結果は予測不可能です。
Alix Axel

27

あなたは使用せずにそれを行うことができますbox-sizingし、明確ではないようなソリューションをwidth~=99%

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

  • 入力を保持しpaddingborder
  • 負の水平方向の入力に追加margin= border-width+horizontal padding
  • 前のステップpaddingと等しい水平方向の入力のラッパーに追加しますmargin

HTMLマークアップ:

<div class="input_wrap">
    <input type="text" />
</div>

CSS:

div {
    padding: 6px 10px; /* equal to negative input's margin for mimic normal `div` box-sizing */
}

input {
    width: 100%; /* force to expand to container's width */ 
    padding: 5px 10px;
    border: none;
    margin: 0 -10px; /* negative margin = border-width + horizontal padding */ 
}

4
これは、入力のマージンとラッパーのパディングを使用して入力パディングを補正するのに適した方法です。
maulik13

完全に同意する!!! 私はこのソリューションを使用しましたが、汚れたトリックなしで広く機能します!これは。これらの答えのすべての種類を解決しなければならなかった
アンドレ・フィゲイレド

負のマージンがどのような役割を果たしているのかよくわかりません。値が間違っている場合、ボックスが片側になってしまうことはわかっていますが、対称マージンがこれを修正しています
Casebash

21

css calc()を使用する

超シンプルで素晴らしい。

input {
    width: -moz-calc(100% - 15px);
    width: -webkit-calc(100% - 15px);
    width: calc(100% - 15px);
}​

ここに見られるように:Div幅100%からピクセルの固定量を引いたもの
webvitaly(https://stackoverflow.com/users/713523/webvitaly
元のソース:http : //web-profile.com.ua/css/dev/css -width-100prc-minus-100px /

他のスレッドでは見逃していたので、ここにコピーしました。


ただし、手動でプログラムする必要があります。理想的には、自動的に決定されます。
JackHasaKeyboard 2017

11

私が15pxのパディングのあるコンテナにいると仮定すると、これは常に内部で使用するものです。

width:auto;
right:15px;
left:15px;

これにより、内側の部分が幅15px未満になるように、両側が引き伸ばされます。


フィールドにwidth:auto適用された完全な例を投稿できますinputか?
ジャクビゾン、2014

それは答えの半分だけです。要素のデフォルトの位置は静的なので、左と右はここではまったく何もしません。また、幅autoも初期値なので、この答えは何もしません:)
honk31

5

いくつかの位置決めトリックを試すことができます。position: relative高さを固定してdivに入力を置き、次に入力position: absolute; left: 0; right: 0;にと任意のパディングを付けることができます。

実例


これをどのブラウザでテストしましたか?:(
thirtydot

うーん、Chromeでのみ機能します。しかし、FFとIEでの作業に非常によく似たものを得たことも知っています。
Felix

<input>Firefoxの要素では機能しないようです(IEについてはidk)。<div>ただし、sでは機能します。そして、いや、display: block上の<input>いずれかの動作しません: - /
フェリックス

5

これはcodeontrack.comからの推奨事項であり、優れたソリューションの例があります。

divの幅を100%に設定する代わりに、自動に<div>設定し、必ずがdisplay:block(のデフォルト<div>)に設定されていることを確認してください。


3
リンクを直接投稿しないでください。そのリンクからの情報を含めることができます。理由ビーイングは、リンクが使用できないとあなたの答え意志その後、もはや有効で...ということ明日かもしれ、である
Amnesh Goelさん

4

入力ボックスのパディングをラッパー要素に移動します。

<style>
div.outer{ background: red; padding: 10px; }
div.inner { border: 1px solid #888; padding: 5px 10px; background: white; }
input { width: 100%; border: none }
</style>

<div class="outer">
    <div class="inner">
       <input/>
    </div>
</div>

こちらの例をご覧ください:http : //jsfiddle.net/L7wYD/1/


2

width:autoの違いを理解してください。と幅:100%; 幅:自動; (AUTO)MATICALLYは、パディングを含むラッピングdivの指定されたと正確に一致するように幅を計算します。幅100%は幅を拡張し、パディングを追加します。


これが<input>で機能する例を含めることができますか?それ以外の場合は、野生のガチョウを追いかけているだけです。
リスター氏



-1

私にとって、を使用してmargin:15px;padding:10px 0 15px 23px;width:100%、結果はこれでした:

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

私の解決策はのwidth:auto代わりに使用することでしたwidth:100%。私の新しいコードは:

margin:15px;padding:10px 0 15px 23px;width:auto。次に、要素を適切に配置します。

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



-9

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

width: auto;
padding: 20px;

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