AstroとWordpressでJamstack その6 Layoutを作る Headerのメニュー(SP)
公開日時:2024-03-26T09:55:44.530Z
スマホのハンバーガーメニューも作ってしまいましょう。
前回作ったHeaderMenuLink.astroを再利用します。
assets/compornentsディレクトリにSpHamburger.astroとSpSlideMenu.astroを作成します。
---
---
<div class="hamburger flex justify-end p-4 md:hidden h-5 w-6 relative z-50">
<span class="line top h-1 inline-block w-6 transition-all absolute right-0 bg-black top-0"></span>
<span class="line middle h-1 inline-block w-6 transition-all absolute right-0 bg-black top-2"></span>
<span class="line bottom h-1 inline-block transition-all absolute right-0 bg-black top-4 w-6"></span>
</div>
SpHamburger.astroはハンバーガーメニューのガワです。
---
import HeaderMenuLink from "./HeaderMenuLink.astro";
---
<div id="slide-menu-bar" class="md:hidden h-full w-full fixed top-0 left-0 z-20 bg-gray-300 bg-opacity-50 transition duration-300 ease -translate-x-full">
<div class="slideMenuContainer h-full w-3/4 bg-white opacity-100 absolute left-0 flex flex-col justify-between p-8 pt-20 pb-20 text-slate-600 duration-1000">
<div><h4>Menuです</h4></div>
<div class="flex flex-col">
<HeaderMenuLink />
</div>
</div>
</div>
横からスライドするメニューにします。
//ハンバーガーメニューを複数(上下)に付けたい場合もあるのでこのようにしてます。
//class hamburgerを全部取得
const Humburger = document.querySelectorAll('.hamburger');
//取得したDOM全てにイベントリスナーを設定
Humburger.forEach(function (e){
e.addEventListener('click',() =>{
//console.log('click!');
e.classList.toggle('open');
if(e.classList.contains('open')){
//開くときの処理
//console.log('open');
document.querySelectorAll('.hamburger .top').forEach(function(e){
e.classList.add('transform','rotate-45','top-2','w-7','transition','duration-300');
e.classList.remove('top-0','w-6');
});
document.querySelectorAll('.hamburger .middle').forEach(function(e){
e.classList.add('hidden');
})
document.querySelectorAll('.hamburger .bottom').forEach(function(e){
e.classList.add('transform','-rotate-45','top-2','w-7','transition','duration-300');
e.classList.remove('top-4','w-6');
})
document.getElementById('slide-menu-bar').classList.add('block','translate-x-0');
document.getElementById('slide-menu-bar').classList.remove('-translate-x-full');
}else{
//console.log('close');
document.querySelectorAll('.hamburger .top').forEach(function(e){
e.classList.remove('transform','rotate-45','top-2','transition','duration-300','top-2','w-7');
e.classList.add('top-0','w-6');
})
document.querySelectorAll('.hamburger .middle').forEach(function(e){
e.classList.remove('hidden');
})
document.querySelectorAll('.hamburger .bottom').forEach(function(e){
e.classList.remove('transform','-rotate-45','top-2','w-7','transition','duration-300');
e.classList.add('top-4','w-6');
})
document.getElementById('slide-menu-bar').classList.remove('block','translate-x-0');
document.getElementById('slide-menu-bar').classList.add('-translate-x-full');
}
})
});
最後にLayout.astroで読み込んでおきましょう。
---
//Layoutの雛形
import BaseHead from "../compornents/BaseHead.astro";
import Header from "../compornents/Header.astro";
import Footer from "../compornents/Footer.astro";
import {SITE_TITLE} from '../consts';
const { title, description, pubDate, updatedDate, image } = Astro.props;
---
<html lang="ja">
<head >
<BaseHead title={title +' | '+ SITE_TITLE} description={description} image={image} pubDate={pubDate} updateDate={updatedDate} />
</head>
<body>
<Header />
<main class="lg:max-w-7xl md:max-w-5xl m-auto">
<slot/>
</main>
<Footer />
</body>
</html>
<style>
</style>
<script >
//PC Header Menu の SubMenu開閉用//
import '../js/pcTopMenu.js';
import '../js/hamburgerMenu.js';
</script>
AstroPress