CSS-フロートの子DIVの高さを親の高さに拡張


450

私はページ構造を次のようにしています:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

これで、child-leftDIVのコンテンツが増えるため、parentDIVの高さは子DIVに従って増加します。

しかし、問題はchild-right高さが増えていないことです。親と同じ高さにするにはどうすればよいですか?


回答:


459

以下のためparentの要素は、次のプロパティを追加します。

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

それから.child-rightこれらのために:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

CSSの例でより詳細な結果の検索ここと同じ高さの列の詳細についてはこちらを


14
CSSの結果は未定義です-親の高さは子の高さに依存しますが、子は親に関して定義された高さのパーセンテージを持っています。これは無効であり、クロスブラウザーの方法では機能しない可能性があります。
Eamon Nerbonne、2011年

1
私はあなたがすべてを浮いているわけではないようです-それは、右の列が左より長くなる場合、スケーリングしないという犠牲を払って定義されています(これは実際にOPの質問には当てはまりません)。
Eamon Nerbonne、2011年

4
はい、これを追加する必要があります:padding-bottom:32768px; margin-bottom:-32768px; 子供たちに。
Michael

3
これは、右側の列のコンテンツが左側よりも少ないことが保証されている限り機能します。そうでない場合は、クリップされます。また、無用な宣言を省くために回答を編集しました。
クリストフ

3
@MatthewBlackford:マージンの崩壊を防ぐという点で「ハック」です。1ピクセルの透明な境界線を使用するなど、他の方法でマージンの折りたたみを防ぐこともできますが、基本的には、マージンの折りたたみを避けることが重要です。このソリューションは、想定が間違っていることが判明したときに、奇妙なレイアウトエラーや予期しないトリミング(または重畳コンテンツ)が発生するため、最後の手段として以外は使用しません。要するに、本当に必要な場合を除いて、これをしたくないのです。
Eamon Nerbonne、2013

205

この問題の一般的な解決策は、絶対配置またはクロップされた浮動小数点数を使用しますが、列が数値+サイズで変更される場合は広範囲の調整が必要であり、「メイン」列が常に最長であることを確認する必要があるという点でトリッキーです。代わりに、次の3つの堅牢なソリューションのいずれかを使用することをお勧めします。

  1. display: flex:非常にシンプルで最良のソリューションであり、非常に柔軟性がありますが、IE9以前ではサポートされていません。
  2. tableまたはdisplay: table:非常にシンプルで、非常に互換性があり(ほとんどすべてのブラウザー)、非常に柔軟です。
  3. display: inline-block; width:50% マージンハックが負の場合:非常に単純ですが、列の下の境界線は少しトリッキーです。

1。 display:flex

これは本当にシンプルで、より複雑なレイアウトやより詳細なレイアウトに簡単に適応できます。ただし、フレックスボックスはIE10以降でのみサポートされています(他の最新のブラウザーに加えて)。

例: http : //output.jsbin.com/hetunujuma/1

関連するHTML:

<div class="parent"><div>column 1</div><div>column 2</div></div>

関連するCSS:

.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }

Flexboxはより多くのオプションをサポートしていますが、列をいくつでも持つには上記で十分です!

2. <table>またはdisplay: table

これを行うためのシンプルで非常に互換性のある方法は、table- 使用することです古いIEのサポートが必要な場合は、最初に試すことをお勧めします。あなたは列を扱っています。div + floatはそれを行うための最良の方法ではありません(cssの制限をハックするためにネストされたdivの複数のレベルが単純なテーブルを使用するよりも「セマンティック」であるということは言うまでもありません)。table要素を使用したくない場合は、CSSを検討してくださいdisplay: table(IE7以前ではサポートされていません)。

例: http : //jsfiddle.net/emn13/7FFp3/

関連するHTML:(ただし、<table>代わりにプレーンを使用することを検討してください)

<div class="parent"><div>column 1</div><div>column 2</div></div>

関連するCSS:

.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/

このアプローチはoverflow:hidden、フロートで使用するよりもはるかに堅牢です。ほとんどの列を追加できます。必要に応じて、自動スケーリングさせることができます。そして、あなたは古いブラウザとの互換性を保持します。floatソリューションが必要とするのとは異なり、どの列が最も長いかを事前に知る必要もありません。高さは問題なく調整できます。

