Webページのレイアウトを組む方法として、かつて広く使われていたのが float プロパティです。
現在は Flexbox や CSS Grid が主流ですが、古いサイトの保守・コードの読み解きのために float の仕組みを知っておくことは重要です。
この記事でわかること
- float: left / right の基本的な動作
- clearfix(高さ崩れ防止)の仕組み
- 2カラム・3カラムレイアウトの作り方
- clear: both による回り込み解除
- float / Flexbox / Grid のコード比較
floatとは?
float は元々、画像にテキストを回り込ませるために設計されたプロパティです。後に多くの開発者がレイアウトにも流用するようになりましたが、その副作用(高さの崩れ)に対処するためのテクニックが必要になりました。
| 値 | 動作 |
|---|---|
float: left |
要素を左に寄せ、後続要素が右側に回り込む |
float: right |
要素を右に寄せ、後続要素が左側に回り込む |
float: none |
float を解除する(デフォルト値) |
基本パターン編
基本の float(左・右寄せ)
float: left で要素を左に寄せ、後続のテキストや要素が回り込む。float: right で右寄せ。画像にテキストを回り込ませるのが本来の用途。
<div class="container"> <img class="float-left" src="image.jpg" alt="画像"> <p>画像の右側にテキストが回り込みます。</p> </div>
.float-left { float: left; /* 要素を左に寄せ、後続要素を右側に回り込ませる */ margin: 0 16px 8px 0; /* 右と下に余白を設けてテキストとの間隔を確保 */ width: 120px; /* float 要素は幅を明示的に指定する必要がある */ } .float-right { float: right; /* 要素を右に寄せ、後続要素を左側に回り込ませる */ margin: 0 0 8px 16px; width: 120px; }
clearfix — 高さの崩れを防ぐ
float した子要素は親の高さ計算から外れるため、親の高さが0になって崩れる。::after 疑似要素で clear: both を当てる「clearfix」がその対策の定番。
<div class="clearfix"> <!-- 親に clearfix クラスを付ける --> <div class="box">float 要素 A</div> <div class="box">float 要素 B</div> </div>
/* clearfix:float した子要素を親が正しく囲むための定番テクニック */ .clearfix::after { content: ''; /* 疑似要素を生成するために必須(中身は空) */ display: table; /* ブロック要素として配置し float の影響を受けないようにする */ clear: both; /* 左右どちらの float も解除して親が高さを認識できるようにする */ } .box { float: left; /* 要素を左に float させる */ width: 48%; margin: 0 2% 0 0; }
レイアウト応用編
2カラムレイアウト(float + margin)
サイドバーを float: left で固定幅にし、メインコンテンツに margin-left を設けて並べる。float 時代のサイドバーレイアウトの定番。
<body class="clearfix"> <nav class="sidebar">サイドバー</nav> <main>メインコンテンツ</main> </body>
.clearfix::after { content: ''; display: table; clear: both; } /* 高さ崩れ防止 */ .sidebar { float: left; /* サイドバーを左に寄せる */ width: 200px; /* サイドバーの幅を固定する */ } main { margin-left: 200px; /* サイドバー幅と同じ値を左マージンに設定して隣に配置する */ }
3カラムレイアウト
左サイドバー・メイン・右サイドバーの三列構成。左右を float させ、中央を margin で確保する。HTMLの記述順に制約がある点が欠点。
<body class="clearfix"> <!-- 左右の float を main より先に書く必要がある --> <nav class="nav-left">左ナビ</nav> <aside class="aside-right">右ウィジェット</aside> <main>メインコンテンツ</main> </body>
.clearfix::after { content: ''; display: table; clear: both; } .nav-left { float: left; /* 左サイドバーを左に寄せる */ width: 160px; /* 左サイドバーの幅を160pxに固定する */ } .aside-right { float: right; /* 右サイドバーを右に寄せる */ width: 180px; /* 右サイドバーの幅を180pxに固定する */ } main { margin-left: 160px; /* 左サイドバーの幅ぶんだけ左マージンを確保する */ margin-right: 180px; /* 右サイドバーの幅ぶんだけ右マージンを確保する */ }
均等カラム(%幅 + float)
全要素を float: left にして width をパーセントで指定する、float 版グリッドの定番。ただし box-sizing の扱いと margin の計算が煩雑。
<div class="row"> <div class="col">カラム 1</div> <div class="col">カラム 2</div> <div class="col">カラム 3</div> </div>
.row { width: 100%; } .row::after { content: ''; display: table; clear: both; } /* clearfix */ .col { float: left; /* 全カラムを左に float させる */ width: 33.33%; /* 3等分(100 ÷ 3 ≈ 33.33%) */ padding: 0 12px; /* カラム内の左右の余白 */ box-sizing: border-box; /* padding を幅の内側に含める */ }
解除と応用編
clear: both — 回り込みの解除
float が続いた後、次の要素から回り込みを解除したいときに clear: both を使う。clear: left / right で片方だけ解除することも可能。
<div class="float-left">左に float</div> <div class="float-right">右に float</div> <div class="clear">ここから通常フロー</div> <div>この要素も通常フロー</div>
.float-left { float: left; width: 120px; } .float-right { float: right; width: 120px; } .clear { clear: both; /* 左右どちらの float も解除してここから通常フローに戻る */ /* clear: left → 左 float だけ解除 */ /* clear: right → 右 float だけ解除 */ }
ヘッダー・フッター付きページ全体レイアウト
float を使ったサイト全体の構成。ヘッダーとフッターは幅100%で配置し、中段だけ float で左右に分ける。clearfix が必須。
<body> <header>ヘッダー</header> <div class="content-wrap clearfix"> <nav class="sidebar">サイドバー</nav> <main>メインコンテンツ</main> </div> <footer>フッター</footer> </body>
header, footer { width: 100%; /* ヘッダーとフッターは横幅いっぱいに広げる */ } .clearfix::after { content: ''; display: table; clear: both; /* 高さ崩れ防止 */ } .sidebar { float: left; /* サイドバーを左端に固定する */ width: 200px; /* サイドバーの幅を200pxに固定する */ } main { margin-left: 200px; /* サイドバーの幅ぶん左マージンを確保してメインを隣に配置 */ }
比較まとめ
float vs Flexbox / Grid — 比較まとめ
同じ「左サイドバー+メイン」レイアウトを float・Flexbox・Grid の3通りで書いた場合の比較。コード量と直感性の違いを確認できる。
<div class="wrap"> <nav class="sidebar">サイドバー</nav> <main>メインコンテンツ</main> </div>
/* float 版:clearfix 必須・margin で幅を確保する必要がある */ .wrap::after { content: ''; display: table; clear: both; /* clearfix がないと高さが崩れる */ } .sidebar { float: left; /* サイドバーを左に寄せる */ width: 200px; /* 幅の明示的な指定が必須 */ } main { margin-left: 200px; /* サイドバー幅ぶん余白を作る(自動計算されない) */ }
/* Flexbox 版:clearfix 不要・直感的に書ける */ .wrap { display: flex; /* これだけで子要素が横並びになる */ } .sidebar { width: 200px; /* サイドバーの幅を固定する */ flex-shrink: 0; /* 幅が縮まないようにする */ } main { flex: 1; /* 残りのスペースをすべて占有する(margin の計算不要) */ }
/* Grid 版:レイアウトの意図が一目でわかる */ .wrap { display: grid; grid-template-columns: 200px 1fr; /* 200px → サイドバーを200pxに固定する */ /* 1fr → メインが残りのスペースを占有する */ /* float も clearfix も margin の計算も一切不要 */ }
まとめ
- float は画像のテキスト回り込みが本来の用途。レイアウト目的は Flexbox / Grid を使う
- float した子要素は親の高さ計算から外れる → clearfix(::after)で対処
clear: bothで float の影響を解除してから通常フローに戻る- 2カラムは
float: left+margin-left、3カラムは左右を float させて中央を margin で確保 - 同じレイアウトが Flexbox なら clearfix 不要、Grid ならさらに1行で書ける