floatによるレイアウト崩れをclearfixで解決する
float プロパティで要素を横並びにしたレイアウトの際、
・後ろに続く要素が意図せず回り込む。
・背景色が適用されなくなる。
これらの問題を解決するため、clearfix という定番の方法を記します。
見本となるレイアウトですが、ヘッダー内でロゴ(今回はサイト名)とナビゲーションメニューをfloatプロパティを使って横並びにしたパターンで解説します。
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<body> <div id="wrap"> <header> <nav> <div class="logo"> <h1>My Bangkok</h1> </div> <div class="menu"> <ul> <li><a href="#">DRINK</a></li> <li><a href="#">FOOD</a></li> <li><a href="#">ACCESS</a></li> <li><a href="#">NEWS</a></li> </ul> </div> </nav> <div class="description"> <p>本格タイ料理と美味しいお酒でくつろぎの時間を提供いたします。</p> </div> </header> <div><img class="mainvisual" src="images/thaifood.JPG" alt="ご飯の写真"/></div> </div> </body> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 |
nav { background-color: red; } .logo { float: left; padding: 15px; margin-left: 50px; } .menu { float:right; } |
このようにナビゲーションメニューにfloatを使用すると後続の説明文の段落(本格タイ料理〜)が回り込んでしまい、”background-color”で指定した背景色も適応されていません。
floatを指定した子要素が浮いて(float)しまい親要素の高さが無くなってしまっていることが原因です。
親要素に高さを持たせるために cleafix セレクタを作成する。
1 2 3 4 5 6 7 8 |
.clearfix:after { /* ①*/ content: ""; /* ②*/ display: block; /* ③*/ clear: both; } |
①擬似要素「:after」を用い、contentプロパティ要素を 空の値とする事でこのセレクタを指定した要素の末尾に空のボックスが作られる。
②display:blockとし、擬似要素で作られたボックスをブロックレベル要素にする。
③clear プロパティを使用してfloatを解除する。
(clearプロパティはブロック要素として扱う事で有効となる)
floatを指定している要素の親要素にあたるnavタグに作成したcleafixセレクタを指定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<nav class="clearfix"> <div class="logo"> <h1>My Bangkok</h1> </div> <div class="menu"> <ul> <li><a href="#">DRINK</a></li> <li><a href="#">FOOD</a></li> <li><a href="#">ACCESS</a></li> <li><a href="#">NEWS</a></li> </ul> </div> </nav> |
後続の段落の回り込みを防いで、ナビゲーションに背景色も適応されるようになりました。