こんにちはSIMです。今日はメガメニューの頻出4パターンについて紹介します。
はじめに
メガメニューとは?
メガメニューとは、ナビゲーションの一種で、広い面積を持つドロップダウンメニューのことです。メガドロップダウンメニューとも言います。
実物をお見せすると下のとおりで、幾つか種類があります。
See the Pen メガメニュー | hover |SlideToggle by Satoru Shimizu (@sat-simizu) on CodePen.
今回作るメガメニュー頻出4パターン
今回作るのは次の頻出4パターンのメガメニューです。
- ホバー操作でスライドアップ・ダウン(例:Apple・BRIDGESTONE)
- ホバー操作でフェードイン・アウト(例:野村総合研究所・テルモ)
- クリック操作でスライドアップ・ダウン(例:FUJITSU・三菱総合研究所)
- クリック操作でフェードイン・アウト
インターネットを見て回ると、hover操作でslideUp・slideDownするタイプが多い印象です。
メガメニューのレスポンシブについて
メガメニューはモバイル端末ではほぼ例外なくハンバーガーメニューに変わります。そのため、メガメニューをレスポンシブ化する場合にはモバイル端末ではハンバーガーメニューに変わるようにコーディングします。
そうなると、もはやメガメニューですらないので、この記事では敢えてメガメニューのレスポンシブについては語らないことにします。
私の場合は、PC用とスマホ用でヘッダーグローバルナビゲーションは別々に作ることが多いです。コード量は多くなる代わりにバグる確率がかなり減ります。
メガメニューの下準備
最初にコーディングに下準備から紹介していきます。
リセットCSS
リセットCSSが違うと、同じ表示にならないことが多いので完コピしたい人は下記リセットCSS(CDN)をHTMLのheadタグ内にコピペして下さい。
<!-- reset.css destyle -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/destyle.css@1.0.15/destyle.css" />
jQuery(CDN)読み込み
同じくjQuery(CDN)も読み込まないと、そもそも動作しないので忘れずにHTMLのbody閉じタグ直上にコピペして下さい。
補足として、自分のサイト用のJavaScriptファイルへのパスも同じ場所に書くのを忘れないで下さい。
<!-- jQueryの(CDN) -->
<script src="https://code.jquery.com/jquery-3.6.1.min.js"
integrity="sha256-o88AwQnZB+VDvE9tvIXrMQaPlFFSUTR+nldQm1LuPXQ=" crossorigin="anonymous"></script>
<!-- このサイトのスクリプト -->
<script src="./script.js"></script>
メガメニュー | ホバー操作 | スライドダウン・アップ
まずはオーソドックスなマウスホバー操作でメガメニューがスライドダウンして出てくるタイプから見ていきましょう。
下に完成品のCodePenを貼っておくので、動作とコードを確認してみてください。
See the Pen メガメニュー | hover |SlideToggle by Satoru Shimizu (@sat-simizu) on CodePen.
HTMLの構造
HTML構造は今回紹介するメガメニュー4種とも共通です。
メガメニュー部分のHTMLを下に載せておきます。
<ul class="menu" id="mega_menu">
<!-- メニュー(親) -->
<!-- マウスをhoverすると下にメガメニューのコンテンツが現れる -->
<li class="menu-parent">
<a href="#" class="menu-parent_a">和食メニュー</a>
<!-- メガメニュー(子) -->
<!-- 通常は非表示/マウスhoverでメニュー(親)のメガメニュー(子)が現れる -->
<div class="menu-child">
<ul class="menu-child_ul">
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">サンマ定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">ホッケ定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">刺し身定食</a>
</li>
</ul>
</div>
</li>
<li class="menu-parent">
<a href="#" class="menu-parent_a">洋食メニュー</a>
<div class="menu-child">
<ul class="menu-child_ul">
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">豚生姜焼き定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">ロースカツ定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">ハンバーグ定食</a>
</li>
</ul>
</div>
</li>
<li class="menu-parent">
<a href="#" class="menu-parent_a">麺類メニュー</a>
<div class="menu-child">
<ul class="menu-child_ul">
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">醤油ラーメン</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">味噌ラーメン</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">豚骨ラーメン</a>
</li>
</ul>
</div>
</li>
</ul>
この中から直接メガメニュー動作に関係している箇所を抜粋したのが次のコードです。
<!-- メニュー(親) -->
<!-- マウスをhoverすると下にメガメニューのコンテンツが現れる -->
<li class="menu-parent">
<!-- メニュー(兄):ここ以外の場所をクリックしたらメガメニュー(子)がスライドアップ -->
<a href="#" class="menu-parent_a">和食メニュー</a>
<!-- メガメニュー(子) -->
<!-- 通常は非表示/マウスhoverでメニュー(親)のメガメニュー(子)が現れる -->
<div class="menu-child">
<ul class="menu-child_ul">
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">サンマ定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">ホッケ定食</a>
</li>
<li class="menu-child_li">
<a href="#" class="menu-child_li-a">刺し身定食</a>
</li>
</ul>
</div>
</li>
メガメニューに関係する各タグの役割を書いておくと次のようになります。
- メニュー(親)class=”menu-parent”のliタグ:マウスをhoverすると下にメガメニューのコンテンツが現れる
- メガメニュー(子)class=”menu-child”のdivタグ:通常は非表示/マウスhoverでメニュー(親)のメガメニュー(子)が現れる
- メニュー(兄)class=”menu-parent_a”のaタグ:メニュー(兄)以外の場所をクリックしたらメガメニュー(子)がスライドアップする
CSSの構造
今回紹介するCSSもほぼ共通です。
メガメニュー部分のCSS全文は次のとおりですが、ほとんどが体裁を整えるための装飾なので実際にメガメニューの動作に関係している箇所は少ないです。
/* --------------------------- */
/* メニュー(親)のスタイル */
/* --------------------------- */
.menu {
display: flex;
position: relative;
background-color: #370617;
color: #fff;
}
.menu-parent {
width: calc(100% /3);
border-right: 1px solid #fff;
}
.menu-parent:last-child {
border-right: none;
}
.menu-parent_a {
display: block;
padding: 10px 0;
text-align: center;
}
/* --------------------------- */
/* メニュー(親)の直接動作に関係する箇所 */
/* --------------------------- */
/* 親をhover時 */
@media (hover: hover) {
.menu-parent:hover .menu-parent_a{
background-color: #9d0208;
transition: all .3s;
}
}
/* --------------------------- */
/* メガメニュー(子)のスタイル */
/* --------------------------- */
.menu-child {
display: none;
position: absolute;
top: 100%;
left: 0;
width: 100%;
padding: 20px 0;
background-color: #ffbf69;
color: #333;
}
.menu-child_ul{
list-style-type: disc;
}
.menu-child_li {
width: 200px;
margin: 0 auto;
line-height: 2;
}
こちらに直接メガメニュー動作に関係する箇所を抜粋すると下のようになります。
/* --------------------------- */
/* メニュー全体を囲うタグ */
/* --------------------------- */
.menu {
display: flex;
position: relative;
background-color: #370617;
color: #fff;
}
/* --------------------------- */
/* メニュー(親)の直接動作に関係する箇所 */
/* --------------------------- */
/* 親をhover時 */
@media (hover: hover) {
.menu-parent:hover .menu-parent_a{
background-color: #9d0208;
transition: all .3s;
}
}
/* --------------------------- */
/* メガメニュー(子)のスタイル */
/* --------------------------- */
.menu-child {
display: none;
position: absolute;
top: 100%;
left: 0;
width: 100%;
padding: 20px 0;
background-color: #ffbf69;
color: #333;
}
メガメニュー動作に影響する箇所のCSSについて解説すると下のとおりで非常にシンプルです。
- メニュー(親)の直接動作に関係する箇所:マウスホバー時に変化する背景色の設定
- メガメニュー(子)の直接動作に関係する箇所:通常はdisplay: noneで非表示、position: absoluteで位置設定
- メニュー全体を囲うタグ:position: relativeに設定し、メガメニューの基準位置とする
jQueryの構造
jQueryも基本的には単純構造です。
メガメニューのjQuery全文は次のとおりです。
$(function() {
// メニュー(親) にマウスhoverした時
$('.menu-parent').hover(function() {
// メガメニュー(子)をスライドダウンで表示
$(this).find('.menu-child').stop().slideDown(400);
// メニュー(親) にマウスhoverを外した時
}, function() {
// メガメニュー(子)をスライドアップで非表示
$(this).find('.menu-child').stop().slideUp(50);
});
// メニュー(兄)以外の場所をクリックしたらメガメニュー(子)がスライドアップ
$(document).on('click touchend', function (e) {
if (!$(e.target).closest('.menu-parent_a').length) {
$('.menu-child').slideUp(100);
}
});
});
それぞれの構文の役目は上でコメントアウトしたとおりで極めてシンプルです。
ただし、最後の「メニューの兄要素以外をクリックしたらメガメニューがスライドアップする機能」は付けてないホームページも多いので、必要に応じて削除してください。私個人はこの機能が付いていた方が使いやすいと思います。
メガメニュー | ホバー操作 | フェードイン・アウト
次は同じくホバー操作でメガメニューがフェードでフワッと現れるパターン。
CodePenで作ったメガメニュー見本を下に置いておくので、動作とコードをご確認下さい。
See the Pen メガメニュー | hover | fade by Satoru Shimizu (@sat-simizu) on CodePen.
なお、HTMLとCSSは上で紹介したスライドイン・アウトの場合と共通なので説明は省略します。
jQueryの構造
jQueryの構文も上の例とほぼ共通です。一応jQuery全文も下に載せておきます。
$(function() {
// メニュー(親) にマウスhoverした時
$('.menu-parent').hover(function() {
// メガメニュー(子)をスライドダウンで表示
$(this).find('.menu-child').stop().fadeIn(300);
// メニュー(親) にマウスhoverを外した時
}, function() {
// メガメニュー(子)をスライドアップで非表示
$(this).find('.menu-child').stop().fadeOut(300);
});
// メガメニュー(兄)以外の場所をクリックしたらメガメニュー(子)がフェードアウト
$(document).on('click touchend', function (e) {
if (!$(e.target).closest('.menu-parent_a').length) {
$('.menu-child').fadeOut(100);
}
});
});
前のスライドダウンのメガメニューと違っている箇所は整理すると下のとおりだよ。
- slideDown→fadeIn
- slideUp→fadeOut
メガメニュー | クリック操作 | スライドダウン・アップ
次はコーディングがクリック操作で現れるメガメニューを紹介します。
茶色の横メニュー(activeクラス付き)以外に場所をクリックすると、メガメニューが閉じる機能も付いています。
まずはメガメニュー目本のCodePenを置いておくので、動作とコードを確認してみて下さい。
See the Pen メガメニュー | click by Satoru Shimizu (@sat-simizu) on CodePen.
HTMLは全部共通なので、説明は省略します。
CSSの構造
実はCSSもほぼ共通ですが、少しだけ違っています。
hover操作のメガメニューとのCSSの大きな違いは、クリック操作でメニューにactiveクラスが付与される設定になっています。
コピペする人のためにメガメニューのCSS全文も載せておきます。
body {
font-family: "Noto Sans JP", "メイリオ", "Meiryo", "MS ゴシック",
"Hiragino Kaku Gothic ProN", "ヒラギノ角ゴ ProN", sans-serif;
}
.base-container{
padding: 50px 0;
}
/* --------------------------- */
/* メニュー(兄)のスタイル */
/* --------------------------- */
.menu {
display: flex;
position: relative;
background-color: #370617;
color: #fff;
}
.menu-parent {
width: calc(100% /3);
border-right: 1px solid #ccc;
}
.menu-parent:last-child {
border-right: 0;
}
.menu-parent_a {
display: block;
padding: 10px;
text-align: center;
}
.menu-parent_a.blrn{
border-left: none;
border-right: none;
}
/* --------------------------- */
/* メニュー(兄)の動作に直接関係する箇所 */
/* --------------------------- */
/* メニュー(兄)hover時に色を変える */
@media (hover: hover) {
.menu-parent_a:hover{
background-color: #9d0208;
transition: all .1s;
}
}
/* メニュー(兄)にactive付与されたとき色を変える */
.menu-parent_a.active{
background-color: #9d0208;
}
/* --------------------------- */
/* メガメニュー(弟)のスタイル */
/* --------------------------- */
/* メニュー(弟)は普段は非表示 */
.menu-child {
display: none;
position: absolute;
top: 100%;
left: 0;
width: 100%;
padding: 20px 0;
background-color: #ffbf69;
color: #333;
}
.menu-child_ul{
list-style-type: disc;
}
.menu-child_li {
width: 200px;
margin: 0 auto;
line-height: 2;
}
ホバー操作のメガメニューと違っている部分のコード
ホバー操作のメガメニューとの違いは、メニュー(兄要素)のhover設定と、同じくメニュー(兄)にactiveクラスが付いた時のスタイル設定の2箇所のみです。
ホバー操作のメガメニューと違っている部分を抜粋したのが下のコードです。
/* --------------------------- */
/* メニュー(兄)の動作に直接関係する箇所 */
/* --------------------------- */
/* メニュー(兄)hover時に色を変える */
@media (hover: hover) {
.menu-parent_a:hover{
background-color: #9d0208;
transition: all .1s;
}
}
/* メニュー(兄)にactive付与されたとき色を変える */
.menu-parent_a.active{
background-color: #9d0208;
}
メガメニュー(クリック操作)動作に直接関係する部分のCSS
メガメニュー動作に関係する箇所のCSSの機能をまとめると次のようになります。
- メニュー(兄要素)hover時に色を変える:「.menu-parent_a:hover {background-color…}」
- メニュー(兄)にactive付与されたとき色を変える:「.menu-parent_a.active {background-color…}」
- メガメニュー(弟)は普段は非表示:「.menu-child{display: none; position: absolute; など}」
- メガメニューの基準位置:「.menu {position: relative;}」
jQueryの構造
jQueryもベースはhoverで動くメガメニューで
それに数行足しています。
メガメニュー(クリック操作・slideToggle)の全文は下の通りです。意外と短いですね。
$(function () {
// メニュー(兄)をクリックしたら
$('.menu-parent_a').click(function () {
// メガメニュー(弟)をスライドダウンまたはアップ
$(this).siblings('.menu-child').slideToggle(300);
// メニュー(兄)にactiveクラスを付与
$(this).addClass('active');
// 別の兄弟のメガメニュー(弟)をスライドアップで非表示
$('.menu-parent_a').not($(this)).siblings('.menu-child').slideUp(100);
// 別の兄弟のメニュー(兄)からactiveクラスを取り去る
$('.menu-parent_a').not($(this)).removeClass('active');
});
// メガメニューのリンク以外の場所をクリックしたらメガメニュー(弟)がスライドアップ・メニュー(兄)からactiveクラスを剥奪
$(document).on('click touchend', function (e) {
if (!$(e.target).closest('.menu-parent_a').length) {
$('.menu-parent_a').removeClass('active');
$('.menu-child').slideUp(100);
}
});
});
新たに足したコードは、slideToggleでactiveクラスの脱着に関するものと…
// メガメニュー(弟)をスライドダウンまたはアップ
$(this).siblings('.menu-child').slideToggle(300);
// メニュー(兄)にactiveクラスを付与
$(this).addClass('active');
残りは、activeクラスが付いたメニュー以外をクリックすると、メガメニューが閉じる動作に関するコードです。
// メガメニューのリンク以外の場所をクリックしたらメガメニュー(弟)がスライドアップ・メニュー(兄)からactiveクラスを剥奪
$(document).on('click touchend', function (e) {
if (!$(e.target).closest('.menu-parent_a').length) {
$('.menu-parent_a').removeClass('active');
$('.menu-child').slideUp(100);
}
});
メガメニュー | クリック操作 | フェードイン・アウト
最後にクリック操作で、メガメニューがフェードで現れるタイプの紹介です。
下の見本メガメニューのCodePenを置いておくので、動作とコードの確認をしてみて下さい。
See the Pen メガメニュー | click-fade by Satoru Shimizu (@sat-simizu) on CodePen.
なお、HTMLとCSSは上で紹介したメガメニュー(クリック操作・スライドダウン)と共通ですので説明は省略しますね。
jQueryの構造
jQueryの全文は下の通りで、基本はさっきのスライドダウンタイプとほぼ同じです。
$(function () {
// メニュー(兄)をクリックしたら
$('.menu-parent_a').click(function () {
// メガメニュー(弟)をフェードインまたはアウト
$(this).siblings('.menu-child').fadeToggle(300);
// メニュー(兄)にactiveクラスを付与
$(this).addClass('active');
// 別の兄弟のメガメニュー(弟)をフェードアウトで非表示
$('.menu-parent_a').not($(this)).siblings('.menu-child').fadeOut(100);
// 別の兄弟のメニュー(兄)からactiveクラスを取り去る
$('.menu-parent_a').not($(this)).removeClass('active');
});
// メガメニュー(兄)以外の場所をクリックしたらメガメニュー(弟)がフェードアウト・メニュー(兄)からactiveクラスを剥奪
$(document).on('click touchend', function (e) {
if (!$(e.target).closest('.menu-parent_a').length) {
$('.menu-parent_a').removeClass('active');
$('.menu-child').fadeOut(100);
}
});
});
さっきのスライドダウンタイプとの違いは下のとおり。
- slideToggle → fadeToggle
- slideUp → fadeOut
動作がスライドからフェードに変わっただけですで、そこに関するコードを変更しただけです。
まとめ
以上、jQueryメガメニュー頻出4パターンの設定・作り方を紹介しました。
ネット上にはまとまった情報が少ないので、これをご覧になった方の参考になれば幸いです。