हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना
कीबोर्ड नेविगेशन और ARIA एट्रिब्यूट वाले सुसज्जित ड्रॉपडाउन बनाने के लिए Headless UI के Menu कंपोनेंट पर Tailwind यूटिलिटी क्लास लागू करें।
हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना, CoddyKit पर Tailwind CSS Academy का एक निःशुल्क पाठ है। यह 4 में से 2वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Tailwind CSS Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
हेडलेस यूआई Menu की संरचना
हेडलेस यूआई का Menu चार हिस्सों से बना है: Menu (संदर्भ उपलब्ध कराने वाला मूल रैपर), Menu.Button (क्लिक किया जाने वाला ट्रिगर), Menu.Items (खुलने पर दिखाई देने वाला ड्रॉपडाउन पैनल) और एक या अधिक Menu.Item घटक (अलग-अलग चयन योग्य विकल्प)। प्रत्येक हिस्सा className या ऐसी रेंडर फ़ंक्शन स्वीकार करता है जिसे स्थिति मिलती है, जिससे आपको हर स्तर पर Tailwind का पूरा नियंत्रण मिलता है।
import { Menu } from '@headlessui/react';
// Structure overview
<Menu as='div' className='relative inline-block'>
{/* 1. Trigger button */}
<Menu.Button>Open</Menu.Button>
{/* 2. Dropdown panel (shown when open) */}
<Menu.Items>
{/* 3. Individual options */}
<Menu.Item>{({ active }) => <button>Option A</button>}</Menu.Item>
<Menu.Item>{({ active }) => <button>Option B</button>}</Menu.Item>
</Menu.Items>
</Menu>Menu ट्रिगर बटन की स्टाइलिंग
Menu.Button ट्रिगर को अपनी इंटरैक्टिव प्रकृति बतानी चाहिए और खुली या बंद स्थिति को दृश्य रूप से दिखाना चाहिए। ड्रॉपडाउन दिखाई देने पर बटन का रूप बदलने के लिए open रेंडर प्रॉप का उपयोग कीजिए। सामान्य तरीकों में शेवरॉन आइकन को घुमाना, खुले ड्रॉपडाउन से मेल खाने के लिए पृष्ठभूमि का रंग बदलना और फ़ोकस को स्पष्ट दिखाने के लिए रिंग जोड़ना शामिल हैं।
import { Menu } from '@headlessui/react';
import { ChevronDownIcon } from '@heroicons/react/20/solid';
<Menu.Button className='inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500'>
{({ open }) => (
<>
Actions
<ChevronDownIcon
className={cn(
'h-4 w-4 text-gray-400 transition-transform duration-150',
open && 'rotate-180'
)}
/>
</>
)}
</Menu.Button>ड्रॉपडाउन पैनल की स्थिति तय करना
Menu.Items पैनल दृश्य रूप से ट्रिगर के ठीक नीचे जुड़ा हुआ दिखना चाहिए। Menu मूल घटक को relative और पैनल को absolute पर सेट कीजिए। पैनल को ट्रिगर के साथ संरेखित करने के लिए top-full और right-0 या left-0 का उपयोग कीजिए। ड्रॉपडाउन को पेज की अन्य सामग्री के ऊपर दिखाने के लिए z-index सेट कीजिए और ट्रिगर तथा पैनल के बीच थोड़ा अंतर रखने के लिए mt-1 जोड़िए।
<Menu as='div' className='relative'>
<Menu.Button>...</Menu.Button>
<Menu.Items
className='
absolute right-0 top-full mt-1 z-20
w-56 origin-top-right
rounded-xl bg-white shadow-lg
ring-1 ring-black/5
focus:outline-none
'
>
{/* Items */}
</Menu.Items>
</Menu>सक्रिय स्थिति के साथ Menu आइटम की स्टाइलिंग
प्रत्येक Menu.Item को एक active रेंडर प्रॉप मिलता है, जो आइटम पर फ़ोकस होने या माउस ले जाने पर true होता है। हाइलाइट की गई पृष्ठभूमि — आम तौर पर हल्की नीली या धूसर — लगाने के लिए इसका उपयोग कीजिए। अनुपलब्ध विकल्पों को धुंधला दिखाने और उन पर इंटरैक्शन रोकने के लिए disabled का भी उपयोग कीजिए। सामग्री को button या a तत्व में लपेटिए, ताकि उस पर कीबोर्ड से फ़ोकस किया जा सके।
<Menu.Items className='absolute right-0 mt-1 w-56 rounded-xl bg-white shadow-lg ring-1 ring-black/5 p-1'>
<Menu.Item>
{({ active }) => (
<button
className={cn(
'flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm',
active ? 'bg-blue-50 text-blue-700' : 'text-gray-700'
)}
>
<PencilIcon className='h-4 w-4' />
Edit
</button>
)}
</Menu.Item>
<Menu.Item disabled>
{({ active, disabled }) => (
<button
className={cn(
'flex w-full items-center gap-2 rounded-lg px-3 py-2 text-sm',
disabled && 'opacity-40 cursor-not-allowed'
)}
>
<ShareIcon className='h-4 w-4' />
Share (unavailable)
</button>
)}
</Menu.Item>
</Menu.Items>समूहों के बीच विभाजक जोड़ना
संबंधित Menu आइटम को दृश्य विभाजकों से समूहित कीजिए। चूँकि हेडलेस यूआई कोई विभाजक घटक नहीं देता, इसलिए बॉर्डर वाले साधारण div या पैडिंग रैपर को सीधे जोड़ दीजिए। आइटम को तार्किक खंडों — प्राथमिक कार्रवाइयों, द्वितीयक कार्रवाइयों और विनाशकारी कार्रवाई — में व्यवस्थित कीजिए और उन्हें Tailwind से स्टाइल की गई पतली क्षैतिज रेखाओं से अलग कीजिए।
<Menu.Items className='absolute right-0 mt-1 w-56 rounded-xl bg-white shadow-lg ring-1 ring-black/5 p-1 focus:outline-none'>
{/* Primary actions */}
<div className='pb-1 border-b border-gray-100'>
<Menu.Item>{({ active }) => <button className={itemCls(active)}>View</button>}</Menu.Item>
<Menu.Item>{({ active }) => <button className={itemCls(active)}>Edit</button>}</Menu.Item>
</div>
{/* Secondary actions */}
<div className='py-1 border-b border-gray-100'>
<Menu.Item>{({ active }) => <button className={itemCls(active)}>Duplicate</button>}</Menu.Item>
</div>
{/* Destructive action */}
<div className='pt-1'>
<Menu.Item>
{({ active }) => (
<button className={cn('flex w-full px-3 py-2 text-sm rounded-lg', active ? 'bg-red-50 text-red-700' : 'text-red-600')}>
Delete
</button>
)}
</Menu.Item>
</div>
</Menu.Items>आइकन सज्जा वाला ड्रॉपडाउन
सुघड़ ड्रॉपडाउन में उपयोगकर्ताओं को विकल्पों की तुरंत पहचान कराने के लिए प्रत्येक लेबल के साथ आइकन होते हैं। @heroicons/react जैसी लाइब्रेरी से आइकन आयात कीजिए (इसे उसी Tailwind Labs टीम ने बनाया है) और उन्हें Menu आइटम बटन के भीतर इनलाइन तत्वों के रूप में रखिए। आइकन का आकार एकसमान रखिए — छोटे Menu के लिए h-4 w-4 — और ऐसे हल्के रंग चुनिए जो आइटम की सक्रिय स्थिति से विरासत में मिलें।
import {
PencilSquareIcon,
DocumentDuplicateIcon,
TrashIcon
} from '@heroicons/react/20/solid';
const menuItems = [
{ label: 'Edit', icon: PencilSquareIcon, action: handleEdit },
{ label: 'Duplicate', icon: DocumentDuplicateIcon, action: handleDuplicate }
];
menuItems.map(({ label, icon: Icon, action }) => (
<Menu.Item key={label}>
{({ active }) => (
<button
onClick={action}
className={cn(
'flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm',
active ? 'bg-blue-50 text-blue-700' : 'text-gray-700'
)}
>
<Icon className='h-4 w-4 flex-shrink-0' />
{label}
</button>
)}
</Menu.Item>
))हेडलेस Menu में कीबोर्ड नेविगेशन
हेडलेस यूआई का Menu पूरा कीबोर्ड समर्थन अपने-आप लागू करता है। बटन पर Enter या Space दबाने से Menu खुलता है। ऐरो कुंजियाँ आइटम के बीच ले जाती हैं। Home और End पहले और आखिरी आइटम पर ले जाते हैं। Escape Menu बंद करके फ़ोकस को ट्रिगर पर वापस ले जाता है। Tab Menu बंद कर देता है। ये व्यवहार ARIA मेनू बटन पैटर्न का पालन करते हैं और आपके किसी अतिरिक्त कोड के बिना काम करते हैं।
/*
Keyboard behavior (automatic with Headless UI):
Trigger button:
- Enter / Space → opens menu, focuses first item
- ArrowDown → opens menu, focuses first item
- ArrowUp → opens menu, focuses last item
Inside menu:
- ArrowDown → next item
- ArrowUp → previous item
- Home → first item
- End → last item
- Enter / Space → activates focused item
- Escape → closes menu, returns focus to trigger
- Tab → closes menu
- Type a character → jump to first matching item
*/संदर्भ मेनू पैटर्न
संदर्भ मेनू (राइट-क्लिक मेनू) में वही Menu संरचना उपयोग होती है, लेकिन पैनल की स्थिति ट्रिगर बटन के बजाय कर्सर के सापेक्ष तय होती है। राइट-क्लिक इवेंट कैप्चर कीजिए, कर्सर की स्थिति सहेजिए और उन निर्देशांकों पर स्थिर स्थिति का उपयोग करके Menu.Items रेंडर कीजिए। स्थित Menu के भीतर फ़ोकस प्रबंधन और कीबोर्ड नेविगेशन हेडलेस यूआई ही संभालता है।
function ContextMenuWrapper({ children }) {
const [position, setPosition] = useState(null);
const handleContextMenu = (e) => {
e.preventDefault();
setPosition({ x: e.clientX, y: e.clientY });
};
return (
<div onContextMenu={handleContextMenu}>
{children}
{position && (
<Menu>
<Menu.Items
static // keep open without button
style={{ top: position.y, left: position.x }}
className='fixed z-50 w-48 rounded-xl bg-white shadow-xl ring-1 ring-black/5 p-1'
>
{/* menu items */}
</Menu.Items>
</Menu>
)}
</div>
);
}Popover बनाम Menu: किसका उपयोग कब करें
हेडलेस यूआई Menu और Popover दोनों घटक उपलब्ध कराता है। ऐसी कार्रवाइयों की सूचियों के लिए Menu का उपयोग कीजिए जिनमें प्रत्येक विकल्प कोई कार्रवाई करता है या नेविगेट करता है। अधिक समृद्ध सामग्री वाले पैनल — जैसे फ़िल्टर फ़ॉर्म, सूचनाओं की फ़ीड या सेटिंग पैनल — के लिए Popover का उपयोग कीजिए। इनमें सामग्री केवल कार्रवाइयों की साधारण सूची नहीं होती और बटनों के अलावा अन्य इंटरैक्टिव तत्व भी हो सकते हैं।
// Menu: for action lists
<Menu>
<Menu.Button>Actions</Menu.Button>
<Menu.Items>
<Menu.Item>Edit</Menu.Item> {/* action */}
<Menu.Item>Delete</Menu.Item> {/* action */}
</Menu.Items>
</Menu>
// Popover: for rich content panels
import { Popover } from '@headlessui/react';
<Popover>
<Popover.Button>Filters</Popover.Button>
<Popover.Panel className='absolute z-10 mt-2 w-72 rounded-xl bg-white shadow-lg p-4'>
{/* Rich content: form inputs, sliders, checkboxes */}
<label>Price range</label>
<input type='range' />
<button>Apply filters</button>
</Popover.Panel>
</Popover>मोबाइल-अनुकूल ड्रॉपडाउन
मोबाइल पर पारंपरिक रूप से पूर्ण स्थिति में रखा गया ड्रॉपडाउन दृश्य क्षेत्र के किनारों से बाहर निकल सकता है। Menu.Items पैनल पर प्रतिक्रियाशील स्थिति लागू कीजिए: छोटी स्क्रीन पर right-0 और बड़ी स्क्रीन पर left-0 का उपयोग कीजिए, या Tailwind के sm: प्रीफ़िक्स से मोबाइल पर नीचे से खुलने वाले पैनल का पैटर्न अपनाइए। मोबाइल दृश्य क्षेत्र की चौड़ाइयों पर ड्रॉपडाउन की जाँच कीजिए, ताकि वे पूरी तरह दिखाई दें और उपयोग में आसान रहें।
<Menu as='div' className='relative'>
<Menu.Button>...</Menu.Button>
<Menu.Items
className='
absolute z-20 mt-1 w-56
rounded-xl bg-white shadow-lg ring-1 ring-black/5 p-1
/* Mobile: right-aligned to avoid left-edge overflow */
right-0
/* Desktop: left-aligned for wider viewports */
sm:right-auto sm:left-0
'
>
{/* items */}
</Menu.Items>
</Menu>
/* Also consider: on very small screens,
render as a full-width bottom sheet instead */पूरा ड्रॉपडाउन घटक तैयार करना
सभी हिस्सों को एक साथ रखने पर एक संपूर्ण, सुघड़ ड्रॉपडाउन Menu में स्थित कंटेनर, शेवरॉन वाला स्टाइल किया हुआ ट्रिगर, आइकन सहित समूहित आइटम, विभाजक और विनाशकारी विकल्प शामिल होते हैं। यह घटक पुनः उपयोग योग्य और पूरी तरह कीबोर्ड से नेविगेट करने योग्य है तथा पूरी तरह Tailwind से स्टाइल किया गया है — इसमें कोई कस्टम CSS नहीं लिखी गई और सारी सुलभता हेडलेस यूआई संभालता है।
export function ActionMenu({ onEdit, onDelete }) {
return (
<Menu as='div' className='relative'>
<Menu.Button className='rounded-lg p-2 text-gray-500 hover:bg-gray-100 focus:ring-2 focus:ring-blue-500 focus:outline-none'>
<EllipsisVerticalIcon className='h-5 w-5' />
</Menu.Button>
<Menu.Items className='absolute right-0 mt-1 w-48 rounded-xl bg-white shadow-lg ring-1 ring-black/5 p-1 focus:outline-none z-20'>
<Menu.Item>
{({ active }) => (
<button onClick={onEdit} className={cn('w-full flex items-center gap-2 px-3 py-2 text-sm rounded-lg', active ? 'bg-gray-100' : 'text-gray-700')}>
<PencilIcon className='h-4 w-4' />
Edit
</button>
)}
</Menu.Item>
<div className='my-1 border-t border-gray-100' />
<Menu.Item>
{({ active }) => (
<button onClick={onDelete} className={cn('w-full flex items-center gap-2 px-3 py-2 text-sm rounded-lg', active ? 'bg-red-50 text-red-700' : 'text-red-600')}>
<TrashIcon className='h-4 w-4' />
Delete
</button>
)}
</Menu.Item>
</Menu.Items>
</Menu>
);
}त्वरित जाँच
इस पाठ से Tailwind CSS Mastery की अवधारणाओं की अपनी समझ जाँचिए।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: Menu.Button दृश्य प्रतिक्रिया के लिए open रेंडर प्रॉप के साथ ड्रॉपडाउन ट्रिगर करता है, Menu.Items को Tailwind से पूर्ण स्थिति में रखा जाता है और Menu.Item active फ़ोकस किए गए विकल्प की हाइलाइट शैली तय करता है। अगले भाग में हम हेडलेस यूआई के Dialog घटक से पूरी तरह सुलभ डायलॉग बनाएँगे।
एआई शिक्षक के साथ HTML सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना” पाठ निःशुल्क है?
हाँ—“हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Tailwind CSS Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना” में मैं क्या सीखूँगा?
कीबोर्ड नेविगेशन और ARIA एट्रिब्यूट वाले सुसज्जित ड्रॉपडाउन बनाने के लिए Headless UI के Menu कंपोनेंट पर Tailwind यूटिलिटी क्लास लागू करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Tailwind CSS Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Tailwind CSS Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Tailwind CSS Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 2वाँ पाठ है।
“हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Tailwind CSS Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Tailwind CSS Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Headless UI का परिचय
- हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना
- सुलभ डायलॉग बनाना
- Headless UI के साथ ट्रांज़िशन