KISS:特に必要がない限り、フロートハックを使用しないでください。IE7に問題がある場合でも、メンテナンスが難しく、柔軟性の低いトリックCSSソリューションよりも、セマンティック列のあるプレーンテーブルをいつでも選択します。

ちなみに、レイアウトをレスポンシブにする必要がある場合(たとえば、小さな携帯電話には列がない)、@mediaクエリを使用して小さな画面幅のプレーンブロックレイアウトにフォールバックできます。<table>これは、他のdisplay: table要素を使用するかどうかに関係なく機能します。

3. display:inline block負のマージンハックを使用します。

もう1つの方法は、を使用することdisplay:inline blockです。

例: http : //jsbin.com/ovuqes/2/edit

関連するhtml:(divタグの間にスペースがないことは重要です!)

<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>

関連するCSS:

.parent { 
    position: relative; width: 100%; white-space: nowrap; overflow: hidden; 
}

.parent>div { 
    display:inline-block; width:50%; white-space:normal; vertical-align:top; 
}

.parent>div>div {
    padding-bottom: 32768px; margin-bottom: -32768px; 
}

これは少し注意が必要です。負のマージンは、列の「真の」底部が不明瞭になることを意味します。これは、によって切り取られるため、これらの列の下部を基準にして何も配置できないことを意味しますoverflow: hidden。インラインブロックに加えて、フロートでも同様の効果が得られることに注意してください。


TL; DR:IE9以前を無視できる場合はflexboxを使用します。それ以外の場合は、(css)テーブルを試してください。これらのオプションのどちらもうまくいかない場合は、マージンハックがマイナスになりますが、開発中に見落とされがちな奇妙な表示の問題が発生する可能性があり、レイアウトの制限に注意する必要があります。


1
良い例ですが、これらのセルの間にマージンを使用することはできません(そして、スタイルを設定したい場合、パディングは役に立ちません)。
Wordpressor

3
border-spacing:10px;テーブル要素では、マージンのような間隔が導入されます。または、余分なスペースが必要な場所に(空の)列を追加することもできます。また、テーブルセル内にパディングを追加することもできます。ただし、そのパディングは背景に含まれるため、希望どおりにならない場合があります。しかし、それは通常のマージンほど柔軟ではないというのはあなたの言う通りです。また、列を基準にして何も配置できないため、問題が発生する可能性があります。
Eamon Nerbonne、2012年

1
それで、それはテーブルなしのレイアウトかそうではないのですか?
ダイナミック

3
私は言わなければなりません:この場合、単純なテーブルで十分です。問題は、テーブルのあるすべてのレイアウトを無視するという共通の見方があることです
動的

3
テーブルの問題は、画面の幅を小さくする(レスポンシブデザイン)と、テーブルのセルが次のセルの上に並べて表示されるのではなく、押しつぶされることです。padding-bottomを使用した2番目のメソッド:32768px; margin-bottom:-32768px; 非常に
素晴らしく

23

親の場合:

display: flex;

子供のための:

align-items: stretch;

プレフィックスをいくつか追加する必要があります。caniuseを確認してください。


2
お勧めしません。IE9はまだ物です。

回答ありがとうございます。それはうまくいきます!「いくつかの接頭辞を追加する必要があります。caniuseを確認してください。」その行はどういう意味ですか?初心者向けにもう少し情報を追加できますか?
Md Sifatul Islam 2018

@MdSifatulIslamこちらにアクセスしてください:caniuse.com/#feat=flexboxサポートする必要のあるブラウザーが機能のプレフィックスを必要とするかどうかを確認できます。
Aiphee 2018

18

私はたくさんの答えを見つけましたが、おそらく私にとって最良の解決策は

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

ここで他のソリューションを確認できますhttp://css-tricks.com/fluid-width-equal-height-columns/


なぜこれが効くのかはわかりませんが、私の問題を魅力的に解決してくれます。ありがとう
結合

私もうまくいきます。それはきれいな方法ではありませんが。ありがとう!
Mark Anthony Uy

17
地獄のようにハッキー。これは本番アプリケーションにはお勧めしません
FedericoCapaldo

これはすごいですね。私はこの考え、実際に仕事とは思いませんでした
トム・マクドナー

11

