(CSS)floatは「回り込み」ではないことと、IE, Operaのバグ

floatは「回り込み」ではないが分かりやすかったので、それに従ってfloatの概念を振りかえってみました。

floatとは文字通り「浮く」というイメージで、さらに分かりやすくいうと

通常の流れから取り除く(まるでそれが存在していないかのように)。このとき、
  1. フロートに重なるブロックボックスはフロートの背面に隠される(フロートの背景が透明なら、背面のブロックボックスが透けて見える)
  2. ただし、行ボックス(テキストの1行が入るボックス)はフロートと重ならないように幅が縮む

2番目の「テキストは幅が縮む」のがあたかも「回り込み」をしているように見えるのですが、ボックス自体は回り込まないのが正しい(「仕様書どおり」という意味。以下、「正しい」という言葉を同じ意味で使います)floatの理解だということが、Sample1で分かると思います。

======= Sample1 =======

CSS↓

#test20110627sample01 .aa {
	width:50px;
	height:50px;
	background:#fcc;
	float:left;
}
#test20110627sample01 .bb {
	width:200px;
	height:100px;
	background:#ccf;
}

html↓

<div id="test20110627sample01">
	<div class="aa">あいうえおかきくけこ</div>
	<div class="bb">さしすせそたちつてと</div>
</div>

結果↓(ブラウザ依存)

あいうえおかきくけこ
さしすせそたちつてと

↓↓ Firefox, Google Chrome, Safari, Lunascape ↓↓

sample1_Firefox

↑これが正しい表示

↓↓ Opera ↓↓

sample1_Opera

↑Operaはボックスが「回り込んで」しまっています(バグ)

↓↓ IE ↓↓

sample1_IE

↑さらにIEでは、ボックス間に隙間ができてしまっています。それに加え、「内容物に応じてボックスの幅・高さが押し広げられる」バグが見られます。この場合、ピンクのボックス(aa)の縦が50pxより大きくなっています。

普通は、上のOperaのような表示が欲しくてfloatを使うことが多いと思いますが、このブラウザ間の差異を解消するためには、紫のボックス(bb)の左にマージン(この場合、例えば50px)を与えてやれば、解消できます。

ただ、

ブログでよくあるような段組レイアウトを実現するためにfloatが使われていますが、これはフロートの振る舞いの厳密な規則にあるように、「左フロートにつづく左フロートは、先の左フロートより右側になければならず(右フロートの場合は左右逆に読み替え)、フロートは可能な限り上に配置しなければならない」という規則を利用しているのです。だから、左右のカラムの両方にfloatを指定するわけです。

とあるように、紫のボックス(bb)にもfloatをかけるのが一般的でしょう。すなわち、

======= Sample2 =======

CSS↓

#test20110627sample02 .aa {
	width:50px;
	height:50px;
	background:#fcc;
	float:left;
}
#test20110627sample02 .bb {
	width:200px;
	height:100px;
	background:#ccf;
	float:left;
}

html↓

<div id="test20110627sample02">
	<div class="aa">あいうえおかきくけこ</div>
	<div class="bb">さしすせそたちつてと</div>
</div>

結果↓(ブラウザ依存)

あいうえおかきくけこ
さしすせそたちつてと

 

↓↓ IE以外 ↓↓

sample2_Firefox

↑正しい表示

↓↓ IE ↓↓

sample2_IE

↑この場合、ボックス間の謎の余白も消えます。ただし、「内容物に応じてボックスが押し広げられる」現象は依然として見られます。

なお、「さしすせそたちつてと」の部分をもっと長い文章にしたら、ピンクの下辺以下の表示は、Sample1では文字が左側に流れ込み(はみ出た「あいうえおかきくけこ」と重なる)、Sample2では長方形の領域に文字が埋まります。IE、Opera の場合はどちらも長方形で、IEではさらに、文字の長さ分に応じて紫色のボックスが広がります。

ここで、floatは「回り込み」ではなく「浮く」という意味に近い、ということを念頭に、

中身が全部 float だったら、そのボックスは「空」と解釈できるで、ボーダーで囲っても float した要素を囲むことはない

と予測できる、つまり height=0 になるはずですが、Opera と IE ではボックスに width を与えると float した要素に応じて height が生ずるというバグが見られます。

======= Sample3 =======

CSS↓

#test20110627sample03 .aa {
	border:1px solid #c00;
	width:300px;
}
#test20110627sample03 img {
	float:left;
}

html↓

<div id="test20110627sample03">
	<div class="aa">
		<img src="http://static.zooomr.com/images/9981709_da89ac0c92_m.jpg">
		<img src="http://static.zooomr.com/images/9981710_32a843d334_m.jpg">
	</div>
</div>

結果↓(ブラウザ依存)


↓↓ Firefox, Google Chrome, Safari, Lunascape ↓↓

sample3_Firefox

↑これが正しい見え方。横幅300px、高さ0pxの赤い罫線が上に見えます。

↓↓ Opera ↓↓

sample3_Opera

↑Opera のバグ

↓↓ IE ↓↓

sample3_IE

↑さらに IE では、画像周り(横方向)に余白が生じています。

ということで、float と仲良くするには「回り込みではない」という理解と IE のバグを知ることが大切になるのだと思いました。

Filed under: ★Web制作関係  タグ: , , , , ,   charlie432 00:00  Comments (0)
    2011年6月
    « 5月   7月 »
     12345
    6789101112
    13141516171819
    20212223242526
    27282930