最終更新日:
公開日:
レシピ
レイアウト
横並びのメニューを作成する
グローバルナビゲーションなどで横並びのメニューを作成する方法について、フレックスボックスやfloatプロパティを使った3種類の方法を解説します。
この記事のポイント
- メニューの横並びレイアウトではフレックスボックスを使った方法が主流
- フレックスボックスはレスポンシブ対応にも柔軟に対応できて便利
- 横に並べたい要素の幅はwidthプロパティで「%」単位で指定する
目次
3種類の方法でメニューを横に並べる
グローバルナビゲーションやフッターナビゲーションなど横方向にメニューを並べる方法について、次の3種類の方法をそれぞれ解説します。
- フレックスボックスを使って並べる
- floatプロパティを使って並べる
- displayプロパティで「inline-block」を使って並べる
今回は次のようなグローバルナビゲーションを作っていきます。
表示幅によってナビゲーションを自動伸縮も行います。
フレックスボックスを使って横に並べる
displayプロパティのフレックスボックスを使って横に並べる方法です。
今回は以下のようなHTMLコードを使用します。
HTMLのマークアップ例
<nav id="g_navi">
<ul>
<li><a href="/">ホーム</a></li>
<li><a href="/concept">コンセプト</a></li>
<li><a href="/menu">メニュー</a></li>
<li><a href="/access">アクセス</a></li>
<li><a href="/contact">お問い合わせ</a></li>
</ul>
</nav>
リストをマークアップするul要素とli要素を使ってメニューのボタンを記述し、リスト全体はナビゲーションを表すnav要素を使います。
続いて、CSSでフレックスボックスによるレイアウトを指定します。
フレックスボックスに関する指定は赤字の箇所になります。
CSSのコード例
#g_navi {
background: #2e1200;
}
#g_navi ul {
display: flex;
margin: 0 auto;
padding: 0 3%;
width: 94%;
max-width: 960px;
list-style-type: none;
}
#g_navi ul li {
position: relative;
width: 20%;
}
#g_navi ul li:first-child::before {
position: absolute;
display: block;
content: "";
top: 25%;
left: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li::after {
position: absolute;
display: block;
content: "";
top: 25%;
right: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li a {
display: block;
padding: 17px 10px;
color: #fff;
text-align: center;
text-decoration: none;
}
#g_navi ul li a:hover {
background-color: #472108;
}
ul要素に対してdisplayプロパティのflexを指定することで、リストをフレックスボックスにしています。
続いて、ul要素の子要素li要素にwidthプロパティで幅を20%と指定すると、5つのメニューボタンが均等の幅で並びます。
フレックスボックスの指定はシンプルですが、表示幅が可変してもメニューボタンは5つの横並びになったレイアウトを維持することができるため、レスポンシブ表示も容易に対応可能になります。
floatプロパティを使って横に並べる
2つ目の方法はfloatプロパティを使って横に並べる方法です。
フレックスボックスが主流になる前はよく使われた方法でした。
HTMLはフレックスボックスのときと同じコードを使用します。
HTMLのマークアップ例
<nav id="g_navi">
<ul>
<li><a href="/">ホーム</a></li>
<li><a href="/concept">コンセプト</a></li>
<li><a href="/menu">メニュー</a></li>
<li><a href="/access">アクセス</a></li>
<li><a href="/contact">お問い合わせ</a></li>
</ul>
</nav>
リストをマークアップするul要素とli要素を使ってメニューのボタンを記述し、リスト全体をナビゲーションを表すnav要素で囲っています。
CSSのコード例
#g_navi {
background: #2e1200;
}
#g_navi ul {
overflow: hidden;
margin: 0 auto;
padding: 0 3%;
width: 94%;
max-width: 960px;
list-style-type: none;
}
#g_navi ul li {
position: relative;
float: left;
width: 20%;
}
#g_navi ul li:first-child::before {
position: absolute;
display: block;
content: "";
top: 25%;
left: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li::after {
position: absolute;
display: block;
content: "";
top: 25%;
right: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li a {
display: block;
padding: 17px 10px;
color: #fff;
text-align: center;
text-decoration: none;
}
#g_navi ul li a:hover {
background-color: #472108;
}
上からCSSの意味を解説していきます。
ul要素のoverflowプロパティは、子孫要素のli要素で使っているfloatプロパティの影響をナビゲーション内に限定するために指定しています。
li要素のfloatプロパティは横並びにする肝となっているプロパティです。
先頭から順に左詰めとなるよう、「float: left;」を指定します。
続くwidthプロパティは、親要素の幅いっぱいにメニューを並べるための指定です。
今回は5つのメニューが並ぶため、「100% / 5」で「20%」としています。
もしメニューボタンが4つだとしたら「25%」になり、6つだと「16.6%」のようになります。
また、この横幅は自動的に計算するようにcalc関数を使って「width: calc(100%/5);」と記述することも可能です。
li要素の子孫要素にあたるa要素については、単体で親要素の幅いっぱいをリンク領域にするために「display: block;」を指定します。
displayプロパティを使って横に並べる
続いて、displayプロパティの「inline-block」を指定して横に並べる方法を解説します。
HTMLは基本的には同じものを使いますが、こちらの方法ではli要素の改行を除いて1行に続けて記述します。
HTMLのマークアップ例
<nav id="g_navi">
<ul>
<li><a href="/">ホーム</a></li><li><a href="/concept">コンセプト</a></li><li><a href="/menu">メニュー</a></li><li><a href="/access">アクセス</a></li><li><a href="/contact">お問い合わせ</a></li>
</ul>
</nav>
CSSのコード例
#g_navi {
background: #2e1200;
}
#g_navi ul {
margin: 0 auto;
padding: 0 3%;
width: 94%;
max-width: 960px;
list-style-type: none;
}
#g_navi ul li {
position: relative;
display: inline-block;
width: 20%;
}
#g_navi ul li:first-child::before {
position: absolute;
display: block;
content: "";
top: 25%;
left: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li::after {
position: absolute;
display: block;
content: "";
top: 25%;
right: 0px;
width: 1px;
height: 50%;
background-color: #976d52;
}
#g_navi ul li a {
display: block;
padding: 17px 10px;
color: #fff;
text-align: center;
text-decoration: none;
}
#g_navi ul li a:hover {
background-color: #472108;
}
こちらの方法ではul要素にoverflowプロパティを記述しません。
代わりに、li要素のdisplayプロパティに「inline-block」を指定します。
先述のfloatプロパティを使った方法と比べるとCSSはシンプルですが、HTMLコードでメニューの要素を1行で記述する必要があるため少しHTMLが見づらくなってしまう点がデメリットと言えそうです。
ちなみに、こちらの方法でli要素の改行を残して表示すると次のよに表示崩れが起こります。
原因はインラインの中に改行コードの幅が含まれ、「20% * 5 + 改行コードの幅」という計算で結果として横幅の合計値が100%を超えてしまうためです。