สร้าง Full-Screen Overlay Navigation ที่ครอบคลุมทั้งหน้าจอ (100% Width & Height) เมื่อเปิดใช้งาน
โค้ดตัวอย่างสมบูรณ์
<!DOCTYPE html>
<html lang="th">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Full-Screen Overlay Navigation</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
font-family: 'Segoe UI', Tahoma, sans-serif;
}
/* Full-Screen Overlay Nav */
.overlay-nav {
height: 100vh;
width: 0;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
background-color: rgba(46, 218, 195, 0.95); /* Semi-transparent */
overflow-x: hidden;
overflow-y: auto;
padding-top: 100px;
transition: width 0.5s ease;
display: flex;
flex-direction: column;
align-items: center;
justify-content: flex-start;
}
.overlay-nav a {
display: block;
padding: 16px 32px;
text-decoration: none;
font-size: 28px;
font-weight: 500;
color: #000;
text-align: center;
transition: color 0.3s, transform 0.3s;
width: 100%;
}
.overlay-nav a:hover {
color: #f1f1f1;
transform: scale(1.05);
}
/* ปุ่มปิด */
.overlay-nav .closebtn {
position: absolute;
top: 24px;
right: 40px;
font-size: 48px;
font-weight: bold;
color: #000;
text-decoration: none;
line-height: 1;
width: auto;
padding: 0;
transition: color 0.3s, transform 0.3s;
}
.overlay-nav .closebtn:hover {
color: #ff0000;
transform: rotate(90deg);
}
/* ปุ่มเปิดเมนู */
.openbtn {
padding: 16px 32px;
background-color: #001b91;
color: white;
font-size: 20px;
font-weight: 600;
border: none;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
box-shadow: 0 4px 12px rgba(0,27,145,0.3);
}
.openbtn:hover {
background-color: #00146b;
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(0,27,145,0.4);
}
.content {
padding: 60px 24px;
text-align: center;
min-height: 100vh;
}
</style>
</head>
<body>
<!-- Full-Screen Overlay Navigation -->
<nav class="overlay-nav" id="overlayNav" role="dialog" aria-modal="true" aria-label="Main Navigation">
<a href="#" class="closebtn" aria-label="Close Navigation">×</a>
<a href="#">เข้าสู่ระบบ</a>
<a href="#">สมัครสมาชิก</a>
<a href="#">หน้าแรก</a>
<a href="#">เกี่ยวกับเรา</a>
</nav>
<div class="content">
<button class="openbtn" id="openBtn">☰ เปิดเมนูเต็มหน้าจอ</button>
<h1>Full-Screen Overlay Navigation</h1>
<p>กดปุ่มด้านบนเพื่อเปิดเมนูครอบคลุมทั้งหน้าจอ</p>
</div>
<script>
const overlayNav = document.getElementById('overlayNav');
const openBtn = document.getElementById('openBtn');
const closeBtn = overlayNav.querySelector('.closebtn');
function showNav() {
overlayNav.style.width = '100%';
document.body.style.overflow = 'hidden';
// Focus Management - Focus ปุ่มปิดเมื่อเปิด
setTimeout(() => closeBtn.focus(), 100);
}
function hideNav() {
overlayNav.style.width = '0';
document.body.style.overflow = '';
// Return Focus - กลับไปที่ปุ่มเปิด
openBtn.focus();
}
// Event Listeners
openBtn.addEventListener('click', showNav);
closeBtn.addEventListener('click', hideNav);
// ปิดด้วย Escape Key
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape' && overlayNav.style.width === '100%') {
hideNav();
}
});
// ปิดเมื่อคลิกลิงก์ (Optional)
overlayNav.querySelectorAll('a:not(.closebtn)').forEach(link => {
link.addEventListener('click', hideNav);
});
// Focus Trap (Simple) - จำกัด Tab ให้อยู่ใน Nav
overlayNav.addEventListener('keydown', (e) => {
if (e.key === 'Tab' && overlayNav.style.width === '100%') {
const focusableElements = overlayNav.querySelectorAll(
'a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"])'
);
const firstEl = focusableElements[0];
const lastEl = focusableElements[focusableElements.length - 1];
if (e.shiftKey && document.activeElement === firstEl) {
e.preventDefault();
lastEl.focus();
} else if (!e.shiftKey && document.activeElement === lastEl) {
e.preventDefault();
firstEl.focus();
}
}
});
</script>
</body>
</html>
หลักการทำงาน
- CSS: Nav เริ่มต้น
width: 0,transition: width 0.5s,height: 100vh - JavaScript: Toggle
width: 100%↔width: 0 - Body Overflow:
overflow: hiddenป้องกัน Scroll หน้าหลักขณะเปิดเมนู - Focus Management: Focus ปุ่มปิดเมื่อเปิด, กลับไปปุ่มเปิดเมื่อปิด
ความแตกต่างจาก Off-Canvas (บทความก่อนหน้า)
| คุณสมบัติ | Off-Canvas (Side Nav) | Full-Screen Overlay |
|---|---|---|
| ความกว้าง | ประมาณ 280-320px | 100% Viewport Width |
| เนื้อหาหลัก | ผลักไปข้างๆ (Push) | ถูกบังทั้งหมด (Overlay) |
| Layout | Vertical List | Centered, Large Typography |
| เหมาะสำหรับ | App-like, Dashboard, Mobile | Landing Page, Portfolio, Simple Sites |
ปรับปรุงประสิทธิภาพ: ใช้ Transform แทน Width
/* CSS - ดีกว่าสำหรับ Animation Performance */
.overlay-nav {
/* width: 0; → ใช้ Transform */
transform: translateX(-100%);
transition: transform 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94);
/* ...other styles... */
}
.overlay-nav.open {
transform: translateX(0);
}
/* JS */
function showNav() {
overlayNav.classList.add('open');
document.body.style.overflow = 'hidden';
}
function hideNav() {
overlayNav.classList.remove('open');
document.body.style.overflow = '';
}
Accessibility Checklist
- ✅
role="dialog"+aria-modal="true"บน Nav - ✅
aria-labelบนปุ่มเปิด/ปิด - ✅ Focus Management (Open → Close btn, Close → Open btn)
- ✅ Focus Trap (Tab Loop ภายใน Nav)
- ✅ Escape Key ปิดเมนู
- ✅ Semantic HTML (
<nav>,<button>)