親divをoverflow: hidden
次に設定し、子div でパディングボトムに大量を設定できます。例えば
padding-bottom: 5000px
、その後margin-bottom: -5000px
、その後、すべての子のdivは、親の高さになります。
もちろん、コンテンツを親div(他のdivの外にある)に配置しようとしている場合、これは機能しません。

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

例:http : //jsfiddle.net/Tareqdhk/DAFEC/


少し汚いようですが、私にとってはうまくいきました-この質問に対する唯一の解決策。私はこれをtwitterブートストラップを使って試しました。
cukabeka 2013年

8

親に身長はありますか?親の高さをそのように設定した場合。

div.parent { height: 300px };

次に、このように子供を完全な高さに伸ばすことができます。

div.child-right { height: 100% };

編集

JavaScriptを使用してこれを行う方法を次に示します。


親の高さが固定されていません。子供の左の高さに従って拡大しています。
Veera

ああ、私は同じくらい考えました、そしてあなたはいくつかのJavaScriptが必要になるでしょう、私はすぐにそれを追加します。
Olical、2011年

@Olical JSFiddleリンクが壊れています。削除するか、回答を更新してください。ありがとう!
itsmysterybox 2018年

1
jsへのリンクは404
Chanochを

5

CSSテーブルの表示はこれに最適です。

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

元の回答(どの列も高くなる可能性があると想定):

親の高さを子供の高さに依存させ、子供の高さを親の高さに依存させようとしています。計算しません。CSS Fauxカラムが最良のソリューションです。それには複数の方法があります。JavaScriptを使用したくない。


いい視点ね。子供の高さが、親ではなく、最も高い兄弟の高さに依存している場合(親の高さによって決定されるかどうか)はどうですか?CSSではそれができないと思います。
mikato

いいえ、兄弟はお互いの高さに影響を与えることはできません。ただし、display: table+ display: table-cellレイアウトは望ましい結果を生成します。
Salman A

素晴らしいアップデート!しかし、私はこれを試してしまい、div /セルの間に空白を入れたかったので、それを達成するためにテーブルセルdiv内に内部divを作成する必要があり、もちろん、完全な高さを使用する機能を失いました内部のdivはテーブルセルのdivではなかったため、まったく同じ問題です。そのためのアイデアはありますか?欠けているセル間隔のようなものです。
mikato 2015

ああ、CSSにはボーダー間隔があります!stackoverflow.com/questions/339923/…border-spacingを使用して、空白の分離でテーブルのようなdivをうまく機能させることができました。テーブルセル(色付きの背景ブロック)が親の高さ全体を使用するようにしたり、テーブルセルdivを巧みに使用したりできないようになりました。
mikato 2015年

私が遭遇したただの落とし穴:あなたはこれをfloat次のものと一緒に使用することはできません:stackoverflow.com/questions/20110217/…–
Joshua Pinter

4

私は最近、jQueryを使用して自分のWebサイトでこれを行いました。コードは最も高いdivの高さを計算し、他のdivを同じ高さに設定します。ここにテクニックがあります:

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

私はうまくいくとheight:100%は思わないので、divの高さを明示的に知らなければ、純粋なCSSソリューションはないと思います。


1
これは、少なくとも準備完了、サイズ変更、方向変更、フォントサイズ変更でトリガーする必要があります。
netAction 2015

4

私はこれをコメントセクションに使用しました:

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

子を右から右にフロートさせることもできますが、この場合、各divの幅を正確に計算しました。


1
最初に頭に浮かんだのは高さです。なぜ誰も賛成しなかったのかわからない
Andreas

3

ブートストラップを知っている場合は、「flex」プロパティを使用して簡単に実行できます。必要なのは、CSSプロパティの下で親divに渡すことだけです。

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

.homepageSection私の親divはどこにありますか。次に、htmlに子divを追加します

<div class="abc col-md-6">
<div class="abc col-md-6">

ここで、abcは私の子divです。子divにボーダーを与えるだけで、ボーダーに関係なく両方の子divの高さの同等性を確認できます


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

アイデアを与えるためだけにインラインスタイルを使用しました。


-2

私はインターンシップのインタビューでこのきちんとしたトリックを知りました。元の質問は、3つの列の上部の各コンポーネントの高さを、利用可能なすべてのコンテンツを表示する同じ高さにする方法です。基本的に、可能な最大の高さをレンダリングする非表示の子コンポーネントを作成します。

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.