zz log

zaininnari Blog

floatによる横並びメニュー(等幅&リストタグ)

floatによる横並びメニューを作成した際のメモ。

  • ulタグの高さと背景
  • ulタグ配下のタグ

を色々変更した。

チェック対象ブラウザ

すべてwinxp

<?xml version="1.0" encoding= "Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title></title>
<link href="css/base.css" rel="stylesheet" type="text/css" media="screen,print" />
</head>
<body>
<p>bodyの背景は黒</p>
<div id="wrapper">
  <p>#wrapperの背景はオレンジ、幅は800px</p>
  <p>#menu 背景は赤。幅は780px。</p>
  <p>#menu ul 背景は紫。幅は760px。</p>
  <p>#menu li のマウスオーバー時の背景はブルー、それ以外はグリーン。1個の幅は125px → 6個で 750px</p>
  <!-- メニュー -->
  <div id="menu">
    <ul>
      <li class="location"><a href="">HOME</a></li>
      <li><a href="">サービス概要</a></li>
      <li><a href="">会社概要</a></li>
      <li><a href="">お問い合わせ</a></li>
      <li><a href="">サイトマップ</a></li>
      <li><a href="">アクセス</a></li>
    </ul>
    <p style="clear:both;">#menu終わり。style="clear:both;"でfloat解除</p>
  </div>
</div>
</body>
</html>

テスト1:不完全

必要最低限のものに絞った形

/* ------------------------------------------------
Common
-------------------------------------------------*/
body     {
	background:#666;
	color: #FFF;
	line-height: 1.4em;
	font-size: 12px;
}

body,div,ul,ol,li,p {
	padding: 0;
	margin: 0;
}


ol,ul {
	list-style-type: none;
}

/* ------------------------------------------------
Wrapper
-------------------------------------------------*/

#wrapper {
	width: 800px;
	margin:0 auto;
	background-color:#F60
}

/* ------------------------------------------------
Menu
-------------------------------------------------*/

#menu {
	width: 760px;
	background:#F00;
}

#menu ul {

}

#menu li{
	float: left;
	width: 125px;
}

#menu li a{
	font-size:18px;
	color: #fff;
	text-decoration: none;
	display: block; /* クリックする領域を拡大 */
	width: 100%; /* ieのバグ対策 */
	text-align: center;
	background:#3C0;
}

#menu li a:hover{
	color: #f00;
	background:#0FF;
}

/* #menu li a:hover を強制的に表現 */
#menu .location a {
	color: #f00;
	background:#0FF;
}

問題点:
ulタグの高さが0のため、背景色の紫は表示されていない。
また、pタグにてfloatを解除しているが、通常メニューを作成する際に、この場所にpタグ(clearが使えるブロック要素)が来ることはないため、この例を使うことはない。

テスト2:完全

テスト1のclear:bothを指定しているpタグの不自然さを解消する。
所謂clearfixハックを使用する。
◆参考<a href="http://www.techdego.com/2007/01/floatcssclearfix.php?griffin_skin=1l-2b-1r-s">ボックスをはみ出さないようにfloatをクリアCSS:clearfixハック | Tech de Go

おまけ:
clearfixハックを使用する際には、floatしている親要素(ul)に

<ul class="clearfix">

と指定して使用するが、”clearfix”という名前は、”menu”などと異なり、文章について意味を持たせるものではないため、本来の使い方ではない。
◆参考 class名に「表示に関する指示を組み込む」ことについて | Tech de Go
ここでは、明示しない形で組み込む。

/* ------------------------------------------------
Menu
-------------------------------------------------*/

#menu {
	width: 780px;
	background:#F00;
}

#menu ul {
	/*height: 35px;*/
	/*overflow: hidden;*/
	width: 760px;
	background:#60C;
}

/* clearfixの追加 */
#menu ul:after {
   content: ".";
   display: block;
   clear: both;
   height: 0;
   visibility: hidden;
}
#menu ul { display: inline-block; }
/* exlude MacIE5 \*/
* html .clearfix { height: 1% }
#menu ul {display:block;}
/* end MacIE5 */

#menu li{
	float: left;
	width: 125px;
}

#menu li a{
	font-size:18px;
	color: #fff;
	text-decoration: none;
	display: block;
	width: 100%;
	text-align: center;
	background:#3C0;
}

#menu li a:hover{
	color: #f00;
	background:#0FF;
}

/* #menu li a:hover を強制的に表現 */
#menu .location a {
	color: #f00;
	background:#0FF;
}

ulタグの高さが0では無くなったため、紫色が表示された。

