CSSルールの「クリア:両方」は何をしますか?


293

次のCSSルールは何をしますか:

.clear { clear: both; }

そして、なぜそれを使用する必要があるのですか?


22
CSS floatを使用していて、右または左ではなく、下に次の要素が必要な場合。
Riz

エレメントがclear:bothで使用されている場合、指定されたエレメントの左側と右側にフローティングエレメントは許可されません
JackXu

回答:


687

ここではフロートがどのように機能するか(詳細)は説明しません。この質問は一般になぜ使用するのか、または正確にをするのに焦点を当てているためです...clear: both;clear: both;

私はこの答えを単純に、要点を守り、なぜclear: both;必要なのか、それが何をするのかをグラフィカルに説明します...

通常、設計者は要素を左また​​は右にフロートします。これにより、反対側に空のスペースが作成され、他の要素が残りのスペースを占有できるようになります。

なぜ要素をフロートさせるのですか?

設計者が2つのブロックレベルの要素を並べて必要とする場合、要素はフローティングされます。たとえば、次のようなレイアウトの基本的なWebサイトをデザインしたいとします...

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

デモ画像のライブ例

デモ用のコード

注: あなたが追加する必要がありますheaderfooterasidesection(およびその他のHTML5要素)としてdisplay: block;明示的要素はブロックレベル要素であることを言及するために、あなたのスタイルシートインチ

説明:

基本的なレイアウト、1つのヘッダー、1つのサイドバー、1つのコンテンツ領域、1つのフッターがあります。

のフロートはありませんheader。次にaside、ウェブサイトのサイドバーに使用するタグが来るので、要素を左にフロートします。

注:デフォルトでは、ブロックレベル要素はドキュメントを100%幅で占有しますが、左または右にフロートすると、保持するコンテンツに応じてサイズが変更されます。

  1. ブロックレベル要素の通常の動作
  2. ブロックレベル要素の浮動動作

あなたが気づくように、左に浮かぶとdiv、スペースは未使用の右divに残されます。これにより、後が残りのスペースにシフトすることができます。

  1. divがフロートされていない場合、は次々にレンダリングされます
  2. div 左または右にフロートすると、横にずれます

わかりました。これが、左または右にフロートしたときのブロックレベルの要素の動作clear: both;です。ここで、なぜ必要で、なぜですか。

レイアウトデモでメモした場合-忘れた場合に備えて、ここにあります。

と呼ばれるクラスを使用して.clearいますが、それはclearの値で呼び出されるプロパティを保持していますboth。なぜそれが必要なのか見てみましょうboth

私はフロートしasidesection要素を左に移動したので、プールがあり、headerソリッドランドがasideありsection、フッターが再びソリッドランドであるシナリオを想定します。このようなものです。

フローティングビュー

だから青い水は浮かぶ要素の面積が何であるかを理解していません、それらはプールよりも大きいか小さいかもしれません、それでここにCSS初心者の90%を悩ます一般的な問題があります:なぜコンテナ要素の背景が引き伸ばされないのですか?浮遊要素を保持している場合。これは、コンテナー要素がここではPOOLであり、POOLが浮動しているオブジェクトの数、または浮動要素の長さまたは幅が何であるかがわからないため、単に伸縮しないためです。

  1. 文書の通常の流れ
  2. 左にフローティングのセクション
  3. コンテナの背景色をストレッチするためにフローティング要素をクリア

(これを正しく行う方法については、この回答の[Clearfix]セクションを参照してください。div説明のために空の例を意図的に使用しています)

上記の3つの例を示しました。1つ目は通常のドキュメントフローでred、コンテナはフローティングオブジェクトを保持していないため、背景は期待どおりにレンダリングされます。

2番目の例では、オブジェクトが左にフロートされると、コンテナー要素(POOL)はフロート要素の寸法を認識しないため、フロート要素の高さまで伸びません。

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

を使用した後clear: both;、コンテナ要素は浮動要素の寸法に引き伸ばされます。

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

clear: both;が使用されるもう1つの理由は、要素が残りのスペースでシフトアップしないようにするためです。

たとえば、2つの要素を並べて、その下に別の要素が必要だとします。そのため、2つの要素を左にフロートさせ、もう1つの要素をその下に配置します。

  1. div左にフローティングsectionすると、残りのスペースに移動します
  2. 浮かんでdivいることをとてもクリアsectionタグがFLOATEDの下にレンダリングされますdiv

最初の例

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


2番目の例

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

最後になりましたが、footerタグをclear宣言する前にクラスを使用したので、タグはフロート要素の後にレンダリングされfooterます。これにより、すべてのフロート要素(左/右)がその時点までクリアされます。


Clearfix

フロートに関連するclearfixに来る。@Elkyですでに指定されているように、これらのフロートをクリアする方法は、div要素ではない空の要素を使用しているため、クリーンな方法ではありませんdiv。したがって、ここにclearfixがあります。

親要素が終了する前に空の要素を作成する仮想要素と考えてください。これにより、フローティングエレメントを保持しているラッパーエレメントが自動的にクリアされます。この要素は文字通りDOMには存在しませんが、機能します。

フロート要素を持つラッパー要素を自動的にクリアするには、次を使用できます

.wrapper_having_floated_elements:after {  /* Imaginary class name */
  content: "";
  clear: both;
  display: table;
}

