Now.js Framework Documentation

Now.js Framework Documentation

MenuManager

TH 15 Dec 2025 08:52

MenuManager

ภาพรวม

MenuManager คือระบบจัดการ navigation menus ใน Now.js Framework รองรับ responsive menus, submenus และ touch devices

ใช้เมื่อ:

  • ต้องการ navigation menu
  • ต้องการ responsive hamburger menu
  • ต้องการ dropdown submenus
  • ต้องการ active state tracking

ทำไมต้องใช้:

  • ✅ Responsive (mobile/desktop)
  • ✅ Dropdown submenus
  • ✅ Touch gesture support
  • ✅ Keyboard navigation
  • ✅ ARIA accessibility
  • ✅ Auto-active state

การใช้งานพื้นฐาน

HTML Structure

<nav data-component="menu">
  <button class="menu-toggle">☰</button>
  <ul class="menu">
    <li><a href="/">Home</a></li>
    <li>
      <a href="/products">Products</a>
      <ul>
        <li><a href="/products/new">New</a></li>
        <li><a href="/products/sale">Sale</a></li>
      </ul>
    </li>
    <li><a href="/about">About</a></li>
    <li><a href="/contact">Contact</a></li>
  </ul>
</nav>

Initialization

await MenuManager.init({
  breakpoint: 768,
  animationDuration: 200
});

การตั้งค่า

MenuManager.init({
  // Mobile breakpoint (px)
  breakpoint: 768,

  // Animation duration (ms)
  animationDuration: 100,

  // Touch swipe threshold (px)
  touchThreshold: 100,

  // Accessibility
  accessibility: {
    enabled: true,
    announceChanges: true,
    smoothFocus: true
  },

  // Hover delays
  hover: {
    openDelay: 100,
    closeDelay: 300
  }
});

Data Attributes

Attribute Description
data-component="menu" Initialize menu
data-source API source for menu items
data-menu-toggle Toggle button
data-expanded Expanded state

API อ้างอิง

สร้าง menu instance

Parameter Type Description
element HTMLElement Menu container

Returns: string - Menu ID

เปิด mobile menu

ปิด mobile menu

Toggle mobile menu

เปิด submenu

ปิด submenu

ปิด submenus ทั้งหมด

อัพเดท active state ตาม path

// After route change
MenuManager.updateActiveMenu('/products/new');

รับ menu instance

ตรวจสอบ menu exists

Keyboard Navigation

Key Action
/ Next item
/ Previous item
Enter / Space Activate/toggle
Escape Close submenu
Tab Navigate focus

การจัดรูปแบบ CSS

/* Menu container */
[data-component="menu"] {
  position: relative;
}

/* Menu list */
.menu {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
}

.menu > li {
  position: relative;
}

.menu a {
  display: block;
  padding: 12px 16px;
  color: inherit;
  text-decoration: none;
}

.menu a:hover {
  background: rgba(0,0,0,0.05);
}

/* Active state */
.menu a.active {
  color: #3b82f6;
  font-weight: 500;
}

/* Submenu */
.menu ul {
  position: absolute;
  top: 100%;
  left: 0;
  min-width: 200px;
  background: white;
  box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  opacity: 0;
  visibility: hidden;
  transition: all 0.2s;
}

.menu li:hover > ul {
  opacity: 1;
  visibility: visible;
}

/* Mobile toggle */
.menu-toggle {
  display: none;
}

/* Mobile responsive */
@media (max-width: 768px) {
  .menu-toggle {
    display: block;
  }

  .menu {
    position: fixed;
    top: 0;
    left: -280px;
    width: 280px;
    height: 100vh;
    flex-direction: column;
    background: white;
    transition: left 0.3s;
  }

  .menu.open {
    left: 0;
  }

  .menu ul {
    position: static;
    box-shadow: none;
  }
}

ตัวอย่างการใช้งานจริง

<header>
  <nav data-component="menu">
    <a href="/" class="logo">Logo</a>

    <button class="menu-toggle" aria-label="Menu">
      <span></span>
      <span></span>
      <span></span>
    </button>

    <ul class="menu">
      <li><a href="/">Home</a></li>
      <li>
        <button aria-expanded="false">Products ▼</button>
        <ul>
          <li><a href="/products/software">Software</a></li>
          <li><a href="/products/hardware">Hardware</a></li>
          <li><a href="/products/services">Services</a></li>
        </ul>
      </li>
      <li><a href="/pricing">Pricing</a></li>
      <li><a href="/contact">Contact</a></li>
    </ul>
  </nav>
</header>

Data-Driven Menu

<nav data-component="menu" data-source="api.menus">
  <!-- Menu will be rendered from API data -->
</nav>

<script>
// API response structure
const menus = [
  { label: 'Home', href: '/' },
  {
    label: 'Products',
    children: [
      { label: 'New', href: '/products/new' },
      { label: 'Sale', href: '/products/sale' }
    ]
  }
];
</script>
<aside data-component="menu" class="sidebar-menu">
  <ul class="menu vertical">
    <li><a href="/dashboard">Dashboard</a></li>
    <li>
      <button>Settings</button>
      <ul>
        <li><a href="/settings/profile">Profile</a></li>
        <li><a href="/settings/security">Security</a></li>
      </ul>
    </li>
    <li><a href="/logout">Logout</a></li>
  </ul>
</aside>

ข้อควรระวัง

⚠️ 1. Submenu ต้องอยู่ใน li

<!-- ❌ Submenu อยู่ผิดที่ -->
<ul class="menu">
  <a href="#">Products</a>
  <ul>...</ul>
</ul>

<!-- ✅ Submenu ใน li -->
<ul class="menu">
  <li>
    <a href="#">Products</a>
    <ul>...</ul>
  </li>
</ul>

⚠️ 2. ARIA สำหรับ Accessibility

<!-- ❌ ไม่มี ARIA -->
<button>Menu</button>

<!-- ✅ มี ARIA -->
<button aria-expanded="false" aria-controls="main-menu">
  Menu
</button>

เอกสารที่เกี่ยวข้อง