入力内のパディングは幅を100%に分割します


130

オブジェクトにパディングを設定すると、明示的に設定されていても、その幅が変化することがわかりました。これの背後にある論理を論じることはできますが、いくつかの要素でいくつかの問題を引き起こします。

ほとんどの場合、子要素を追加して、100%に設定された子要素ではなく、その要素にパディングを追加しますが、フォーム入力の場合、これは可能な手順ではありません。

これを見てくださいhttp : //sandman.net/test/formcss.html

2番目の入力は、パディングが5pxに設定されています。これは、デフォルト設定よりもずっと好みです。ただし、残念ながら、これにより、入力がすべての方向に10px成長します(100%の幅に10pxが追加されるなど)。

ここでの問題は、入力内に子要素を追加できないため、修正できないことです。だから問題は:

幅を100%に保ちながら、入力内にパディングを追加する方法はありますか?フォームは異なる幅の親でレンダリングされるため、100%にする必要があるため、親の幅は事前にわかりません。


3
CSS3 属性の使用方法については、stackoverflow.combox-sizing
/ questions / 628500 /…

15
言うまでもありません。サンプルページをいつもアップしていただきありがとうございます。誰かが質問にURLを投稿し、回答が返された後、またはjsfiddleのようなものを使用していない場合、URLがダウンしているとき、私を混乱させます。
Jonathan Dumaine、2011年

ボックスサイズ属性の使用について。私の問題は同じ問題でしたが、高さ-高さを100%に設定すると、高さ+境界+パディング=コンテナーの高さになります。入力をコンテナーの実際の高さにするには、box-sizing:content-boxを使用するだけで済みます。
Skychan

私が言ったことを除いて、IEでは動作しません。IE11でbox-sizing:content-boxを使用しても、高さは100%で調整されません。特定のpxの高さでそれを尊重します。したがって、高さ:31ピクセル(ボックスサイズなし)は、高さ:31ピクセル+ボックスサイズ:コンテンツボックスより6ピクセル小さくなります。しかし、アイデアは高さを使用することです:100%なので、特定のピクセルサイズは心配ありません!
Skychan 2015

回答:


288

CSS3を使用すると、box-sizingプロパティを使用して、ブラウザーが入力の幅を計算する方法を変更できます

  input.input {
    width: 100%;
    -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
    -moz-box-sizing: border-box;    /* Firefox, other Gecko */
    box-sizing: border-box;         /* Opera/IE 8+ */
  }

詳しくは、http//css-tricks.com/box-sizing/をご覧ください。


@VíctorDieppa Garrigaありがとう、それは素晴らしい解決策です。
sinanakyazici 2013

1
サポートは次のとおりです:Chrome(すべて):box-sizing Opera 8.5+:box-sizing Firefox(any):-moz-box-sizing Safari 3:-webkit-box-sizing(5.1+バージョンではプレフィックスなし)IE8 +:box -サイジング。また、私はこれを受け入れられた回答に推奨します。これはよりエレガントなソリューションです。
Baconbeastnz 2013年

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

正直なところ、box-sizing: border-box;私が最初に考えたのですが、私にはまったく効果がありません。多分、曾祖父母display: flex;がこれをいじっていますか?
コーディ

プレフィックスなしですべての主要なブラウザでサポートされているようで、いくつかのバージョンでサポートされています:caniuse.com/#feat=css3-boxsizing
Jason

7

私はそれがどのようにブラウザー間で互換性があるかわかりません(FirefoxとSafariで動作します)。この解決策を試すことができます。

DIV.formvalue {
padding: 15px;
}
input.input {
margin: -5px;
}

(私が変更した値のみを投稿しました)


1
IEで問題が発生します。
Tarik

まあ、それは私をあまり驚かせません:)マークアップを変更せずに簡単なクロスブラウザーソリューションがあるとは思わないでください。
michaelk

さて、margin:-5pxの追加は明らかに違反ではないので、私はこのソリューションに投票します。これを使用するページに4番目の入力を追加しましたが、実際に機能しているようです。 jigsaw.w3.org/css-validator/…–
サンドマン、

7

1つのオプションは、パディングがINPUTあるDIVでラップすることです。

CSS:

div.formvalue {
    background-color: #eee;
    border: 1px solid red;
    padding: 10px;
    margin: 0px;
}

div.paddedInput {
    padding: 5px;
    border: 1px solid black;
    background-color: white;
}

div.paddedInput input {
    border: 0px;
    width: 100%;
}

HTML:

<div class="formvalue">
    <div class="paddedInput"><input type="text" value="Padded!" /></div>
</div>

8
コンテナーdivにパディングを行うと、入力フィールドにパディングを追加した場合と同じ結果が得られません。
Felix Fung

Felix Fungの発言に追加してください-他の注目すべき問題の中でも、パッド領域でマウスをクリックして入力フィールドにフォーカスさせることができなくなります。このあまり気づかれていない/既知の問題を指摘したかっただけです-このハックを使用するWebページを使用するとき、私は終わりがたまりません。
eselk 2013

5

忘れられがちなcalcことがここで助けになり得ます:

input {
  width: calc(100% - 1em);
  padding: 0.5em;
}

要素の幅にパディングが追加されることがわかっているので、全体の幅からパディングを差し引くだけです。それはすべての主要なブラウザーでサポートされており、応答が速く、面倒なラッパーdivを必要としません。


4

私はこれに似た何かでいくつかの問題を抱えています。入力が100%のtdsと小さなパディングがあります。私がしたことは、次のようにtdのパディングを補正することでした:

.form td {
    padding-right:8px;
}

.form input, .form textarea {
    border: 1px solid black;
    padding:3px;
    width:100%;
}

境界とinput / textareaのパディングを含めるための8pxのパディング。お役に立てれば!


この手法は、パディングされた入力を含むセルの幅とそうでないセルの幅を合わせるのに最適です。100%幅の入力を含むすべてのTDに選択的にパディング右を適用します。
Seb Barre

1

おそらく、border + backgroundをから外し、input代わりに、divborder + backgroundとwidth:100%で囲み、input?にマージンを設定します。


それは私がこの問題に現在使用している種類のハックですが、「スタイル上の理由」などではなく、入力に境界線を使用したいと思います。しかし、はい、これは私が現在行っている方法なので、実行可能な解決策です
サンドマン

1

私が見つけた解決策の1つは、相対的に配置された親タグで入力を絶対配置することです。

<p class="full-width-input">
    <input type="text" class="text />
</p>

スタイルを適用します。

p.full-width-input {
    position: relative;
    height: 35px;
}

p.full-width-input input.text {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    padding: 5px;
}

注意すべき唯一のことは、絶対位置に配置された子は高さを拡張しないため、段落タグには高さ設定が必要であることです。これwidth: 100%により、親要素の左側と右側にロックして設定する必要がなくなります。


0

パディングにパーセンテージを使用してみてください:

.input { 

  // remove border completely
  border: none;

  // don't forget to use the browser prefixes
  box-shadow: 0 0 0 1px silver;

  // Use PERCENTAGES for at least the horizontal padding
  padding: 5%; 

  // 100% - (2 * 5%)
  width: 90%; 

}

ボックスシャドウが表示されない古いブラウザーのユーザーが心配な場合は、バックアップとして微妙な背景色を入力してください。この種のことでピクセルを使用している場合、他の場所でピクセルを使用している可能性があり、いくつかの追加の問題が発生する可能性があります。問題が発生した場合はお知らせください。


-3

これを防ぐために私が知っている唯一のことは、100%-10のような値を割り当てることです。ただし、互換性の問題がいくつかあります。

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