定番のハンバーガーメニューに少し機能性を付与したコード
画像のような典型的なハンバーガーメニューのコードを備忘録としてメモ。
HTML
<header>
<div class="headerInner">
<div class="headerLogo">
<figure class="logo">
<a href="#">
<img src="img/logo_01.png" alt="">
</a>
</figure>
</div>
<nav class="headerNav">
<ul class="navList">
<li><a href="#">ホーム</a></li>
<li><a href="#">会社案内</a></li>
<li><a href="#">お知らせ</a></li>
</ul>
<div class="btnBox">
<a href="#" class="btn -type1" target="_blank">お問い合わせ</a>
</div>
<div class="sp">
<div class="overlay" id="js-overlay"></div>
<div class="hamburger"><span></span><span></span><span></span></div>
</div>
</nav>
</div>
</header>
header内に記述。
ハンバーガーメニューの3本線はモバイルだけで表示させるためにclass名「sp」を付与してPCでは非表示にしている。
3本線だからspanも3つ用意。
<div class="overlay" id="js-overlay"></div>
これはハンバーガーメニュー開時にwidthが100%じゃないときに、ハンバーガーメニューの領域以外の箇所をクリックしてもtoggleが動くようにするために、ハンバーガーメニューの領域以外の領域を作る。
</footer>
<!--jQuery-->
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk="
crossorigin="anonymous"></script>
<!--Scripts-->
<script src="js/script.js"></script>
</body>
</html>
閉じbodyタグ直前にjQueryのCDNとscript.jsを読み込ませる。
SCSS
@use '../global'as g;
@include g.sp {
.hamburger {
position: relative;
/*ボタン内側の基点となるためrelativeを指定*/
cursor: pointer;
width: 3.125rem;
height: 3.125rem;
border-radius: 5px;
z-index: 1000;
}
/*ボタン内側*/
.hamburger span {
display: inline-block;
transition: all .4s;
/*アニメーションの設定*/
position: absolute;
left: 14px;
height: 2px;
border-radius: 2px;
background: #000000;
width: 50%;
}
.hamburger span:nth-of-type(1) {
top: 0.9375rem;
}
.hamburger span:nth-of-type(2) {
top: 1.4375rem;
}
.hamburger span:nth-of-type(3) {
top: 1.9375rem;
}
/*activeクラスが付与されると線が回転して×に*/
.active .hamburger {
span:nth-of-type(1) {
top: 1.125rem;
left: 1.125rem;
transform: translateY(0.375rem) rotate(-45deg);
width: 40%;
height: 1.7px;
}
span:nth-of-type(2) {
opacity: 0;
/*真ん中の線は透過*/
}
span:nth-of-type(3) {
top: 1.875rem;
left: 1.125rem;
transform: translateY(-0.375rem) rotate(45deg);
width: 40%;
height: 1.7px;
}
}
.overlay {
background-color: rgb(195, 194, 194, 0.5);
cursor: pointer;
height: 100vh;
width: 100vw;
position: fixed;
top: 0;
left: 0;
opacity: 0;
visibility: hidden;
transition: all 0.6s;
z-index: 100;
}
.active .overlay {
opacity: 0.8;
visibility: visible;
}
.navList {
background: #fff;
width: 100%;
height: 100%;
position: fixed;
top: 0;
right: -100%;
z-index: 999;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
transition: ease-in-out 0.6s;
li {
position: relative;
&::before {
content: '';
background-color: #B31D2D;
width: 0.3125rem;
height: 0.3125rem;
border-radius: 50%;
position: absolute;
top: 0.8125rem;
left: -0.625rem;
}
}
}
.active .navList {
right: 0;
}
}
ハンバーガーメニュー3本線、ハンバーガーメニュー開時、ハンバーガーメニュー領域外(overlay)のCSS。
jQuery
//Humburger Menu
$(function () {
$('.hamburger').on('click', function () {
$('body').toggleClass('active');
$(".navList a").on("click", function () {
$("body").removeClass('active');
});
if ($('body').hasClass('active')) {
$('.overlay').on('click', function () {
$('body').removeClass('active');
});
};
});
});
- ハンバーガーメニューをクリックすると「body」に「active」というクラスをtoggleで付与。
- ハンバーガーメニューのリンクをクリックすると「body」から「active」を除去。これを記述することにより、アンカーリンクをクリックしてもハンバーガーメニューが閉じる。記述しないと、アンカーリンクにページ内移動しているのにハンバーガーメニューが閉じない。
- ハンバーガーメニュー開時の領域外をクリックすると、「body」から「active」が取り除かれ、ハンバーガーメニューが閉じるようになる。