CSS ・ レイアウト

float

回り込み

要素を左または右に寄せ、後に続く文章をその周りに回り込ませます。画像の横に文章を流し込むときに使います。

初期値
none
適用対象
すべての要素
継承
しない
01

サンプルコード

HTML
1<img src="photo.jpg" alt="コーヒー豆" width="140" height="90" class="left">
2<p>自家焙煎のコーヒー豆は、産地ごとの個性を大切にしています。画像を左に寄せると、続く文章が画像の右側に回り込んで表示されます。文章が画像の高さを超えると、下に回り込みます。</p>
CSS
1.left {
2 float: left;
3 margin: 0 16px 8px 0;
4}
5p {
6 margin: 0;
7}
02

実行結果

ブラウザでの表示
03

解説

float は、要素を左右どちらかに寄せ、その後に続く文章などを周りに回り込ませるプロパティです。雑誌のように画像の横に文章を流し込むレイアウトに使います。

以前は段組みのレイアウトにも使われていましたが、現在は Flexbox や Grid を使うのが一般的です。

回り込みを止めたい要素には clear: both を指定します。

04

応用例・注意点

指定できる値・関連

名前説明
left / right左 / 右に寄せて回り込ませる
none回り込みなし(初期値)
inherit親要素から float プロパティの値を継承する
clear: both回り込みを解除する
display: flow-root親要素が float の子を包むようにする

親要素の高さがなくなる問題を防ぐ

float した子だけの親は高さが0になります。flow-root で子を包めます。

CSS
1.media {
2 display: flow-root;
3}

注意点

  1. 01段組みのレイアウトには、float ではなく Flexbox や Grid を使います。
  2. 02float した要素は親の高さに含まれないため、背景や枠線がずれることがあります。
05

float の解除(clear・clearfix・overflow)

float の問題点

子要素すべてが float されている場合、親要素の高さがなくなってしまいます。float した要素は親の高さに数えられないためです。親の背景や枠線が子を包まなくなり、下に続く要素も回り込んでしまうので、float は解除が必要です。

例1:解除しないと親の高さがなくなる

親(薄い色の枠)の中の2つの子を左右に float すると、親の高さが 0 になり、子がはみ出します。

HTML
1<div class="wrapper">
2 <div class="left">float: left;</div>
3 <div class="right">float: right;</div>
4</div>
CSS
1.wrapper {
2 padding: 4px;
3 background: #f5efe6;
4 border: 2px solid #5a3b0a;
5}
6.left, .right {
7 width: 40%;
8 padding: 16px 0;
9 text-align: center;
10 background: #b68235;
11 color: #fff;
12}
13.left {
14 float: left;
15}
16.right {
17 float: right;
18}
ブラウザでの表示

コードと表示の対応

  1. .wrapper親要素です。子が2つとも float しているので、高さは padding の分しかありません。
  2. float: left; / float: right;子要素は親の枠から下にはみ出して表示されます。

解除する方法01:clear

clear は float を解除させるために使います。値は left・right・both で、float を使った直後の要素に書きます。ただし、clear した要素の margin-top は効かなくなってしまいます。

例2:直後の要素に clear: both

float した2つの後にある「ボックス1」に clear: both を書くと、回り込みが止まり、ボックス1は float した要素の下に並びます。

HTML
1<div class="left">左のコンテンツ</div>
2<div class="right">右のコンテンツ</div>
3<div class="box box01">ボックス1</div>
4<div class="box">ボックス2</div>
CSS
1.left, .right, .box {
2 padding: 10px 0;
3 text-align: center;
4 background: #5a3b0a;
5 color: #fff;
6 font-size: 12px;
7}
8.left, .right {
9 width: 48%;
10}
11.left {
12 float: left;
13}
14.right {
15 float: right;
16}
17.box {
18 margin-top: 6px;
19}
20.box01 {
21 clear: both;
22}
ブラウザでの表示

コードと表示の対応

  1. .box01 { clear: both; }float した要素の直後の要素に書きます。左右どちらの float も解除するので both にしています。
  2. .box { margin-top: 6px; }ボックス1にも margin-top を付けていますが、clear した要素では効きません。

解除する方法02:clearfix

float をかけている要素の親要素にスタイルをかけます。::after 擬似要素で親の最後に空のブロックを作り、そこに clear: both を指定するしくみです。margin-top が効かない問題を回避できます。

例3:親の ::after で解除する(clearfix)

例1と同じHTMLに、親の .wrapper::after を足すだけで、親が子を包むようになります。

HTML
1<div class="wrapper">
2 <div class="left">float: left;</div>
3 <div class="right">float: right;</div>
4</div>
CSS
1.wrapper {
2 padding: 4px;
3 background: #f5efe6;
4 border: 2px solid #5a3b0a;
5}
6.wrapper::after {
7 content: "";
8 display: block;
9 clear: both;
10}
11.left, .right {
12 width: 40%;
13 padding: 16px 0;
14 text-align: center;
15 background: #b68235;
16 color: #fff;
17}
18.left {
19 float: left;
20}
21.right {
22 float: right;
23}
ブラウザでの表示

コードと表示の対応

  1. content: "";中身が空の擬似要素を、親の最後に作ります。
  2. display: block; clear: both;その擬似要素をブロックにして float を解除するので、親が float した子の下端まで伸びます。

解除する方法03:overflow

親要素に overflow: hidden を指定する方法です。auto や scroll を設定しても解除できますが、スクロールバーが出る可能性があるため hidden で OK です。

例4:親に overflow: hidden

例1の親に overflow: hidden を1行足すだけで、親が子を包みます。

HTML
1<div class="wrapper">
2 <div class="left">float: left;</div>
3 <div class="right">float: right;</div>
4</div>
CSS
1.wrapper {
2 padding: 4px;
3 background: #f5efe6;
4 border: 2px solid #5a3b0a;
5 overflow: hidden;
6}
7.left, .right {
8 width: 40%;
9 padding: 16px 0;
10 text-align: center;
11 background: #b68235;
12 color: #fff;
13}
14.left {
15 float: left;
16}
17.right {
18 float: right;
19}
ブラウザでの表示

コードと表示の対応

  1. overflow: hidden;float した子を含めた高さで親が計算され、子を包むようになります。

どれを使う? clearfix を使うのが無難

方法特徴・注意点
clear: bothclear: both を設定する、直後に続く要素が必要。デザインやレイアウトを目的としただけのタグを入れることは好ましくない
clearfixすべてスタイルシートで処理するため、HTMLの文章構造を損なうことなく対応できる。やや古いブラウザにも対応可能
overflow一部の古いブラウザでは、印刷時に float した部分が消えてしまう場合がある。ブラウザによっては親要素自体が消えてしまうリスクも。影などはみ出た装飾も切れる

今どきの書き方:display: flow-root

  • 親に display: flow-root; を指定しても、clearfix と同じように float した子を包めます(「応用例・注意点」の「親要素の高さがなくなる問題を防ぐ」を参照)。
  • 1行で書けて余計な擬似要素も要りません。講義どおり clearfix を使っても、flow-root を使っても、どちらでも大丈夫です。
  • なお、横並びのレイアウトを作るなら、そもそも float ではなく Flexbox を使うのが一般的です。
↑↓ 選択Enter 移動Esc 閉じるCtrl K⌘K で開閉