float を解除すると margin が効かなくなる
概要
div 等のブロックに float を指定した場合に、これを解除するために float を設定しないブロックに clear: both; 等で解除すると、clear: both; 等を指定した div といったブロックに margin (margin-top)を指定しても効かなくなります。これは仕様のようなものであるため、clear: both; と margin (margin-top)を同一のブロックに指定しないようにするしか方法がありません。
例えば、下の図のように赤枠の div に clear: both; を指定して float を解除したうえで、margin-top: 20px; を指定しても margin-top は効かないため、div の上に 20px の隙間はできません。
ここでは、float を解除した際に margin (margin-top)が効くようにする方法について説明します。
解決方法
方法 その1:空の div を使う
float を解除するために文字等を記述しない空の div (下の図の赤文字赤枠の div)を作成し、これに clear: both; を指定して float を解除します。そして、その次に文字等を記述する div (下の図の黒文字赤枠の div)を作成し、これに margin (margin-top)を指定すると効くようになります。
ただし、この方法では空の div が出来てしまうというデメリットがあります。
方法 その2:padding を使う
float を解除するブロック(下の図では黒文字赤枠の div)に clear: both; を指定して float を解除し、padding-top を指定して隙間を作ります。
ただし、margin と padding は異なる性質を持つものであるため、デザイン等によっては padding が使えない場合もあります。例えば、ホームページ全体の背景と float を解除するブロックの背景が異なる場合、margin の場合は隙間部分はホームページ全体の背景色になりますが、padding を使うとこれを指定したブロックの背景色になってしまいます。そのため、背景色が異なる場合の使用には向きません。
方法 その3:疑似要素を使う
下の図のように float を指定しているブロックを div (下の図の赤文字赤枠の div)で囲み、この div に疑似要素 :after で clear: both; を指定します。これにより、このブロック(下の図の赤文字赤枠の div)の終了部分の直前に疑似要素が作成され、その部分で float が解除されます。
ソースの例は以下のようになります。
- HTML(上の図の赤文字赤枠の divの部分)
- <div class="clear">
- <div></div>
- <div></div>
- <div></div>
- </div>
- CSS
- .clear:after {
- content: "";
- display: block;
- clear: both;
- }