テスト3:完全

ulタグ以下を装飾。

ulに height: 50px; を追加。
(clearfixは、floatの解除とともに、高さを再計算するので、無意味っぽい?
ここでは、aタグの背景に画像を貼り付けることを想定して付ける)

#menu ul {
	height: 50px;
	width: 760px;
	background:#60C;
}

ulタグが50px確保され、紫色の部分が拡大。
liタグはそのまま。

テスト4:不完全

#menu li a{
	font-size:18px;
	color: #fff;
	text-decoration: none;
	display: block;
	width: 100%;
	padding: 20px 0;
	text-align: center;
	background:#3C0;
}

paddingの上下 + フォントの高さ > 50pxとなった結果、紫色からはみ出る。
また、
paddingの上下の調整&フォントの調整によって50pxに合わせることも可能だが、使用するフォントによって高さがことなるため、環境によってずれる可能性がある。

テスト5:不完全

紫色からはみ出た部分を隠す。

#menu ul {
	height: 50px;
	overflow: hidden;
	width: 760px;
	background:#60C;
}

紫色からはみ出た部分は隠せたが、テキストの位置がやや下目。
(paddingは、強制的に指定した長さを確保するため)

テスト6:完全

テスト3まで戻り、
今度は、line-heightを追加。

#menu li a{
	font-size:18px;
	line-height:50px;
	color: #fff;
	text-decoration: none;
	display: block;
	width: 100%;
	text-align: center;
	background:#3C0;
}

テキストが中央に配置された。

テスト6のソース

<?xml version="1.0" encoding= "Shift_JIS"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=shift_jis" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<title></title>
<link href="css/base.css" rel="stylesheet" type="text/css" media="screen,print" />
</head>
<body>
<p>bodyの背景は黒</p>
<div id="wrapper">
  <p>#wrapperの背景はオレンジ、幅は800px</p>
  <p>#menu 背景は赤。幅は780px。</p>
  <p>#menu ul 背景は紫。幅は760px。</p>
  <p>#menu li のマウスオーバー時の背景はブルー、それ以外はグリーン。1個の幅は125px → 6個で 750px</p>
  <!-- メニュー -->
  <div id="menu">
    <ul>
      <li class="location"><a href="">HOME</a></li>
      <li><a href="">サービス概要</a></li>
      <li><a href="">会社概要</a></li>
      <li><a href="">お問い合わせ</a></li>
      <li><a href="">サイトマップ</a></li>
      <li><a href="">アクセス</a></li>
    </ul>
  </div>
  <div>div要素(ただの飾り)</div>
</div>
</body>
</html>
/* ------------------------------------------------
Common
-------------------------------------------------*/
body     {
	background:#666;     /* デバック用視覚効果 */
	color: #FFF;         /* デバック用視覚効果 */
	text-align:center;   /* ie6専用 センタリング */
}

body,div,ul,ol,li,p {
	padding: 0;          /* cssリセット */
	margin: 0;           /* cssリセット */
}


ol,ul {
	list-style-type: none;/* cssリセット */
}

/* ------------------------------------------------
Wrapper
-------------------------------------------------*/

#wrapper {
	width: 800px;          /* 全体の幅を指定 */
	margin:0 auto;         /* 全体のセンタリング */
	background-color:#F60; /* デバック用視覚効果 */
	text-align:left;       /* bodyのcenterを元に戻す*/
}

/* ------------------------------------------------
Menu
-------------------------------------------------*/

#menu {
	width: 780px;           
	background:#F00;        /* デバック用視覚効果 */ 
}

#menu ul {
	width: 760px;           
	background:#60C;        /* デバック用視覚効果 */
}

/* clearfixの追加 */
#menu ul:after {
   content: ".";
   display: block;
   clear: both;
   height: 0;
   visibility: hidden;
}
#menu ul { display: inline-block; }
/* exlude MacIE5 \*/
* html .clearfix { height: 1% }
#menu ul {display:block;}
/* end MacIE5 */

#menu li{
	float: left;
	width: 125px;
}

#menu li a{
	font-size:18px;
	line-height:50px; /* aタグの背景画像を参考に指定 */
	color: #fff;
	text-decoration: none;
	display: block; /* aタグのクリック範囲を拡大 */
	width: 100%; /* IEバグ対策 */
	text-align: center;
	background:#3C0;
}

#menu li a:hover{
	color: #f00;
	background:#0FF;
}

/* #menu li a:hover を強制的に表現 */
#menu .location a {
	color: #f00;
	background:#0FF;
}