フローティングdivを親の100%の高さにするにはどうすればよいですか?


256

HTMLは次のとおりです。

<div id="outer">
    <div id="inner"></div>
    Test
</div>

そしてここにCSSがあります:

#inner {
  float: left;
  height: 100%;
}

Chromeデベロッパーツールで検査すると、内側のdivの高さが0pxになっています。

親divの高さの100%に強制するにはどうすればよいですか?


1
したがって、テキストを(内側のdivではなく)外側のdivに入れたいのですが、フロートした内側のdivを外側のdivの高さにしますか?
edl

あなたが達成しようとしている最終結果は何ですか?私の混乱は、内側のdivが外側と同じくらい高く、外側がテキストと同じくらい高い場合、内側のdivにテキストがあるのと同じではないでしょうか。
edl

2
@edl:はい、それは:)私がこのようにしたい理由は、内側のdivがその背景として画像を持っているからです。テキストはその横にある必要があります。背景画像もあるので、どちらも外側のdiv内にある必要があります。
Nathan Osman


2
この質問に対する答えを見て、試してみるのは憂鬱でした。
EternalHour 2018年

回答:


125

以下のために#outerその内容に基づいて、そして持っているべき高さ#innerその上のベースの高さを、絶対位置の両方の要素を作ります。

詳細はのための仕様で見つけることができますCSSのheightプロパティが、基本的に、#inner無視しなければならない#outer場合には、高さを#outerの高さがあるautoない限り、 #outer絶対に配置されています。それ自体が絶対的に配置されない限り#inner、高さは0になります。 #inner

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

ただし... #inner絶対配置floatすると、設定は無視されるため、#inner明示的に幅を選択し、必要に応じて#outerテキストの折り返しを偽装するためにパディングを追加する必要があります。たとえば、以下のパディング#outerは幅#inner+3です。便利なことに(全体のポイントは#inner高さを100%にすることでした)#inner、下にテキストを折り返す必要がないため、#innerフロートしたように見えます。

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

以前の答えはあなたの目標についてのあまりにも多くの誤った仮定に基づいていたので、私はそれを削除しました。


118
うーん..質問は、Floated divについてでした。絶対位置のdivについて回答しました
Mihkel L.

57
それがでめちゃくちゃ物事をシンプルに実現することがいかに複雑な私は驚くべきことでは停止することはありませんHTML/CSS:)
ユーリーNakonechnyy

15
幅をハードコーディングせずにこれを行う方法はありますか?レスポンシブなコンテナには適していません。
Jake Wilson、

23
なぜこれが受け入れられ、賛成されたのかはわかりません。質問は、フローティングdivについてです。これは、検索からここに私を連れてきたものです。代わりに、これは絶対位置のdivに答えます。
Matt K

2
フロートコンテナーをコンテナーの垂直方向に合わせる方法は?もう浮かせないことで!はは。試してみて、実際に役立つと考えられるほど十分に近い。
Rolf

124

親の場合:

display: flex;

いくつかのプレフィックスを追加する必要がありますhttp://css-tricks.com/using-flexbox/

編集:欠点はいつものようにIEだけですが、IE9はflexをサポートしていません。 http://caniuse.com/flexbox

編集2:@toddsbyが指摘したように、項目の整列は親のためのものであり、そのデフォルト値は実際にはストレッチです。子に別の値が必要な場合は、align-selfプロパティがあります。

編集3:jsFiddle:https ://jsfiddle.net/bv71tms5/2/


3
これは最新のブラウザでのみ機能し、ベンダープレフィックスが必要であることを指摘する必要があります。
kontur 14

12
元の質問では子divをフローティングする必要があり、すべての位置が必要であることを考えると、このソリューションがこれ以上注目されていないことに驚いています。このソリューションは、position:absoluteの副作用が問題にならない優れたソリューションを提供します。もう少し掘り下げてもかまいませんが、かなり優れたクロスブラウザー互換性を得ることができます。
ルーク

これが正解です。IE9は間もなくリリースされる予定であり、優れた堅実なキックを提供することで、それを助けることにもなるでしょう。このソリューションはとても素晴らしく、シンプルで、そして簡単です...私は代替ソリューションを一緒にハッキングし終えました。;)
jrista

2
Flexboxの最新の仕様によると:w3.org/TR/css-flexbox-1/#align-items-propertyを参照してください。align-items: stretch;これはデフォルト値なので必要ありません。また、子ではなく親で定義する必要があります。
toddsby 2017

1
答えにフィドルを追加しました。@Tigran
Aiphee

77

