Menu

CSS float と clear: 画像の回り込みと解除

float は要素を片側に寄せ、雑誌の写真のように文章を回り込ませます。float の left、right、inline-start、clear による回り込みの解除、float の親の高さが 0 になる理由と display: flow-root での直し方、ページのレイアウトに float を使わなくなった理由を解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

float の役割

float は要素をコンテナの片側に寄せ、後に続く文章をその周りに回り込ませます:

float したボックスの margin があるので、文章がボックスにくっつきません。このすき間は margin で調整します。文章の側に、float に向けた margin を付けることはできません。

値

値結果
none (初期値)float しない
left左端に寄せる
right右端に寄せる
inline-start行の始まりに寄せる。英語では左、アラビア語やヘブライ語では右
inline-end行の終わりに寄せる

inline-start と inline-end は書字方向に従うので、これで作ったレイアウトは右から左のページで正しく反転します。また、float した要素は block になります。display: inline は block に変わるので、span や img でも width と height が効きます。

文章の中の画像を回り込ませる

定番の使い方は、記事の中の画像の周りに文章を流すことです。左右に 1 つずつ float させてみます:

clear: 回り込みを止める

clear は「この側にある前の float より下から始める」という意味です。次のセクションの見出しのように、float の横に並べたくない要素に使います:

1 つ目の見出しは float の横に押し込まれます。2 つ目は float の下から始まります。clear には left、right、both、inline-start、inline-end、none を指定できます。

高さが 0 になる親と flow-root

float は通常のフローから外れるので、子要素がすべて float しているコンテナにはフローの中に何もなく、高さが 0 になります。背景と border は、float の上の細い線になってしまいます:

display: flow-root は新しいブロック整形コンテキストを作り、float を必ず包みます。古いコードでは、同じ結果を得るために「clearfix」を使っています:

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

overflow: hidden や auto でも float を包めますが、切り取りという副作用があります。overflow を参照してください。

float はレイアウト用ではない

flexbox と grid ができる前は、ページ全体のレイアウトを float した段で組み、あちこちで clearfix と幅の計算をしていました。その時代は終わりました。float では中央に寄せられず、段の高さをそろえられず、内容のサイズが変わると崩れます。行と列には display: flex か display: grid を使い、float は何かの周りに文章を回り込ませるために使いましょう。文章を回り込ませるのではなく画像を中央に置くなら、画像の中央寄せ を見てください。

形に沿って回り込ませる

shape-outside を使うと、float の四角形ではなく、形に沿って文章を回り込ませられます。float した要素でのみ効きます:

.avatar {
  float: left;
  width: 120px; height: 120px;
  border-radius: 50%;
  shape-outside: circle(50%);
  margin-inline-end: 16px;
}

よくある間違い

  • 親の高さが 0 になる。 子要素がすべて float しています。display: flow-root を追加しましょう。
  • 段組みやナビゲーションに float を使う。 flexbox か grid を使いましょう。
  • float: center があると思う。 ありません。flexbox、grid、margin: 0 auto で中央に寄せます。
  • float の後の内容が、回り込んでほしくないのに回り込む。 clear: both を指定するか、float と文章を flow-root のコンテナに入れます。
  • 多言語サイトで物理的な left と right を使う。 inline-start と inline-end を使えば、右から左の言語でレイアウトが反転します。

よくある質問

CSS の float は何をしますか?

要素を通常のフローから取り出し、コンテナの左端か右端に寄せます。その後に続く文章やインラインの内容は、その要素の周りに回り込みます。

clear は何をしますか?

clear は、指定した側にある前の float より下に要素を移します: clear: left、clear: right、clear: both。float の横に内容が回り込むのを止める方法です。

float した要素の親の高さが 0 になるのはなぜですか?

float は通常のフローから外れるので、float した子要素しかない親にはフローの中の内容がなく、高さが 0 になります。親に display: flow-root を追加すると、float を包むように大きくなります。

clearfix とは何ですか?

親に float を包ませるためのテクニックで、昔は clear: both を指定した ::after 疑似要素を使っていました。今は親に display: flow-root を指定すれば 1 行で同じことができます。

レイアウトに float を使うべきですか?

いいえ。float で段組みを作っていたのは、flexbox と grid ができる前のことです。レイアウトには flexbox か grid を使い、float は本来の役割、つまり画像や引用の周りに文章を回り込ませるために使いましょう。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める