画面右上の三本線のアイコンをクリックしたら、右側からシュッとメニューが出てくる作りにします。
まずはデモサイトを見てみましょう。
いつもどこから手をつけていいのか迷ってしまうので手順をつけて説明していきます。
①htmlを作る
<!DOCTYPE html>
<html lang="ja" dir="ltr">
<head>
<meta charset="utf-8">
<title>ハンバーガーメニューの作り方</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="style.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="js/script.js"></script>
</head>
<body>
<header>
<p class="btn-gnavi">
<span></span>
<span></span>
<span></span>
</p>
<nav id="global-navi">
<ul class="menu">
<li><a href="#">トップ</a></li>
<li><a href="#">会社概要</a></li>
<li><a href="#">ニュース</a></li>
<li><a href="#">アクセス</a></li>
<li><a href="#">お問い合わせ</a></li>
</ul>
</nav>
</header>
</body>
</html>
jQueryを使うのでライブラリを読み込むことを忘れてはいけません。ローカルでは動いていたjsが、アップした瞬間動かなくなる問題が起こり、2時間くらいなやんだのですが、読み込むライブラリを変えたら動いたので、バージョンをよくみて記述してください。
助けてくれたサイトはこちら
https://ja.stackoverflow.com/questions/7641/is-not-definedエラーの解決方法
②cssで見た目を整える
@charset "UTF-8";
*{
margin:0;
padding:0;
box-sizing: border-box;
}
header{
height: 60px;
line-height: 60px;
border-bottom: 1px solid #eeeeee;
}
a{
color: #333333;
text-decoration: none;
display: block;
}
ul li{
list-style: none;
width:100px;
}
.menu{
display: flex;
justify-content: space-around;
max-width: 980px;
margin:0 auto;
}
@media screen and (max-width: 768px){
.menu{
display: block;
}
/**レスポンシブにした時のナビの見せ方**/
header nav{
position: fixed;
width: 300px;
top: 0;
right: -300px;
background-color: rgba(33,33,33,.9);
height: 100%;
padding-top: 60px;
}
header nav ul li{
width: 100%;
}
header nav ul li a{
color: #ffffff;
padding-left: 20px;
}
header .btn-gnavi{
position: fixed;
top: 20px;
right: 20px;
width: 30px;
height: 24px;
z-index: 3;
cursor: pointer;
transition: all 400ms;
-webkit-transition:all 400ms;
}
header .btn-gnavi span {
position: absolute;
width: 30px;
height: 4px;
background: #666;
border-radius: 10px;
-webkit-transition: all 400ms;
transition: all 400ms
}
header .btn-gnavi span:nth-child(1){
top: 0;
}
header .btn-gnavi span:nth-child(2){
top: 10px;
}
header .btn-gnavi span:nth-child(3){
top: 20px;
}
header .btn-gnavi.hb-open{
transform: rotate(180deg);
-webkit-transform:rotate(180deg);
}
header .btn-gnavi.hb-open span{
background: #fff;
}
header .btn-gnavi.hb-open span:nth-child(1){
width: 24px;
transform: translate(-7px,17px) rotate(45deg);
-webkit-transform: translate(-7px,17px) rotate(45deg);
}
header .btn-gnavi.hb-open span:nth-child(3){
width: 24px;
transform: translate(-7px,-17px) rotate(-45deg);
-webkit-transform: translate(-7px,-17px) rotate(-45deg);
}
}
最所から三本線が表示されているサイトも最近多いですが、今回はナビが5つ表示されていて、一定の表示幅になったら三本線になるサイトです。
navでレスポンシブになった時のナビの見せ方を整えます。right:-300pxにして消えているように見せます。
③ハンバーガーメニューをクリックしたら処理を行う
$(function(){
$('.btn-gnavi').on('click',function(){
var rightVal = 0;
if($(this).hasClass('hb-open')){
rightVal = -300;
$(this).removeClass('hb-open');
}else{
$(this).addClass('hb-open');
}
$('#global-navi').stop().animate({
right: rightVal
}, 200);
});
});
ハンバーガーメニュー、矢印アイコンをクリックした時に処理を実行させたいので、要素はクラス名「btn-gnavi」イベントは「click」を指定します。
これで「ハンバーガーメニュー、矢印アイコンをクリックしたら処理をおこなう」という動きは作成できました。
④メニューを表示する、非表示にする
メニューの表示・非表示を切り替えるには、CSSのrightプロパティを変更すれば実装できます。なので、clickイベントが発生した時のイベント処理にはrightプロパティの変更を行います。
また「メニューが表示されている時には矢印アイコンをクリックして非表示にする」「メニューが非表示の時はハンバーガーメニューをクリックして表示する」というメニューが表示されているかいないかという判断もしなければいけません。
そのために「hb_open」を作成してメニューに付与します。
・ハンバーガーメニューをクリックした時、メニューにクラス名「hb_open」が付与されていない場合は、CSSのrightプロパティを0に
・ハンバーガーメニューをクリックした時、メニューに「hb_open」が付与されている場合は。CSSのrightプロパティを-300に変更