【WordPress】ボタンで表示を切り替えるレスポンシブ対応のナビゲーションメニュー

ウェブサイト運営において、SEO的にもかなり重要なのがナビゲーションメニュー。サイト内にどのようなコンテンツがあり、それらの入り口として機能します。

メニューは結構大きな範囲を占めますので、問題となるのがスマホでの表示、つまりはレスポンシブ対応です。

PCではヘッダー部分に水平に表示、スマホでは画面右下にボタン表示し、タップすることで画面上からメニューがトグルダウンで下りてくるように作りました。

スポンサーリンク

仕様確認

PC表示のメニューです。ヘッダー画像の下に水平なメニューが表示されます。

また、お問い合わせとサイト内検索のフォームはヘッダー画像の上にあります。

スマホ表示にするとメニューとお問い合わせ、サイト内検索が非表示になり、代わりに右下にメニューボタンが表示されます。

メニューボタンをタップすると上からメニューが下りてきます。このメニューの中にお問い合わせとサイト内検索があります。

メニューが表示されるとメニューボタンは非表示になり、メニュー内の「メニューを閉じる」でメニューを非表示にでき、再度右下にメニューボタンが表示されます。

一応動作の様子がわかるGIFアニメも貼っておきます。

プログラミング

実際のサイトではどのファイルもたくさんのコードが記述されていますが全部載せるとややこしいので、今回関係がある部分のみの抜粋です。

header.php

<head>
    <link rel="stylesheet" href="<?php echo get_stylesheet_uri(); ?>" media="screen" />
    <script type="text/javascript" src="https://code.jquery.com/jquery-1.9.1.min.js"></script>
	<script type="text/javascript" src="<?php echo get_template_directory_uri(); ?>/js/menubutton.js"></script>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css">
</head>
<body>
    <header>
        <nav id="header-menu">
            <div id="header-menu-inner">
                <?php wp_nav_menu(array( 'theme_location' => 'header-nav') ) ; ?>
                <div class="sp-menu-list"><a href="<?php echo home_url( '/' ) ?>/contact">お問い合わせ</a></div>
                <div id="sp-search"><?php get_template_part('searchform'); ?></div>
                <div class="sp-menu-list"><a class="close"><i class="fas fa-angle-up"></i> メニューを閉じる</a></div>
            </div>
        </nav>
    </header>
</body>

スクリプトの読み込み

トグルダウンとトグルアップの動作を使うために3行目でjQueryを読み込んでいます。

4行目でスクリプトのデータを読み込んでいます。WPテーマのフォルダ内に「js」というフォルダを作って、その中に「menubutton.js」というファイル名で入れています。

ナビゲーションメニューの設定

ナビゲーションメニューはWordPress上で「header-nav」という名前で設定しています。

11行目はその設定名を指定する必要がありますので、もし設定名が異なる場合は書き換える必要があります。

Font Awesome

メニューのボタンなどの記号はFont Awesomeを使っていますので、ヘッダーで読み込んでいます。

footer.php

<div id="menu-btn">
	<a class="open"><i class="fas fa-bars"></i>
	<div id="menu-text">MENU</div></a>
</div>

このコードは読み込まれればどこでもOKです。とりあえずfooter.phpにしてます。

CSS

