コンテナ要素にフロート要素が含まれている場合、コンテナ要素の高さが増加しないのはなぜですか?


210

高さとフロートがどのように機能するかを質問したいと思います。外部divとコンテンツを含む内部divがあります。高さは内側のdivの内容によって異なる場合がありますが、内側のdivが外側のdivをオーバーフローするようです。それを行う適切な方法は何でしょうか?

 <html>
    <body>
        <div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
    	    <div style="width:500px; height:200px; background-color:black; float:right"></div>
        </div>
    </body>
</html>



素晴らしくてとても良い感謝です!
Bassam Alugili 2014年

回答:


581

フロート要素はコンテナ要素の高さに追加されないため、それらをクリアしないと、コンテナの高さは増加しません...

視覚的にお見せします:

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

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

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

詳細な説明:

<div>
  <div style="float: left;"></div>
  <div style="width: 15px;"></div> <!-- This will shift 
                                        besides the top div. Why? Because of the top div 
                                        is floated left, making the 
                                        rest of the space blank -->

  <div style="clear: both;"></div> 
  <!-- Now in order to prevent the next div from floating beside the top ones, 
       we use `clear: both;`. This is like a wall, so now none of the div's 
       will be floated after this point. The container height will now also include the 
       height of these floated divs -->
  <div></div>
</div>

overflow: hidden;コンテナ要素を追加することもできますが、clear: both;代わりに使用することをお勧めします。

また、あなたが使用できる要素をセルフクリアしたい場合は

.self_clear:after {
  content: "";
  clear: both;
  display: table;
}

CSS Floatはどのように機能しますか?

フロートとは正確には何ですか?

  • floatプロパティは、ほとんどの初心者で誤解されています。さて、正確には何をしfloatますか?当初、このfloatプロパティは、フロートleftまたはである画像の周りにテキストを流すために導入されましたright。@Madara Uchichaによる別の説明を次に示します。

    では、floatボックスを並べて配置するためにこのプロパティを使用するのは間違っていますか?答えはノーです。floatボックスを並べて設定するためにこのプロパティを使用しても問題はありません。

  • inlineor block要素をフローティングすると、要素のように動作しinline-blockます。

    デモ

  • あなたは要素をフロートした場合leftrightwidth要素のがない限り、それは、保持しているコンテンツに制限されますwidth明示的に定義されています...

  • float要素は使用できませんcenter。これは、初心者がいつも使用してきた最大の問題float: center;であり、を使用していますが、これはfloatプロパティの有効な値ではありません。float通常は、floatコンテンツを左端または右端に/ moveするために使用されます。唯一存在する4の有効な値floatのプロパティすなわちleftrightnone(デフォルト)とはinherit

  • 親要素が折りたたまれている場合、フローティングされた子要素が含まれている場合、これを防ぐために、clear: both;プロパティを使用して両側のフローティングされた要素をクリアし、親要素の折りたたみを防ぎます。詳細については、こちらの別の回答を参照してください

  • (重要)さまざまな要素のスタックがある場所を考えてください。使用するとき、float: left;またはfloat: right;要素がスタックの上に1つ移動するとき。したがって、通常のドキュメントフローの要素は、通常のフロート要素の上のスタックレベルにあるため、フロート要素の後ろに隠れます。(これz-indexは完全に異なるため、これに関連付けないでください。)


例として、CSSフロートがどのように機能するかを説明するために、ヘッダー、フッター、2列のシンプルな2列のレイアウトが必要であると仮定して、ブループリントは次のようになります...

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

上記の例では、赤いボックスのみをフローティングにします。float両方をに配置するleftか、またはに配置floatしてleft、もう1つをright配置するかは、レイアウトによって異なります。3列の場合、別の場所にfloat2列配置できますleft。 1つはrightので、この例では、我々は簡略化され2列のレイアウトを持っているものの、依存ので、意志floatの1 leftとする他のをright

レイアウトを作成するためのマークアップとスタイルについては、後で説明します...

