親を埋めるためにCSSの幅を作る方法は?


88

この問題は以前に尋ねられたことがあると思いますが、答えが見つからないようです。

私は次のマークアップを持っています:

<div id="foo">
    <div id="bar">
        here be dragons
    </div>
</div>

私の望みは、fooの幅を600pxwidth: 600px;)にし、barの動作を次のようにすることです。

padding-left: 2px;
padding-right: 2px;
margin-left: 2px;
margin-right: 2px;
outerWidth: 100%;

つまり、バーの幅をに設定する代わりに、バー592pxの外側の幅をに設定して、100%計算されるようにし592pxます。ここで重要なのは、fooの幅をに変更でき800px、これらすべてのインスタンスの計算を手動で行う代わりに、レンダリング時にbarが計算されることです。

これは純粋なCSSで可能ですか?

それでもう少し楽しい:

  • #barテーブルの場合はどうなりますか?
  • どのような場合#barTEXTAREAはありますか?
  • #bar入力の場合はどうなりますか?

  • どのような場合は、#fooテーブルセルですか(td)?(これは問題を変更しますか、それとも問題は同じですか?)


これまでのところtable#barinput#bar議論されてきました。textarea#barの良い解決策を見たことがありません。境界線/マージン/div折り返しのあるパディングのないテキストエリアは、の境界線divとして機能するスタイルで機能する可能性があると思いますtextarea

回答:


39

編集

これらの3つの異なる要素はすべて、異なるレンダリングルールを持っています。

だから:

table#bar幅を100%に設定する必要があります。そうしないと、必要と判断した幅になります。ただし、テーブル行の合計幅がその幅よりも大きい場合はbar、必要な幅に拡張されます。私が思い出すならdisplay: block !important;、iveがそれを修正しなければならなかったのでしばらく経ちましたが、設定することによってこれを打ち消すことができます。(私が間違っていれば誰かが私を訂正すると確信しています)。

textarea#bari beleiveはブロックレベルの要素なので、divと同じルールに従います。ここでの唯一の注意点は、それがあるtextareaの属性取るcolsrows文字列で測定されています。これが要素で指定されている場合、cssで指定されている幅を上書きします。

input#barはインライン要素であるため、デフォルトでは幅を割り当てることはできません。ただし、textareacols属性と同様に、size幅を決定できる要素に属性があります。そうは言っても、display: block;cssで使用することで、いつでも幅を指定できます。次に、divと同じレンダリングルールに従います。

td#footable-cellそれにいくつかの狂気を持っているとしてレンダリングされます。ここでの結論は、あなたの目的のために、div#fooその内容の幅を制限するのと同じように機能するということです。ここでの唯一の問題は、列のどこかに折りたたまれない可能性のあるテキストであり、幅の設定を無視することになります。また、列内のすべてのセルは、最も幅の広いセルの幅を取得します。


これがブロックレベル要素のデフォルトの動作です。widthがauto(デフォルト)の場合、それは含まれている要素の内側の幅の100%になります。つまり、本質的には:

#foo {width: 800px;}
#bar {padding-left: 2px; padding-right: 2px; margin-left: 2px; margin-right: 2px;}

あなたが望むものを正確に提供します。


ねえ、ありがとう。とにかく出血することを決定するテーブルを楽しんでいます。テーブルの動作はdivと同じだと思いますか?
Dmitriy Likhten 2010

@Dimitry:いいえinline-blockblock要素よりも似たものにする特別なルールはありません。注私が言ったことにかかわらず、より多くのようではないと同じ:-)何youreのは、おそらく経験することは、特に定義されない限り、彼らは一般的に、ヘッダー/細胞のいくつかはそれらで長いunwrappableテキストを持っている場合は本当にいらいらすることができるすべての列に対応するために拡大することです。
prodigitalson 2010

助けてくれてありがとう:)質問を少し更新して、問題のより完全な概要を説明します。うまくいけば、すべての回避策を1つのセクションにリストできます。
Dmitriy Likhten 2010

私はdiv#foo table#barを試し、幅を設定しました。table#barを100%にすると、実際にテーブルが拡張されますが、テーブルの境界線/マージンはdiv#fooからはみ出します。テーブルを表示するように設定する:ブロックは、行の幅の処理など、テーブルレンダリングの他の側面を台無しにするため、適切ではありません。widthがautoに設定されているか、設定されていない場合、textarea#barは展開されません。
Dmitriy Likhten 2010

1
以下のためにtextarea#barあなたがすることを設定することができるはずdisplay: blockはほとんど悪影響を持ちます。表に関しては、過去にある種の解決策/緩和策を使用したことは知っていますが、現時点ではそれが何であったかを思い出せません。ただし、通常はテーブルに「マージン」を設定せず、パディング/マージンを使用してdivでラップします...これは#foo自体か、jsutを使用してこのタイプの間隔を適用する別のdivである可能性があります。また、境界線の問題を打ち消して、行の最初/最後のセル/最初/最後の行のセルにのみ境界線を適用することもできます
prodigitalson 2010

28

ほぼそこに、(outerWidthはCSSプロパティではありません)に変更outerWidth: 100%;するだけwidth: auto;です。

または、次のスタイルをバーに適用します。

width: auto;
display: block;

4
パディングマージンをオンに設定している場合、はbar100%に追加され、bar親よりも効果的に広くなるため、これは機能しませんfoo
prodigitalson 2010

ええ、私はそれが速すぎると答えました; P
ローワン

一瞬待って。したがって、widthプロパティを何かに設定すると、ブリードスルーしますか?幅:自動は解決策ではなく、幅をまったく設定しないのですか?
Dmitriy Likhten 2010

2
はい、そのとおり。持っている要素display:block;(ブロックレベル要素とも呼ばれます)は、この動作を採用します。DIV要素にはデフォルトwidth:auto;display:block;設定されています。
ローワン

古い投稿ですが、box-sizing:border-boxを使用して、パディングを要素の幅の内側に配置できるようにすることはできませんでした。
CHBresser 2018年

16

スタイルを使用する

left: 0px;

または

right: 0px;

または

top: 0px;

または

bottom: 0px;

私はほとんどの場合それが仕事をするだろうと思います


4

したがって、調査の結果、次のことが発見されました。

以下のためdiv#barの設定display:block; width: auto;の同等の原因となりますouterWidth:100%;

の場合は、table#bar以下に示すルールを使用してdivでラップする必要があります。したがって、構造は次のようになります。

<div id="foo">
 <div id="barWrap" style="border....">
  <table id="bar" style="width: 100%; border: 0; padding: 0; margin: 0;">

このようにして、テーブルは親divを100%#barWrap占有し、#barテーブルにborders / margin / paddingを追加するために使用されます。あなたが全部の背景を設定する必要があることに注意#barWrapして持っている#barの背景を透明にするかと同じであること#barWrap

以下のためにtextarea#barinput#barとあなたは同じことを行う必要がありますtable#bar下側が国境を除去することにより、あなたが入力/ TEXTAREAのネイティブウィジェットのレンダリングを停止していることで、#barWrapあなたはおそらくする必要がありますので、の国境は、他のすべてよりもビット異なるになりますすべての入力をこのようにスタイル設定します。


1
box-sizing: border-box;
width: 100%;
padding: 5px;

ボックスサイズ:ボーダーボックス; パディング、マージン、ボーダーが幅の計算に含まれるようにします。

MDN

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