グローバルナビや、メニューで、横並びリストをCSSで書くときに
li {
float: left;
}
で横並びにする人、多いかと思います。
これは正しいのですが、
困ったことに親要素のulタグが高さ0になってしまうこと、
ありませんか?
▼ 個々のリスト要素は高さがあるのに

▼ 親要素のulタグの高さが0になってしまう

これは非常によくあるあるCSSで、マークアップをやっていく段階で
必ずといっても過言でないほど、当たる壁です。
【回避策 その1】親要素にoverflowを指定する
手っ取り早く高さを出すには、親要素のulタグに、overflow: hidden;を
指定してあげます。
ul {
overflow: hidden;
}
li {
float: left;
}
本来、overflow: hidden; は、
「要素(ボックス)からはみ出たコンテンツをカットして表示しない」
という意味があるのですが、このような回り込みに適用すると、親要素に高さを与えることができます。

「【回避策 その1】親要素にoverflowを指定する」の場合のCSSソースコード例
ul {
overflow: hidden;
}
li {
background: #00bcd4;
border-right: 1px solid #00a6bb;
box-sizing: border-box;
color: #fff;
float: left;
list-style-type: none;
line-height: 50px;
width: 150px;
text-align: center;
}
li:last-child {
border-right: none;
}
【回避策 その2】:before, :after を利用する
ulにoverflow: hidden;を使用してもよいのですが、
例えばマウスオーバーで子要素、孫要素のサブメニューが開くような場合、
overflow: hidden;により表示されなくなってしまう場合があります。
そうなると回避策 その1は利用できなくなるため、別の回避策として
疑似要素を利用します。
具体的には次のサンプルコードの通りです。
li {
background: #00bcd4;
border-right: 1px solid #00a6bb;
box-sizing: border-box;
color: #fff;
float: left;
list-style-type: none;
line-height: 50px;
width: 150px;
text-align: center;
}
li:last-child {
border-right: none;
}
ul:before, ul:after {
content: "";
clear: both;
display: block;
}
ul本体には何も指定せず、
ul: before と、ul: after に
空の要素を置いてあげます。
空の要素の指定方法にも様々ありますが、ここでは、
・中身が空(content: “”;)で、
・回り込みを解除(clear: both;)し、
・ブロック要素、つまり横幅100%(display: block;)の
要素を空要素としています。
そうすることで、なんということでしょう

overflowを指定することなく、高さを持たせることができました。
