div内のフローティング要素は、divの外側にフロートします。どうして?


274

あなたがを持っているdivとしましょう、それを明確にしwidth、それに要素を入れてください、私の場合imgはとdivです。

アイデアは、コンテナのコンテンツがdivコンテナdivを引き伸ばし、コンテンツの背景になるというものです。しかし、これを行うとdiv、非フローティングオブジェクトに合わせてコンテナが縮小します。フローティングオブジェクトは、完全に外れるか、ハーフアウト、ハーフインになり、bigのサイズには影響しませんdiv

どうしてこれなの?私が欠けている何かがあり、どのように私は伸ばすべき項目を浮かべ得ることができますheight含むのがdiv

回答:


398

最も簡単なのはoverflow:hidden、親div に配置し、高さを指定しないことです。

#parent { overflow: hidden }

もう1つの方法は、親divをフロートさせることです。

#parent { float: left; width: 100% }

別の方法では、clear要素を使用します。

<div class="parent">
   <img class="floated_child" src="..." />
   <span class="clear"></span>
</div>

CSS

span.clear { clear: left; display: block; }

17
それは機能しますが、今私は2倍混乱しています:これについての説明はありますか、それともこれはどのようにですか?
DavidR

8
はい、そこに説明があるが、それを忘れてしまったので、私が持っている:(それがどれだけその。overflow:hidden力ブラウザはそれができる最善の親の子要素を含むように厥はそれを修正する理由。。
ダグNeiner

5
の説明overflow: hiddenはここにあると思います:リンク。そして、多くのおかげで、それは私のために働いた
Vikas Arora '27

6
@DavidR最も簡単な説明は、html / cssは古く、考え抜かれており、テクノロジーの実装が不十分であることです。実際、この推論は、実際にこの投稿を作成して以来、疑いなく遭遇した多くのhtml / cssの癖を説明しています。
わずか

1
覚えておいてくださいoverflow: hiddenちょうど親コンテナからの流出要素の一部を非表示になります。私にとっては、これにより特定のテキストの一部が読めなくなりました。
トップキャット

160

理由

問題は、浮動要素がフローから外れていることです。

要素がフロート、絶対配置、またはルート要素の場合要素はフローから呼び出さます。

したがって、流入要素のように周囲の要素に影響を与えることはありません。

これは9.5 Floatsで説明されています:

フロートはフロート内にないため、フロートボックスの前後に作成された非配置ブロックボックスは、フロートが存在しないかのように垂直にフローします。ただし、フロートの隣に作成された現在のラインボックスと後続のラインボックスは、フロートのマージンボックス用のスペースを確保するために必要に応じて短縮されます。

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

これは、「10.6高さとマージンの計算」でも指定されています。「正常な」ブロック

通常のフローの子のみが考慮されます(つまり、フローティングボックスと絶対位置のボックスは無視されます[…])

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

ハッキーソリューション:クリアランス

この問題を解決する方法の1つは、一部の流入要素をすべてのフロートの下に配置することです。次に、親の高さがその要素をラップするように大きくなります(したがって、フロートも)。

これはclearプロパティを使用し実現できます

このプロパティは、要素のボックスのどの側が 以前のフローティングボックスに隣接していない可能性があるかを示します。

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

したがって、解決策はclear: both、フロートの最後の兄弟として空の要素を追加することです

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

ただし、これはセマンティックではありません。したがって、親の最後に疑似要素を生成する方が適切です。

.clearfix::after {
  clear: both;
  display: block;
}

このアプローチには複数のバリエーションがあります。たとえば、廃止予定の単一コロン構文:afterを使用して古いブラウザをサポートしたり、他のブロックレベルのディスプレイを使用したりしますdisplay: table

解決策:BFCルート

最初に定義された問題のある動作には例外があります。ブロック要素がブロックフォーマットコンテキストを確立する場合(BFCルートである場合)、そのフローティングコンテンツもラップします。

10.6.7ブロック自動化コンテキストルートの「自動」高さによると、

要素に下マージンエッジが要素の下コンテンツエッジより下にある浮動子孫がある場合、高さはそれらのエッジを含むように増加します。

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

さらに、9.5 Floatsで説明したように、BFCルートも次の理由で役立ちます。

テーブルの境界ボックス、ブロックレベルで置換された要素、または新しいブロックフォーマットコンテキストを確立する通常のフローの要素[…]は、要素自体と同じブロックフォーマットコンテキスト内のフロートのマージンボックスと重複してはなりません。 。

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

ブロックフォーマットコンテキストは、

  • ブロックボックスoverflow以外のvisible、例えばhidden

    .bfc-root {
      overflow: hidden;
      /* display: block; */
    }
  • ブロックボックスではないブロックコンテナー:displayinline-blocktable-cellまたはに設定されている場合table-caption

    .bfc-root {
      display: inline-block;
    }
  • フローティング要素:floatleftまたはに設定されている場合right

    .bfc-root {
      float: left;
    }
  • 絶対配置要素:positionabsoluteまたはに設定されている場合fixed

    .bfc-root {
      position: absolute;
    }

これらは、オーバーフローするコンテンツのクリッピング、縮小して合わせるアルゴリズムで自動幅を計算する、フローから外れるなど、望ましくない付随的な影響をもたらす可能性があることに注意してください。したがって、問題は、BFCを確立する目に見えるオーバーフローを持つインフローブロックレベル要素を持つことができないことです。

Display L3は次の問題に対処します。

作成flowし、flow-root 内側ディスプレイタイプ良好エクスプレスフローレイアウトの表示タイプと素子製造するための明示的なスイッチを作成するために、BFCのルート。(これは::after { clear: both; }overflow: hidden[…]のようなハックの必要性を排除するはずです)

残念ながら、まだブラウザーはサポートされていません。最終的には使用できるかもしれません

.bfc-root {
  display: flow-root;
}

1
したがって、フロートボックスは親コンテナによって認識されないため、高さが崩れますが、兄弟によって認識され、したがってclearfix?
シンボリックリンク2016

@symlinkはい、BFCルートでない限り、親コンテナはフロートを囲むように成長しません。BFCルートではない兄弟は、ブロックの影響を直接受けません(ただし、ラインボックスは影響を受けます)。ただし、クリアランスにより、前のフロートの下に移動します。
Oriol

「BFCルートではない兄弟は、直接ブロックの影響を受けません(ただし、ラインボックスは影響を受けます)。」-分かりますか?このjsFiddle:jsfiddle.net/aggL3Lk7/2では、フロートされたインライン画像はスパンに影響を与えません(そのため、スパンの境界線がアンダーラップします)が、画像はテキスト(ラインボックス)に影響を与えます。テキストが画像と重なっていないという事実によって?
シンボリックリンク

1
@symlinkはい、そうです。さて、あなたのフィドルに国境は親に属しているが、それは兄弟のために基本的には同じになります:jsfiddle.net/aggL3Lk7/3
オリオール

1
私は同意します。これは受け入れられる答えになるはずです。W3が「ハッキング」をコーディングすることを余儀なくされている方法を呼び出していることは、私にとって興味深いことです。誰かが悪いことを台無しにした。
DR01D 2017年



11

欠けているものは何もありません。Floatは、画像(たとえば)をテキストの複数の段落の横に配置して、テキストが画像の周囲に流れるようにする場合のために設計されました。テキストがコンテナを「伸ばした」場合、それは起こりません。最初の段落が終了し、次の段落が画像の下(おそらく数百ピクセル下)で始まります。

そして、それがあなたがあなた自身の結果を得ている理由です。


3
これは、フローティングエレメントが親の高さを適切に伸ばすこととどう関係していますか?
わずか

11

場合によっては、つまりfloat要素を同じ「ライン」に流すために単に使用している場合(ある場合)

display: inline-block;

の代わりに

float: left;

それ以外の場合は、clearCSSの機能を実行するために要素が必要になるために粒子に反する場合でも、最後に要素を使用すると機能します。



7

LSerni、私のために解決してくれてありがとう。

これを達成するには:

+-----------------------------------------+
| +-------+                     +-------+ |
| | Text1 |                     | Text1 | |
| +-------+                     +-------+ |
|+----------------------------------------+

これを行う必要があります:

<div style="overflow:auto">
    <div style="display:inline-block;float:left"> Text1 </div>
    <div style="display:inline-block;float:right"> Text2 </div>
</div>

4

ルーカスが言うように、あなたが説明しているのはfloatプロパティの意図された動作です。多くの人々を混乱させるのは、CSSレイアウトモデルの欠点を補うために、フロートが本来の使用目的をはるかに超えてプッシュされていることです。

このプロパティがどのように機能するかをよりよく理解したい場合は、Floatutorialをご覧ください。


0

最初に簡単に行うことができます。最初にdivを柔軟にして、正当化するコンテンツを右または左に適用すると、問題が解決します。

<div style="display: flex;padding-bottom: 8px;justify-content: flex-end;">
					<button style="font-weight: bold;outline: none;background-color: #2764ff;border-radius: 3px;margin-left: 12px;border: none;padding: 3px 6px;color: white;text-align: center;font-family: 'Open Sans', sans-serif;text-decoration: none;margin-right: 14px;">Sense</button>
				</div>

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