ページコンテンツ
メニューリストを完全に分離したデモ
メニューリストを完全に分離したデモ
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="reset.css">
<link rel="stylesheet" href="style.css">
<title>ハンバーガーメニュー完全版</title>
</head>
<body>
<header>
<div class="hamburger-btn" id="hamburger-btn">
<span></span>
<span></span>
<span></span>
</div>
<div class="menu-overlay" id="menu-overlay"></div>
<nav class="menu-links" id="menu-links">
<a href="#">ホーム</a>
<a href="#">サービス</a>
<a href="#">コンタクト</a>
</nav>
</header>
<main>
<section class="content">
<h1>ページコンテンツ</h1>
<p>メニューリスト完全分離版デモ</p>
</section>
</main>
<footer></footer>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="index.js"></script>
</body>
</html>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: sans-serif;
overflow-x: hidden;
}
.hamburger-btn {
position: fixed;
top: 20px;
right: 20px;
width: 35px;
height: 30px;
cursor: pointer;
z-index: 1100;
}
.hamburger-btn span {
position: absolute;
left: 0;
width: 100%;
height: 3px;
background-color: #000;
transition: all 0.3s ease;
}
.hamburger-btn span:nth-child(1) { top: 0; }
.hamburger-btn span:nth-child(2) { top: 50%; transform: translateY(-50%); }
.hamburger-btn span:nth-child(3) { bottom: 0; }
.hamburger-btn.open span:nth-child(1) { transform: rotate(45deg); top: 50%; }
.hamburger-btn.open span:nth-child(2) { opacity: 0; }
.hamburger-btn.open span:nth-child(3) { transform: rotate(-45deg); top: 50%; }
.menu-overlay {
position: fixed;
top: 100%;
left: 0;
width: 100%;
height: 100%;
background-color: #fff;
z-index: 1000;
}
.menu-links {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 1001;
text-align: center;
opacity: 0;
pointer-events: none;
}
.menu-links a {
font-size: 24px;
margin: 15px 0;
display: block;
text-decoration: none;
color: #000;
}
.content {
height: 150vh;
background-color: #f0f0f0;
padding: 20px;
text-align: center;
}
const hamburgerBtn = document.getElementById('hamburger-btn');
const menuOverlay = document.getElementById('menu-overlay');
const menuLinks = document.getElementById('menu-links');
let isMenuOpen = false;
function openMenu() {
hamburgerBtn.classList.add('open');
gsap.fromTo(menuOverlay,
{ top: "100%" },
{ top: "0%", duration: 0.8, ease: "power3.out" }
);
gsap.to(menuLinks, {
opacity: 1,
duration: 0.6,
delay: 0.4,
ease: "power2.out",
pointerEvents: "auto"
});
isMenuOpen = true;
}
function closeMenu() {
hamburgerBtn.classList.remove('open');
gsap.fromTo(menuOverlay,
{ top: "0%" },
{
top: "-100%",
duration: 0.8,
ease: "power3.in",
onComplete: () => {
gsap.set(menuOverlay, { top: "100%" });
}
}
);
gsap.to(menuLinks, {
opacity: 0,
duration: 0.4,
ease: "power2.in",
pointerEvents: "none"
});
isMenuOpen = false;
}
hamburgerBtn.addEventListener('click', () => {
if (!isMenuOpen) {
openMenu();
} else {
closeMenu();
}
});