<div class="main_wrap">
    <header>Header</header>
    <div class="wrapper clear">
        <div class="floated_left">
            This<br />
            is<br />
            just<br />
            a<br />
            left<br />
            floated<br />
            column<br />
        </div>
        <div class="floated_right">
            This<br />
            is<br />
            just<br />
            a<br />
            right<br />
            floated<br />
            column<br />
        </div>
    </div>
    <footer>Footer</footer>
</div>

* {
    -moz-box-sizing: border-box;       /* Just for demo purpose */
    -webkkit-box-sizing: border-box;   /* Just for demo purpose */
    box-sizing: border-box;            /* Just for demo purpose */
    margin: 0;
    padding: 0;
}

.main_wrap {
    margin: 20px;
    border: 3px solid black;
    width: 520px;
}

header, footer {
    height: 50px;
    border: 3px solid silver;
    text-align: center;
    line-height: 50px;
}

.wrapper {
    border: 3px solid green;
}

.floated_left {
    float: left;
    width: 200px;
    border: 3px solid red;
}

.floated_right {
    float: right;
    width: 300px;
    border: 3px solid red;
}

.clear:after {
    clear: both;
    content: "";
    display: table;
}

レイアウトを1つずつ見ていき、フロートがどのように機能するかを見てみましょう。

まず最初に、メインのラッパー要素を使用します。それをビューポートであると想定して、そこに何もないものを使用headerして割り当てます。これは、フロートされていないか、割り当てられていない限り、水平スペースを占める通常の非フロートブロックレベルの要素です。height50px100%inline-block

の最初の有効な値floatleft、この例ではfloat: left;for を使用している.floated_leftのでleft、コンテナ要素のにブロックをフロートするつもりです。

コラムは左に浮いた

そして、はい、表示されている場合、.wrapper折りたたまれている親要素は、緑色の境界線で表示されているものは拡張されていませんが、正しく表示されますか?しばらくしてその状態に戻りますが、今のところ、カラムはにフロートしていleftます。

2列目に来て、floatこれをright

別の列が右に浮かんでいた

ここには、への300px幅の広い列があります。これはfloatrightに浮かんでいるときに最初の列の横に配置され、にleft浮いているleftので、に空の樋が作成されright、に十分なスペースがあったためrightright浮いた要素はその横に完全に座っていましたleft

それでも、親要素は折りたたまれています。まあ、それを修正しましょう。親要素が折りたたまれないようにする方法はたくさんあります。

  • 空のブロックレベルの要素を追加して、clear: both;浮動要素を保持する親要素が終了する前に使用しclearます。これは、浮動要素の安価な解決策ですが、代わりに機能しますが、使用しないことをお勧めします。

次のよう<div style="clear: both;"></div>に、.wrapper div終わりの前に追加します

<div class="wrapper clear">
    <!-- Floated columns -->
    <div style="clear: both;"></div>
</div>

デモ

まあ、それは非常にうまく修正され、折りたたまれた親はなくなりましたが、DOMに不要なマークアップが追加されるためoverflow: hidden;、意図したとおりに機能するフローティング子要素を保持する親要素で使用することをお勧めします。

使用overflow: hidden;する.wrapper

.wrapper {
    border: 3px solid green;
    overflow: hidden;
}

デモ

これにより、必要になるたびに要素を節約できますclear floatが、これを使用box-shadowしてさまざまなケースをテストしたところ、子要素を使用する特定のケースで失敗しました。

デモ(4辺すべての影が見えない、overflow: hidden;この問題の原因)

ならどうしよう?要素を保存します。overflow: hidden;明確な修正ハックに進み、CSSで以下のスニペットを使用overflow: hidden;します。親要素と同じように、親要素でclass以下を呼び出して自己消去します。

.clear:after {
    clear: both;
    content: "";
    display: table;
}

<div class="wrapper clear">
    <!-- Floated Elements -->
</div>

デモ

ここで、影は意図したとおりに機能し、折りたたむのを防ぐ親要素をセルフクリアします。

