2段階のリストを横向きに並べる方法
次に、複数のul要素とli要素で作る「2段階のリスト」を横向きに並べて、リンク集やメニューバーに装飾するCSSの書き方をご紹介致します。例として、HTMLソースを以下のように記述します。階層が2段階で、項目の合計数が多いためにHTMLソースも長くなっていますが、使っている要素は「ul」・「li」・「a」の3種類だけで、構造はシンプルです。
<ul class="basemenu"> <li><a href="a.html">企業情報</a> <ul class="secondmenu"> <li><a href="a1.html">会社概要</a></li> <li><a href="a2.html">沿革</a></li> <li><a href="a3.html">ビジョン</a></li> </ul> </li> <li><a href="b.html">サービス</a> <ul class="secondmenu"> <li><a href="b1.html">メディア</a></li> <li><a href="b2.html">コンテンツ</a></li> <li><a href="b3.html">マーケティング</a></li> </ul> </li> <li><a href="c.html">プレスリリース</a> <ul class="secondmenu"> <li><a href="c1.html">一覧</a></li> </ul> </li> <li><a href="d.html">IR情報</a> <ul class="secondmenu"> <li><a href="d1.html">ニュース</a></li> <li>(中略)</li> </ul> </li> <li><a href="e.html">広告案内</a> <ul class="secondmenu"> <li><a href="e1.html">広告商品一覧</a></li> </ul> </li> <li><a href="f.html">お問い合わせ</a> <ul class="secondmenu"> <li>(中略)</li> </ul> </li> </ul>リスト全体を囲む「ul要素」の中に、1段階目の項目を作る「li要素」が6個あります。その各li要素の中には、2段階目のリストを作る「ul要素・li要素」が含まれています。
1段階目のリストを作るul要素(※1つしかありません)には、CSSを使って装飾するために「class="basemenu"」という属性を付加しています。2段階目のリストを作るul要素(※複数個あります)には、「class="secondmenu"」という属性を付加しています。
■何もCSSを加えずにブラウザで表示させると
上記のソースをブラウザで表示すると、右図のように見えます。2階層になっているだけの、シンプルなリスト(箇条書き)項目に見えています。
ここに、CSSを加えて、横並びのリンクリストやメニューバーのように見えるよう装飾してみましょう。
2段階のリストを横向きに配置して、横並びのリンクリストを作る方法(A)
まずは、1段目も2段目も共に横方向に並べる表示方法からご紹介致します。表示例は下図の通りです。1段目は緑色のバーの形に、2段目は灰色枠のボタンの形に装飾しています。このように装飾するには、下記のようにCSSソースを記述します。各箇所の意味はコメント部分をご参照下さい。
/* ▼1階層目のリスト全体の装飾 */ ul.basemenu { margin: 0px; /* 外側の余白を消す */ padding: 0px; /* 内側の余白を消す */ list-style-type: none; /* リストの先頭記号を消す */ } /* ▼1階層目の各リスト項目の装飾 */ ul.basemenu > li { display: inline-block; /* 横方向に並べる指定 */ margin: 0px 0.25em 0.25em 0px; /* 外側の余白を調整 */ padding: 0.5em; /* 内側の余白を調整 */ } /* ▼1階層目の各リスト項目内のリンクの装飾 */ ul.basemenu > li > a { display: block; /* 全体をクリック可能に */ padding: 0.2em 0.5em; /* 内側の余白を調整 */ text-decoration: none; /* リンクの下線を消す */ background-color: green; /* 背景色の指定 */ color: white; /* 文字色の指定 */ } /* ▼1階層目のリンクの上にマウスが載った際の装飾 */ ul.basemenu > li > a:hover { background-color: blue; /* 背景色を指定 */ text-decoration: underline; /* 下線を付加 */ } /* ▼2階層目のリスト全体の装飾 */ ul.basemenu ul.secondmenu { margin: 3px 0px 0px 0.5em; /* 外側の余白を調整 */ padding: 0px; /* 内側の余白を消す */ list-style-type: none; /* リストの先頭記号を消す */ } /* ▼2階層目の各リスト項目の装飾 */ ul.basemenu ul.secondmenu li { display: inline-block; /* 横方向に並べる指定 */ margin: 0px 0.25em 0.25em 0px; /* 外側の余白を調整 */ padding: 0px; /* 内側の余白を消す */ } /* ▼2階層目の各リスト項目内のリンクの装飾 */ ul.basemenu ul.secondmenu li a { display: block; /* 全体をクリック可能に */ padding: 0.3em 0.5em; /* 内側の余白を調整 */ text-decoration: none; /* リンクの下線を消す */ border: 1px solid #cccccc; /* 枠線の指定 */ border-radius: 9px; /* 角を丸くする */ } /* ▼2階層目のリンクの上にマウスが載った際の装飾 */ ul.basemenu ul.secondmenu li a:hover { color: blue; /* 文字色を指定 */ background-color: #ddffff; /* 背景色を指定 */ text-decoration: underline; /* 下線を付加 */ }本来は縦方向に並ぶはずのリスト項目を横方向に並べる方法には、前ページでご紹介した通り、displayプロパティの値に「inline-block」を指定する方法を使っています。前ページと同じ説明になるためここでは割愛しますから、詳しくは前ページの解説をご参照下さい。
■ポイント: 子セレクタ「>」記号
ここでは、装飾対象を1階層目のリスト項目だけに限定する方法として、「>」記号を使って、「ul.basemenu > li」のようにセレクタを記述しています。このように、「要素A > 要素B」と記述すると、「要素Aに直接含まれる要素B」だけを対象にして装飾できます。この「>」記号を書かずに「ul.basemenu li」と指定してしまうと、2階層目も含めたすべてのli要素が装飾対象になってしまいます。
2段階のリストを横向きに配置して、横並びのリンクリストを作る方法(B)
2段目のサブメニュー項目を、横ではなく縦に並べると下図のように見えます。このように装飾するには、先ほどのCSSソースに下記のCSSソースを追記します。
/* ▼1階層目の各項目を横に並べる(※1) */ ul.basemenu > li { float: left; } /* ▼2階層目の項目を縦に並べる(※2) */ ul.basemenu ul.secondmenu li { display: block; } /* ▼1階層目のリストの末尾で回り込みを解除する(※3) */ ul.basemenu:after { content: ""; clear: both; display: block; }1段目のリスト項目を横方向に並べる方法を、「display: inline-block;」から「float: left;」に変更し(※1)、2段目のリスト項目は横方向ではなく縦方向に並べるために「display: inline-block;」から「display: block;」に変更しています(※2)。最後に、回り込みを解除するため、clearfixを加えています(※3)。
2段階のリストを横向きに配置して、メニューバーを作る方法
リスト全体に背景色を加えた上で、リスト項目を横方向にぴったり並べると、メニューバーのように見えるのは、前ページでご紹介した通りです。さらに、2階層目の各項目を縦向きにぴったり並べると、下図のようにサブメニューらしく見えます。このように装飾するには、下記のようにCSSソースを記述します。
/* ▼1階層目のリスト全体の装飾 */ ul.basemenu { margin: 0px; /* 外側の余白を消す */ padding: 0px; /* 内側の余白を消す */ background-color: green; /* メニューバーの背景色 */ } /* ▽clearfix */ ul.basemenu:after { content: ""; clear: both; display: block; } /* ▼1階層目の各リスト項目の装飾 */ ul.basemenu > li { margin: 0px; /* 外側の余白を消す */ padding: 0px; /* 内側の余白を調整 */ border-right: 1px solid white; /* 右側に線を引く */ float: left; /* 横方向に並べる(左に寄せる) */ list-style-type: none; /* リストの先頭記号を消す */ position: relative; /* (※後述) */ } /* ▽先頭項目の左側に余白を設ける */ ul.basemenu > li:first-child { margin-left: 0.5em; border-left: 1px solid white; } /* ▼1階層目の各リスト項目内のリンクの装飾 */ ul.basemenu > li > a { display: block; /* 全体をクリック可能に */ margin: 0px; /* 外側の余白を消す */ padding: 0.4em 0.5em; /* 内側の余白を調整 */ text-decoration: none; /* リンクの下線を消す */ color: white; /* 文字色の指定 */ background-color: green; /* 背景色の指定 */ min-width: 5em; /* 最低の横幅量 */ } /* ▼1階層目のリンクの上にマウスが載った際の装飾 */ ul.basemenu > li > a:hover { color: blue; /* 文字色を指定 */ background-color: #ccffcc; /* 背景色を指定 */ text-decoration: underline; /* 下線を付加 */ } /* ▼2階層目のリスト全体の装飾 */ ul.basemenu ul.secondmenu { background-color: yellowgreen; /* メニュー項目の背景色 */ border-width: 1px 1px 0px 0px; /* メニュー項目の枠線 */ border-style: solid; border-color: white; margin: 0px; /* 外側の余白を消す */ padding: 0px; /* 内側の余白を消す */ position: absolute; /* (※後述) */ } /* ▼2階層目の各リスト項目の装飾 */ ul.basemenu ul.secondmenu li { border-bottom: 1px solid white; /* 下側の枠線を指定 */ list-style-type: none; /* リストの先頭記号を消す */ } /* ▼2階層目の各リスト項目の装飾 */ ul.basemenu ul.secondmenu li a { display: block; /* 全体をクリック可能に */ margin: 0px; /* 外側の余白を消す */ padding: 0.4em 0.5em; /* 内側の余白を調整 */ text-decoration: none; /* リンクの下線を消す */ color: white; /* 文字色の指定 */ min-width: 5em; /* 最低の横幅量 */ } /* ▼2階層目のリンクの上にマウスが載った際の装飾 */ ul.basemenu ul.secondmenu li a:hover { color: #0000cc; /* 文字色を指定 */ background-color: #ffff80; /* 背景色を指定 */ text-decoration: underline; /* 下線を付加 */ }ここでも、メインメニュー部分(濃い緑色部分)を作る方法は、前ページの解説と同じですので割愛します。詳しくは前ページの解説をご参照下さい。
※positionプロパティの有無:
上記のCSSソースでは、下記の2つのpositionプロパティを記述しています。
(A) 1階層目の各項目(li要素)に対して指定した「position: relative;」
(B) 2階層目のリスト全体(ul要素)に対して指定した「position: absolute;」
もしこの2行を書かなかった場合は、右図の下側のように見えます。(B)の記述があることで、サブメニューが周囲から浮いて配置されて(後続の要素に重なって)表示されます。
動的にサブメニューの表示・非表示を切り替えるなら特に、この(A)・(B)の記述は必要でしょう。もしサブメニューも常時表示しておくなら、(A)・(B)の記述はない方がデザインしやすいかも知れません。
表示例
上記でご紹介した2通りの装飾例を実際にブラウザで表示確認してみたい場合は、「ul要素で作るリストを横向きメニューに装飾する方法サンプル2」ページをご覧下さい。※このサンプルページのHTMLソースでは、同一ページ内に複数のサンプルを掲載するため、class名を「basemenu1」・「basemenu2」のように分けています。サンプルページのソースからコピー&ペーストする際にはご注意下さい。
※マウスの動きに合わせてサブメニューを開閉したい場合:
本記事では、メニューバーのように見せる装飾(CSS)だけをご紹介致しました。もし、「メインメニュー項目」の上にマウスを載せた際にだけ「サブメニュー項目」が動的に表示されるようにしたい場合は、別途JavaScriptなどを併用する必要があります。その点に関しては、記事「簡単なドロップダウンメニューの作り方(jQuery活用編)」などで解説していますので、併せてご参照下さい。
ul要素とli要素を使って作る「リスト」を、CSSで横向きに並べる方法
今回は、ul要素とli要素とで作る「リスト(箇条書き)」を横向きに並べて、「リンクリスト」や「メニューバー」に見えるように装飾するCSSソースの書き方をご紹介致しました。ぜひ、試してみて下さい。【関連記事】
- 簡単なドロップダウンメニューの作り方(jQuery活用編)
- 意外と気づきにくい連番リストの使い方
- 指定量スクロールした時点で上端にメニューを出す方法
- floatを使わないCSSで、段組(マルチカラム)を作る方法
- CSSの「セレクタ」の書き方 再入門(CSS3対応版)