実際には、親要素が配置されている限り、子の高さを100%に設定できます。つまり、親を絶対的な位置に配置したくない場合。さらに説明させてください:

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
クール、これはチャドウィックの要件position:absolute(サイトのスタイルに干渉する可能性がある)よりも制限が少ない
ヘンリー

3
私だけかもしれませんが、サイドバーがコンテンツよりも大きい場合は問題があります。背景色は親コンテナで停止しますが、サイドバーのコンテンツは親の外側にオーバーフローします。
Howdy_McGee 14

これははるかに柔軟な解決策であり、複数の子要素をフローティングしている場合でも、それらのオフセットを絶対位置にスタイル設定することは許容できる欠点のようです。+1
2014

ありがとう非常に多くの。私の特定のソリューションを別の質問への回答としてSO:stackoverflow.com/a/31749164/84661に投稿しました。
Brian Haak

24

IE8より前のバージョンのInternet Explorerをサポートする必要がない限り、これを使用display: table-cellしてこれを実現できます。

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

これにより、.innerクラスを持つ各要素が親要素の高さ全体を占めるようになります。


これは機能しますが、マージンを指定してもマージンは表示されません。したがって、マージンを割り当てたい場合、このソリューションは失敗します。回避策としてパディングを割り当てることができますが、マージンが必要な場合(パディングではなく)、これをどのように解決しますか?
Devner 2013

13
ここで何か不足していますか?あなたの質問は、浮動要素の高さを100%にすることを求めています。フローティングすると、display: table-cell;要素はコンテナの高さを満たさなくなりますか?それはあなた自身の質問なので、私は何かを逃しているに違いありません...?
user56reinstatemonica8

16

あなたの問題を解決するを作りました。

ラッパーを作成し、フロートさせてから、divの絶対位置を指定し、100%の高さにする必要があります。

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

説明: .right divは絶対位置にあります。つまり、その幅と高さ、および上と左の位置は、CSSで幅または高さのプロパティが明示的に宣言されている場合にのみ、絶対的または相対的に配置された最初の親divに基づいて計算されます。明示的に宣言されていない場合、これらのプロパティは親コンテナ(.right-wrapper)に基づいて計算されます。

したがって、DIVの100%の高さは.containerの最終的な高さに基づいて計算され、.rightの位置の最終的な位置は親コンテナーに基づいて計算されます。


1
これは、列のコンテンツが列のコンテンツよりも短いことを保証できる状況に対する確実な解決策です。たとえば、列に可変サイズのコンテンツがあり、右側の列に詳細ページへの矢印が表示されるだけのコンポーネントでこれを使用している場合、このソリューションはうまく機能します。そのための+1.right.left.left
Zachary Kniebel 2015年

15

ここではそれを達成するためのより簡単な方法です:

  1. 3つの要素のコンテナー(#outer)表示を設定します。
  2. 要素自体を設定します(#inner)表示:テーブルセル
  3. フローティングを取り外します。
  4. 成功。
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

@Itay in Floated divのおかげで、高さ100%


8

少しjQueryを使用する準備ができている場合、答えは簡単です!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

これは、単一の要素を親の高さ100%の側にフローティングする場合にうまく機能しますが、通常は回り込む他のフローティング要素は片側に保持されます。

これが仲間のjQueryファンに役立つことを願っています。


18
このレイアウトの問題でJavaScriptをスローするのはやり過ぎのようです。
kontur 14

1
IEで開発する必要がある人として:ありがとうございます!
ルーク

1
少しやり過ぎかもしれませんが、これは素晴らしい答えです、ありがとう!
マーティン

1
JSなしですべてのポジショニングの問題を解決する必要があることに同意します。
ミカエルスコフ2015年

1
JS jQuery を使用するのはやり過ぎです
ViliusL 2017年

3

これは、高さが等しいグリッドシステムのコードサンプルです。

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

上記は、外側のdivのCSSです。

#inner{
width: 20%;
float: left;
border: 1px solid;
}

上は内側のdivです

これがあなたを助けることを願っています


1

これは私を助けました。

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

適切な#inner幅を設定するには、right:およびleft:を変更します。


1

同じ高さの複数の子要素が必要な場合の同様のケースは、フレックスボックスで解決できます。

https://css-tricks.com/using-flexbox/

display: flex;flex: 1;要素と子要素に設定すると、すべて同じ高さになります。


-1

"overflow:hidden"オプションは、ロールする可能性がないため、より適切に機能するようです...
Rodrigo Barreiro

より良い解決策を思いついた場合は、回答を編集できます。また、リンクに提供されている情報など、回答にさらに情報を追加するとよいでしょう。
ドナルドダック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.