কম্পিউটার টিউটোরিয়াল

CSS এবং জাভাস্ক্রিপ্ট দিয়ে ক্লিকেবল ড্রপডাউন মেনু কীভাবে তৈরি করবেন?

ক্লিক করলে খুলে/বন্ধ হওয়া ড্রপডাউন মেনু

হোভার (hover) বদলে **ক্লিক** করলে ড্রপডাউন খোলা/বন্ধ করা মোবাইল-ফ্রেন্ডলি এবং আরও নিয়ন্ত্রণযোগ্য। নিচে একটি স্মার্ট, রিয়ুজেবল ড্রপডাউন কম্পোনেন্টের উদাহরণ দেওয়া হলো।

পূর্ণ কোড উদাহরণ

<!DOCTYPE html>
<html lang="bn">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>ক্লিকেবল ড্রপডাউন মেনু</title>
  <style>
    * { box-sizing: border-box; }
    body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; padding: 20px; }
    
    /* ড্রপডাউন কন্টেইনার */
    .dropdown {
      position: relative;
      display: inline-block;
      width: 220px;
    }
    
    /* ট্রিগার বাটন */
    .dropdown-btn {
      width: 100%;
      background-color: #7e32d4;
      color: white;
      padding: 14px 16px;
      font-size: 16px;
      font-weight: 600;
      font-family: inherit;
      border: none;
      border-radius: 6px;
      cursor: pointer;
      text-align: left;
      display: flex;
      justify-content: space-between;
      align-items: center;
      transition: background 0.3s;
    }
    .dropdown-btn:hover { background-color: #6a2abf; }
    .dropdown-btn:focus { outline: 2px solid #5a1a9e; outline-offset: 2px; }
    
    /* তীর আইকন */
    .dropdown-btn::after {
      content: '▼';
      font-size: 10px;
      transition: transform 0.2s;
    }
    .dropdown.open .dropdown-btn::after {
      transform: rotate(180deg);
    }
    
    /* ড্রপডাউন কন্টেন্ট (ডিফল্ট লুকানো) */
    .dropdown-content {
      position: absolute;
      top: 100%;
      left: 0;
      right: 0;
      background-color: #017575;
      min-width: 160px;
      border-radius: 0 0 6px 6px;
      box-shadow: 0 8px 16px rgba(0,0,0,0.2);
      z-index: 100;
      display: none; /* JS-এ ক্লাস দিয়ে show করব */
      overflow: hidden;
    }
    
    /* মেনু আইটেম */
    .dropdown-item {
      display: block;
      padding: 12px 16px;
      color: white;
      text-decoration: none;
      font-size: 15px;
      font-weight: 500;
      border-bottom: 1px solid rgba(255,255,255,0.1);
      transition: background 0.2s;
    }
    .dropdown-item:last-child { border-bottom: none; }
    .dropdown-item:hover,
    .dropdown-item:focus {
      background-color: #086b2e;
      outline: none;
    }
    
    /* ওপেন অবস্থা */
    .dropdown.open .dropdown-content { display: block; }
    
    /* অ্যানিমেশন (অপশনাল) */
    @keyframes fadeIn { from {opacity: 0; transform: translateY(-8px);} to {opacity: 1; transform: translateY(0);} }
    .dropdown.open .dropdown-content { animation: fadeIn 0.2s ease; }
  </style>
</head>
<body>
  <h2>নিচের ড্রপডাউন বাটনে ক্লিক করুন</h2>
  
  <div class="dropdown" id="myDropdown">
    <button class="dropdown-btn" aria-haspopup="true" aria-expanded="false">
      মেনু খুলুন
    </button>
    <div class="dropdown-content" role="menu">
      <a class="dropdown-item" href="#" role="menuitem">যোগাযোগ করুন</a>
      <a class="dropdown-item" href="#" role="menuitem">ভিজিট করুন</a>
      <a class="dropdown-item" href="#" role="menuitem">আমাদের সম্পর্কে</a>
    </div>
  </div>
  
  <script>
    const dropdown = document.getElementById('myDropdown');
    const btn = dropdown.querySelector('.dropdown-btn');
    const content = dropdown.querySelector('.dropdown-content');
    
    // বাটন ক্লিক টগল
    btn.addEventListener('click', (e) => {
      e.stopPropagation();
      const isOpen = dropdown.classList.toggle('open');
      btn.setAttribute('aria-expanded', isOpen);
    });
    
    // বাইরে ক্লিক করলে বন্ধ
    document.addEventListener('click', (e) => {
      if (!dropdown.contains(e.target)) {
        dropdown.classList.remove('open');
        btn.setAttribute('aria-expanded', 'false');
      }
    });
    
    // ESC কী দিয়ে বন্ধ
    document.addEventListener('keydown', (e) => {
      if (e.key === 'Escape' && dropdown.classList.contains('open')) {
        dropdown.classList.remove('open');
        btn.setAttribute('aria-expanded', 'false');
        btn.focus();
      }
    });
    
    // কীবোর্ড নেভিগেশন (Tab/Arrow keys) - অপশনাল
    content.addEventListener('keydown', (e) => {
      const items = [...content.querySelectorAll('.dropdown-item')];
      const currentIndex = items.findIndex(item => item === document.activeElement);
      
      if (e.key === 'ArrowDown' && currentIndex < items.length - 1) {
        e.preventDefault();
        items[currentIndex + 1].focus();
      } else if (e.key === 'ArrowUp' && currentIndex > 0) {
        e.preventDefault();
        items[currentIndex - 1].focus();
      } else if (e.key === 'Home') {
        e.preventDefault();
        items[0].focus();
      } else if (e.key === 'End') {
        e.preventDefault();
        items[items.length - 1].focus();
      }
    });
  </script>
</body>
</html>

মূল ফিচারসমূহ

  • ক্লিক টগল: বাটন ক্লিক করলে খুলে/বন্ধ।
  • বাইরে ক্লিক → বন্ধ: ডকুমেন্টে যেকোনো জায়গা ক্লিক করলে মেনু বন্ধ হয়।
  • ESC কী → বন্ধ: কীবোর্ড ব্যবহারকারীর জন্য।
  • ARIA অ্যাট্রিবিউট: `aria-haspopup`, `aria-expanded`, `role="menu"` — স্ক্রিন রিডার সাপোর্ট।
  • কীবোর্ড নেভিগেশন: Arrow Up/Down, Home, End কী দিয়ে আইটেম নেভিগেট।
  • ফোকাস স্টাইল: `:focus` স্টেইল দিয়ে কীবোর্ড ইউজারের জন্য ভিজিবিলিটি।
  • অ্যানিমেশন: ফেড-ইন ইফেক্ট।

বহু ড্রপডাউন হ্যান্ডলিং

এক পেজে একাধিক ড্রপডাউন থাকলে সব গুলো বন্ধ করার জন্য কমন ফাংশন ব্যবহার করুন:

function closeAllDropdowns(except = null) {
  document.querySelectorAll('.dropdown.open').forEach(dd => {
    if (dd !== except) {
      dd.classList.remove('open');
      dd.querySelector('.dropdown-btn')?.setAttribute('aria-expanded', 'false');
    }
  });
}

// প্রতিটি বাটনে:
btn.addEventListener('click', (e) => {
  e.stopPropagation();
  closeAllDropdowns(dropdown); // অন্যগুলো বন্ধ, এইটা টগল
  dropdown.classList.toggle('open');
  // ...
});

সামान्य ভুল এড়ান

  • `display: none` ↔ `display: block` এর পরিবর্তে `visibility`/`opacity` + `pointer-events` ব্যবহার করলে অ্যানিমেশন স্মুথ হয় (তবে স্ট্রাকচার সিম্পল রাখতে `display` ও কাজ করে)।
  • `z-index` যথেষ্ট উঁচু রাখুন যাতে অন্য কন্টেন্টের নিচে না যায়।
  • মোবাইলে টাচ ইভেন্টও কাজ করে (ক্লিক ইভেন্ট টাচকে কভার করে)।
  1. সিএসএস এবং জাভাস্ক্রিপ্ট দিয়ে কোল্যাপসিবল সেকশন তৈরি করা

  2. সিএসএস এবং জাভাস্ক্রিপ্ট দিয়ে স্ন্যাকবার/টোস্ট তৈরি করা

  3. CSS এবং JavaScript দিয়ে অ্যাকর্ডিয়ন (Accordion) তৈরি করা

  4. CSS দিয়ে হোভারেবল ড্রপডাউন মেনু তৈরি