ক্লিক করলে খুলে/বন্ধ হওয়া ড্রপডাউন মেনু
হোভার (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` যথেষ্ট উঁচু রাখুন যাতে অন্য কন্টেন্টের নিচে না যায়।
- মোবাইলে টাচ ইভেন্টও কাজ করে (ক্লিক ইভেন্ট টাচকে কভার করে)।