clearfixの最新版 -フロート関連やマージン相殺の不具合を解決するモダンブラウザ用clearfix
Post on:2016年2月8日
米Yahoo!のフロントエンド エンジニア: Thierry Koblentz氏から、シンプルなスタイルシートで書かれたモダンブラウザ用のclearfix最新版を紹介します。
The very latest clearfix reloaded
clearfixとは
「clearfix」とはフロートした要素が親要素からはみ出してしまう、親要素の背景が表示されないなどを回避するもので、当サイトでもいくつか紹介してきました。
おさらい: micro clerafix(IE6+)
まずは、おさらい。
micro clearfixは、normalize.cssのNicolas Gallagher氏によるもので、2011年にリリースされました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* For modern browsers */ .cf:before, .cf:after { content:""; display:table; } .cf:after { clear:both; } /* For IE 6/7 (trigger hasLayout) */ .cf { zoom:1; } |
IE6/7にも対応しているので、多くの制作者が利用していたと思います。
micro clearfix解説記事
モダンブラウザ用のclearfix最新版
micro clearfixの翌年に「clearfix for modern browsers」がモダンブラウザ用として、それを更に改良した最新版です。
1 2 3 4 5 |
.clearfix:after { content:" "; display:block; clear:both; } |
「zoom:1;」と「:before」が不要な理由
旧IEには、フロートした要素がはみ出してしまったり、拡大・縮小時にレイアウトが重なってしまったりとIE独自のCSSのバグがいくつかあります。
これは、IEのhasLayoutが原因のひとつとなっており、hasLayoutの値がfalseの場合に起きます。hasLayoutとは、オブジェクトがレイアウトを持っているかどうかを示すものです。hasLayoutの値をtrueにするにはいくつか方法があり、その中の一つに「zoom」に値を持たせることで実現できます。
hasLayoutのバグはIE6/7のため、これは不要です。
:before疑似要素は上のマージン相殺をモダンブラウザとIE6/7で同じにするためのものなので不要です。
「display: block;」にした理由
兄弟のボックスを「display: table;」ベースのclearfixと「display: block;」で実装した例を見てましょう。
HTMLはこんな感じで、親と子要素に上下マージンを指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<div class="left-column"> <div class="clearfix-using_display-table"> <p>Lorem Ipsum...</p> <p>Lorem Ipsum...</p> </div> <div class="clearfix-using_display-table"> <p>Lorem Ipsum...</p> <p>Lorem Ipsum...</p> </div> </div> <div class="right-column"> <div class="clearfix-using_display-block"> <p>Lorem Ipsum...</p> <p>Lorem Ipsum...</p> </div> <div class="clearfix-using_display-block"> <p>Lorem Ipsum...</p> <p>Lorem Ipsum...</p> </div> </div> |
左の「display: table;」でマージンの相殺が期待通りではない原因はバグではなく、仕様です。「display: block;」ベースのclearfixは期待通りのマージンです。
display: table;とdisplay: block;の比較
参考: clearfix with display: block VS. display: table:
古いOperaをサポート外に
もし古いOperaをサポート外にするのであれば、contentの値の空白スペースを削除できます。
1 2 3 4 5 |
.clearfix:after { content:""; display:block; clear:both; } |
sponsors