【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を表示させます。

コメント

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

迷惑コメント防止のために初回のコメント投稿は承認制のため、投稿が反映されるまで少し時間がかかります。もちろん荒らしは承認しません。

教えて君やクレクレ君に対しては回答しませんのでご了承ください。