HTML & CSS

最終更新日:
公開日:

レシピ

レイアウト

横並びのメニューを作成する

グローバルナビゲーションなどで横並びのメニューを作成する方法について、フレックスボックスや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%を超えてしまうためです。