CSSのfloat
プロパティは、画像などにテキストを回り込ませたい時に使える。代替技術もあるが、float
はその手軽さが魅力だ。
floatのはたらき
CSSでは、行と段落に基づいたレイアウトを基本としている。1行に収めるインライン要素と、前後で改行するブロック要素の組み合わせである。テキストの流れに沿って整列されることから、フローレイアウトと呼ばれる。
float
プロパティを指定すると、その要素はこのフローレイアウトのルールから外れて、コンテナ要素内の左右どちらかに寄る。コンテナがインラインであってもブロックであっても、float
プロパティは作用する。
もしコンテナ内に別の要素(あるいはテキスト)がある場合、それはフロート要素を回り込むように表示される。
基本的にはコンテナの上端に合わせて表示されるが、幅が足りなくなると自分を下げていく。また、コンテナに高さが指定されている場合、高さが足りなくなるとはみ出る(position:absolute;
を指定した場合と同じく、そもそもコンテナの高さの計算には含まれていない)。
基本的な使い方
float
プロパティには、以下のような値が用意されている。none
を除くこれらのいずれかを要素に指定すると、その要素はフロート要素となる。とてもシンポー(シンプル)。
floatプロパティの値 | 概要 |
---|---|
left |
要素を左に寄せる。 |
right |
要素を右に寄せる。 |
inline-start |
要素を書字方向の先頭側に寄せる。 |
inline-end |
要素を書字方向の末尾側に寄せる。 |
none |
フロートを解除する。 |
inline-start
とinline-end
が一見ややこしそうだが、これは単純に文字の方向を基準にしているだけで、左右のどちらに寄せるというfloat
の働きは変わらない。
デフォルトでは、テキストは左から右に流れる。そのため、left
とinline-start
、right
とinline-end
は同じ意味を持つ。
右から左に流れるテキストであれば、inline-start
はright
、inline-end
はleft
と同じ意味を持つ。
テキストの方向は、CSSのdirection
プロパティで指定できる。ただ、MDNによると、可能な限りCSSではなくHTMLのdir
属性を用いるべきとのことだ。
理由は明記されていない(あるいは見つけられなんだ)が、たぶんアクセシビリティ的なことだろう。CSSではテキストの方向を支援デバイスに伝えられないから、なるべくHTMLを使って明示しろ、という意味だと思う。
また、writing-mode: vertical-rl;
などを指定すると、左右ではなく上下にフロートさせることもできる(あまり使いどころはないかもしれないが)。
floatのおもしろい特徴
float
プロパティには、いくつかのおもしろい(そして注意が必要な)特徴がある。
displayプロパティをblock
にする
float
プロパティを指定した要素は、display
プロパティの値が内部的にblock
に変更される。
例えば<span>
などのインライン要素にfloat
を指定するとブロック要素になる。inline-flex
やinline-grid
を指定している要素は、flex
やgrid
として計算し直される。
要素の順番で回り込み方が変わる
float
プロパティを指定した要素は、コンテナ要素の上端に寄せられる。
十分な横幅がない場合、フロート要素より先に幅を占める要素(例えばブロック要素)があると、その要素の下に落ちる。
一方、フロート要素より後に幅を占める要素がある時は、フロート要素が上に来る。
コンテナからサイズを無視される
float
プロパティを指定すると、その要素はposition: absolute;
を指定した時のように、そのコンテナのフローレイアウトから外れる。要素自体に高さがあっても、それがコンテナの高さに影響を与えることがなくなる。
親要素のdisplay: flow-root;
を指定すると、フロート要素の高さが計算されるようになる。
回り込むのはテキストだけで、ブロックは重なる
コンテナ内の要素は、float
プロパティを指定した要素を回り込む。このとき、回り込む要素がブロック要素かインライン要素かによって、挙動に違いがある。
ブロック要素の場合、ボックス自体は回り込まず、中のコンテンツだけが回り込む(ブロック要素のボックスは、フロート要素を無視して、デフォルトのままに振る舞う)。一方、インライン要素の場合は、ボックスごと回り込む。
回り込みは子要素のclearプロパティで解除する
フロート要素の回り込みを途中で解除したい時は、回り込む要素にclear
プロパティを指定する。
このプロパティに指定できる値は以下の通り。
floatプロパティの値 | 概要 |
---|---|
left |
float: left; が指定された要素への回り込みを解除。 |
right |
float: right; が指定された要素への回り込みを解除。 |
both |
両側への回り込みを解除。 |
inline-start |
float: inline-start; が指定された要素への回り込みを解除。 |
inline-end |
float: inline-end; が指定された要素への回り込みを解除。 |
none |
何もしない。 |
なお、以下のケースではclear
プロパティが期待通りに機能しないため注意が必要である。
- 親要素に
float
プロパティが指定されている。 - インライン要素に
clear
プロパティを指定している。
また、 片側だけ回り込みを解除したい場合に、解除するフロート要素よりも反対側のフロート要素の高さが低い場合、見かけ上clear: both;
を指定した場合と同じ結果になることがある。
floatプロパティが効かない時に考えられること
回り込む要素がブロック要素で、かつ幅が回り込むフロート要素より小さいと、回り込む余地なくなる。そのため、float
プロパティは効いているのに、見かけ上は効いていないように見えることがある。
この場合、ボックスの幅をフロート要素より大きくすれば回り込みが発生する。