:afterそのために私が使用した疑似要素に注意してくださいclass。それはそれ自体を閉じる直前にラッパー要素の仮想要素を作成します。domを見ると、ドキュメントツリーにどのように表示されるかがわかります。

Clearfix

ご覧のdivように、フロートをクリアするフロートされた子の後にレンダリングされます。これは、これにも使用しているプロパティをdiv持つ空の要素を持つことと同等clear: both;です。なぜdisplay: table;contentこれはこの回答の範囲外ですが、疑似要素の詳細についてはこちらをご覧ください

IE8は:after疑似をサポートしているため、これはIE8でも機能することに注意してください。


元の答え:

ほとんどの開発者は、コンテンツをページ上で左または右にフロートします。おそらくdivはロゴ、サイドバー、コンテンツなどを保持します。これらのdivは左または右にフロートし、残りのスペースは未使用のままにするため、他のコンテナーを配置すると、残りのスペースにも浮きますのでclear: both;、それが使用されるのを防ぐために、左右に浮いているすべての要素をクリアします。

デモンストレーション:

------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------

今、あなたが他のdivは、以下のレンダリングしたい場合はどのようなdiv1あなたが使用しますので、clear: both;それはあなたがすべてのフロートをクリアするようになりますので、左または右

------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------

3
フロートについて聞いたことがない場合は、まずフロートの概要を読むことをお勧めします-たとえば、次の回答のリンクを参照してください。次に戻ってこの答えを読んでください-それは理にかなっています。
osa

37
注意してください、山車をしていない元々の側で2つのブロックレベル要素の側面を持っているために発明され、それは単に副作用です!元々の目的は、テキストが画像の周囲に流れるようにすることだったので、画像をどちらの方向にもフロートさせました。
マダラのゴースト

3
これを読む前に参照するために、関連の短い答えは、単に一般的なアイデアを得るために... stackoverflow.com/questions/16568272/...
ミスターエイリアン

@ mr-alien良い例ですが、jsfiddle.net / N82UD / 1の場合、画面を縮小すると、フロートに問題があり、「cleared」要素がフローに従っていません:jsfiddle.net/N82UD/138 It浮かされたアイテム2のスペースを取る
Omar

1
@Carlo:たとえば、Twitter Bootstrapなどのテンプレートでよく使用される代替手段。置くことですdisplay: inline-block要素に、親にあなたが使用することができtext-align: lefttext-align: centerまたはtext-align: right例えば。
Daan

39

このclearプロパティは、要素の左側、右側、または両側を、同じブロックのフォーマットコンテキスト内で以前にフロートした要素に隣接させることはできないことを示しています。クリアされた要素は、対応するフローティング要素の下にプッシュされます。例:

clear: none; 要素は浮遊要素に隣接したままです

clear: left; 要素が左の浮動要素の下にプッシュされました

clear: right; 要素が右の浮動要素の下にプッシュされました

clear: both; 要素はすべての浮動要素の下にプッシュされました

clear 現在のブロックフォーマットコンテキスト外のフロートには影響しません


1
優れた。これが最良の答えです。なぜ別の答えが受け入れられたのかしら。
sawa

display: inline-block;このシナリオからcssプロパティを削除するとどうなりますか?inline-block親要素を、classを持つ兄弟要素に引き伸ばしfloat-leftます。これにより、「現在のブロックの書式設定コンテキスト外のフロートに影響を与えない」ステートメントが間違っています。誰かが説明してくれませんか?
Sashrika Waidyarathna 2017年

@SashrikaWaidyarathna:親要素は、必ずしもその子のブロックフォーマットコンテキストを生成するわけではありません。あなたの例では(a)削除display: inline-blockすると、ブロックフォーマットコンテキストが生成されなくなります(b)その要素内のフロート/クリア最初のフロートはすべて同じブロックフォーマットコンテキスト(ビューポート)の一部になります。
Salman A

@SalmanA、CSS仕様を参照する説明をありがとう。私はブロックフォーマットコンテキストの定義を知りませんでした。
Sashrika Waidyarathna 2017年

2
スンダピチャイドッペルゲンガー?
Manoj Kumar


13

エイリアン氏の答えは完璧ですが、とにかく私は<div class="clear"></div>それを使用することをお勧めしません。これはdiv不正な構造とセマンティックの観点からは無意味な空であり、これによりコードが柔軟でなくなります。一部のブラウザでは、このdivにより高さが増し、さらに高さが必要になりますheight: 0;。しかし、フロートされた要素の周りに背景や境界線を追加したい場合、本当の問題が発生します。Webの設計が悪いため、折りたたまれるだけです。フローティングエレメントを、clearfix CSSルールのあるコンテナーにラップすることをお勧めします。これもハックですが、美しく、より柔軟に使用でき、人間やSEOのロボットでも読みやすくなっています。


この他の投稿の詳細はclearfix次のとおりです。stackoverflow.com
Bill Hoag

2

1つの要素を他の要素の下に配置したい場合は、CSSでこのコードを使用します。フロートに使用されます。

コンテンツをフロートする場合、左または右にフロートできます。そのため、一般的なレイアウトでは、左ナビゲーション、コンテンツdiv、およびフッターがあります。

フッターがこれらの両方のフロートの下に留まるようにするには(左右にフロートしている場合)、フッターを次のように配置します clear: bothます。

これにより、両方のフロートの下にとどまります。

(左をクリアするだけの場合、本当に必要なのは clear: left;です。)

このチュートリアルを実行します。


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