#menu-btn {
    position: fixed;
    bottom: 15px;
    right: 15px;
    height: 50px;
    width : 50px;
}
#menu-btn a {
    display: block;
    background: #008000;
    text-align: center;
    color: #fff;
    font-size: 1.5em;
    text-decoration: none;
	filter:alpha(opacity=50);
    -moz-opacity: 0.8;
    opacity: 0.8;
}
#menu-btn a:hover {
    background: #006600;
	filter:alpha(opacity=50);
    -moz-opacity: 0.8;
    opacity: 0.8;
}
#menu-text {
	font-size: 0.5em;
}
#searchform {
	display: inline-block;
	position: relative;
	border: 0.5px solid #ddd;
	width: 100%;
}
#s {
	display: inline-block;
	padding: 5px;
	margin-bottom: 0;
	width: 100%;
	max-width: 914px;
	height: 33px;
	border: 0;
	box-sizing: border-box;
}
#searchsubmit {
	position: absolute;
	top: 0;
	right: 0;
	width: 25px;
	height: 33px;
	padding: 0.5em;
	border: 0;
	background: #fff;
	color: #aaa;
}
#searchsubmit:hover {
	color: #000;
}
input[type="text"] {
	margin: 0;
	margin-bottom: 20px;
	padding: 5px;
	max-width: 750px;
	outline: none;
	border: 1px solid #aaa;
	background: #fff;
	color: #454545;
	font-size: 85%;
	width: 80%;
}
input[type="submit"] {
    padding: 5px;
    font-size: 85%;
    line-height: 1.5;
    color: #000;
    border: 1px solid #aaa;
    border-radius: 3px;
	padding: 0.6em 1em;
}
.sp-menu-list a{
	display: block;
	padding: 1em;
    height: 100%;
    text-decoration: none;
    background: #008000;
	text-align: left;
	border-top: solid 1px #648C07;
	border-bottom: solid 1px #648C07;
	font-size: 0.9em;
	color: #fff;
}
.sp-menu-list a:hover{
	background: #006600;
}
#close-btn a{
	display: block;
	padding: 1em;
    height: 100%;
    text-decoration: none;
    background: #008000;
	text-align: center;
	border-top: solid 1px #006600;
	font-size: 0.9em;
	color: #fff;
}
#sp-search {
	display: block;
}
#pc-menu {
	display: none;
}
#header-menu {
	display: none;
	width:100%;
 	position: fixed;
	z-index:999;
	top: 0px;
	left: 0px;
}
header .menu {
	position: relative;
	clear: both;
	width: 100%;
	background: #008000;
}
header div.menu > ul > li,
header ul.menu > li {
	float: none;
	width: 100%;
	border-bottom: solid 1px #648C07;
}
header div.menu > ul > li:last-child,
header ul.menu > li:last-child {
    border-bottom: 0;
}
header .menu li {
 	position: relative;
	font-size: 85%;
	float: none;
	vertical-align: middle;
}
header .menu li a,
.sp-menu-list a {
 	display: block;
	padding: 1em;
 	height: 100%;
	text-decoration: none;
	color: #fff;
	background: #008000;
}
header .menu li a:hover{
  background: #006600;
}
header ul ul {
	margin-left: 0;
	font-size: 16px;
}
header ul.sub-menu,
header ul.children {
    display: block;
    width: 100%;
}
header .sub-menu li,
header .children li {
    position: relative;
	width: 100%;
	float: none;
	border-top: solid 1px #648C07;
}
header ul.sub-menu ul,
header ul.children ul {
    top:-1px;
    left:180px;
}
header .menu li:hover > ul {
  display: block;
}
@media screen and (min-width:950px) {
	#menu-btn,
	#close-btn,
	#sp-search,
	.sp-menu-list {
    	display: none !important;
  	}
	#pc-menu {
		display: block;
		float: right;
		width: 390px;
	}
	#searchform {
		width: 250px;
	}
	#s {
		width: 100%;
	}
	#searchform {
		float: right;
	}
	#pc-contact {
		display: inline-block;
		float: left;
	}
	#pc-contact a{
		display: block;
		height: 35px;
		padding: 0.5em 1em;
		text-decoration: none;
		background: #008000;
		font-size: 0.9em;
		color: #fff;
	}
	#pc-contact a:hover{
		background: #006600;
	}
	#header-menu {
		display: block !important;
		position: relative;
		width: 100%;
		margin-left: auto;
		margin-right: auto;
		background: #008000;
	}
	header .menu li {
		text-align: center;
	}
	header div.menu > ul > li,
	header ul.menu > li {
		-webkit-box-sizing: border-box;
        -moz-box-sizing: border-box;
        box-sizing: border-box;
		float: left;
		width: 20%;
		height: 48px;
		border-bottom: 0;
		border-right: solid 1px #648C07;
	}
	header div.menu > ul > li:first-child,
	header ul.menu > li:first-child,
	header div.menu > ul > li:nth-child(6n+1),
	header ul.menu > li:nth-child(6n+1){
		border-left: solid 1px #648C07;
	}
	header ul.sub-menu,
	header ul.children {
	    position: absolute;
	    display: none;
	    margin-left: 0;
	    width: 16.6666%;
		z-index: 1;
	}
	header .sub-menu li,
	header .children li {
	    position: relative;
	    width: 158.3333px;
	}
}

CSSはメニューとボタンのデザイン、ウィンドウ幅に応じて表示・非表示を切り替える設定をします。

JavaScript

(function($) {
	$(function(){
		$(".open").click(function(){
			$("#header-menu").slideDown();
			$("#menu-btn").fadeOut();
		});
		$(".close").click(function(){
			$("#header-menu").slideUp();
			$("#menu-btn").fadeIn();
		});
	});
})(jQuery);

スマホ表示のメニューボタンのスクリプトです。

右下に表示されるボタンは#menu-btnで、メニューが#header-menuです。

#menu-btnには.openが指定されており、クリックすることで#header-menuを表示し、同時に#menu-btnを非表示にします。

メニュー内にある「メニューを閉じる」には.closeが指定されており、クリックすることで#header-menuを非表示にして#menu-btnを表示させます。

コメント

コメントする前にお読みください

プログラミングに関する質問について、詳細なコードはお答えしませんのでご了承ください。
また、迷惑コメント防止のために初回のコメント投稿は承認制です。投稿が反映されるまで少し時間がかかります。