そして最後に、clearフロートした要素の後にフッターを使用します。

デモ


ときにされたfloat: none;任意の使用が宣言するので、それがデフォルトですと、とにかく使用float: none;

まあ、それは、もしあなたがレスポンシブデザインをしようとしているなら、あなたがフローティング要素をある解像度で上下にレンダリングしたいとき、この値を何度も使うでしょう。そのfloat: none;プロパティのためにそこで重要な役割を果たしています。


がどのようfloatに役立つかを示す実例はほとんどありません。

  • すでに見た最初の例は、1つまたは複数の列レイアウトを作成することです。
  • コンテンツをimgフロートさせるフロート内部pを使用します。

デモ(フローティングなしimg

デモ2(にimgフロートleft

  • float水平メニューの作成に使用- デモ

2番目の要素もフロートするか、 `margin`を使用します

最後に重要なことですが、float要素を1つだけにし、他の要素leftはしないfloatというこの特定のケースについて説明したいと思います。

我々は削除する場合としfloat: right;、当社から.floated_right classdiv極端からレンダリングされるleftことが浮いていないよう。

デモ

したがって、この場合は、どちらかのことができますfloatするleftだけでなく

または

左フロートカラムのサイズと同じになる、つまり幅の広い方使用margin-left200pxできます


3
フロートがブロックレベルの親の高さに影響しないという事実は、仕様の中で次のように明示されています:w3.org/TR/CSS21/visudet.html#normal-block clearfixが機能する理由は、1) clearfixは(通常)通常のフロー内にあります。2)フロートをクリアするには、フロートの最下部にclearfixを配置する必要があります。3)コンテナーを伸ばして、そのclearfixを含める必要があります。
BoltClock

@BoltClockフロートがどのように機能するかを見つけたユーザーのSEOに深刻な影響を与えるため、タイトルの編集をロールバックした方がよいでしょう。Googleでこれらの用語を記述して確認できます。彼らが探しているものを見つけることができません。
エイリアン氏2015

「CSSフロートはどのように機能しますか?」非常に幅広いタイトルであり、この質問のまとまりとして、フロートの質問だけを閉じるよう投票するように人々を誤解させています。ここでの質問は、フロートをラップする(またはラップしない)コンテナーという1つの側面のみをカバーしています。
BoltClock

@BoltClockとにかく、技術性はで説明したものと同じclear: both;ですが、編集が正当であると感じても大丈夫です。そのようにしてください
Mr. Alien

1
素晴らしい答え。「任意の要素を左また​​は右にフローティングすると、要素の幅は、幅が明示的に定義されていない限り、保持するコンテンツに制限されます」-私は同じことを観察し、これを確認するために探していました。ありがとう
Deen John

38

overflow:auto内側のフロートdivを含めるには、親div に追加する必要があります。

<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

jsFiddleの例


6
これは解決策ではありません。外側のdivから境界の外に出るコンテンツを隠しています。
アレハンドロルイスアリアス2013年

@AlejandroRuizArias-何が隠されているのですか?
j08691 2013年

3
この例では何もありませんが、内部divに十分なコンテンツを導入している場合は、はい。
アレハンドロルイスアリアス2013年

これは、OPが探していた機能を実行しません。Forkedjsfiddle.net/h0ceb5ra
TecBrat

1
驚くばかり。私が探していた1つの属性のソリューションです。他のすべてがそんなに簡単であれば、縮小の必要はありません。
YK 2018年

10

floatバグが発生しています(この動作を示すブラウザーの数が原因で技術的にバグかどうかはわかりません)。これが起こっていることです:

通常の状況では、明示的な高さが設定されていないと想定すると、divなどのブロックレベルの要素は、コンテンツに基づいて高さを設定します。親divの下部は、最後の要素を超えて拡張されます。残念ながら、要素を浮動させると、親がその要素の高さを決定するときに浮動要素を考慮することができなくなります。つまり、最後の要素がフロートされた場合、通常の要素のように親が「ストレッチ」されません。

清算

これを修正するには、2つの一般的な方法があります。1つは、「クリア」要素を追加することです。つまり、フローティングエレメントの下にある別のエレメントで、親を強制的にストレッチします。したがって、次のhtmlを最後の子として追加します。

<div style="clear:both"></div>

これは表示されるべきではなく、clear:bothを使用することで、フローティングエレメントの隣ではなく、その後に配置されることを確認します。

オーバーフロー:

ほとんどの人が好む2番目の方法(私は思う)は、オーバーフローが "目に見えない"ものになるように親要素のCSSを変更することです。したがって、オーバーフローを「非表示」に設定すると、親がフローティングされた子の底を超えて引き伸ばされます。もちろん、これは親に高さを設定していない場合にのみ当てはまります。

私が言ったように、マークアップに意味的に無意味な要素を追加して追加する必要がないので、2番目の方法が推奨されますが、overflowを表示する必要がある場合があります。。


3

これは、divのフロートのためです。overflow: hidden外側の要素に追加します。

<div style="overflow:hidden; margin:0 auto;width: 960px; min-height: 100px; background-color:orange;">
    <div style="width:500px; height:200px; background-color:black; float:right">
    </div>
</div>

デモ


3

フローティング要素がある場合にブラウザが要素をレンダリングする方法を混乱させます。1つのブロック要素がフローティングしている場合(ケースの内部div)、ブラウザーはWebページの通常のフローからフローティング要素を削除するため、他のブロック要素はそれを無視します。次に、フロートdivが通常のフローから削除されているため、内側のdivが存在しないように、外側のdivが埋められます。ただし、インライン要素(画像、リンク、テキスト、ブラッククォート)は、フローティング要素の境界を尊重します。外部divにテキストを導入すると、テキストは内部divの周囲に配置されます。

言い換えると、ブロック要素(ヘッダー、段落、divなど)は浮動要素を無視して埋め、インライン要素(画像、リンク、テキストなど)は浮動要素の境界を尊重します。

ここでフィドルの例

<body>
    <div style="float:right; background-color:blue;width:200px;min-height:400px;margin-right:20px">
           floating element
    </div>
    <h1 style="background-color:red;"> this is a big header</h1>
    <p style="background-color:green"> this is a parragraph with text and a big image. The text places arrounds the floating element. Because of the image is wider than space between paragrah and floating element places down the floating element. Try to make wider the viewport and see what happens :D
        <img src="http://2.bp.blogspot.com/_nKxzQGcCLtQ/TBYPAJ6xM4I/AAAAAAAAAC8/lG6XemOXosU/s1600/css.png">
     </p>

3
テキストを強調表示しないで、フィドルリンクを共有し、次回から回答にコードを投稿します。フィドルリンクが停止している場合、将来のユーザーはここで何の助けも得られず、回答に意味がありません
Mr. Alien


1

コンテナーを表示するdivがない場合は、コンテナーdivにオーバーフロープロパティを使用できます。例:

<div class="cointainer">
    <div class="one">Content One</div>
    <div class="two">Content Two</div>
</div>

ここに次のCSSがあります:

.container{
    width:100%;/* As per your requirment */
    height:auto;
    float:left;
    overflow:hidden;
}
.one{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

.two{
    width:200px;/* As per your requirment */
    height:auto;
    float:left;
}

-----------------------または-------------------------- ----

    <div class="cointainer">
        <div class="one">Content One</div>
        <div class="two">Content Two</div>
        <div class="clearfix"></div>
    </div>

ここに次のCSSがあります:

    .container{
        width:100%;/* As per your requirment */
        height:auto;
        float:left;
        overflow:hidden;
    }
    .one{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }

    .two{
        width:200px;/* As per your requirment */
        height:auto;
        float:left;
    }
    .clearfix:before,
    .clearfix:after{
        display: table;
        content: " ";
    }
    .clearfix:after{
        clear: both;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.