सुलभ डायलॉग बनाना
अंतर्निहित फ़ोकस ट्रैपिंग और Escape कुंजी प्रबंधन वाले मोडल के लिए Headless UI के Dialog कंपोनेंट का उपयोग करें और उन्हें पूरी तरह Tailwind से स्टाइल करें।
सुलभ डायलॉग बनाना, CoddyKit पर Tailwind CSS Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Tailwind CSS Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
डायलॉग को सुलभ क्या बनाता है
एक सुलभ डायलॉग (मोडल) को कई आवश्यकताएँ पूरी करनी होती हैं: खुलने पर उसे कीबोर्ड फ़ोकस मिलना चाहिए, फ़ोकस को अपने भीतर सीमित रखना चाहिए ताकि उपयोगकर्ता Tab से बाहर न जा सकें, उसे Escape कुंजी से बंद किया जा सके, सही ARIA एट्रिब्यूट लागू होने चाहिए (role='dialog', aria-modal='true') और बंद होने पर फ़ोकस ट्रिगर तत्व पर लौटना चाहिए। इन्हें सही ढंग से लागू करना जटिल है। हेडलेस यूआई का Dialog घटक यह सब अपने-आप संभालता है।
डायलॉग की मूल संरचना
हेडलेस यूआई का Dialog तीन प्रमुख तत्वों से बना है: Dialog (मूल घटक, ARIA और फ़ोकस संभालता है), Dialog.Panel (दिखाई देने वाला मोडल बॉक्स) और वैकल्पिक Dialog.Title तथा Dialog.Description (अर्थपूर्ण लेबल के लिए)। open प्रॉप दृश्यता नियंत्रित करता है और उपयोगकर्ता Escape दबाने या पैनल के बाहर क्लिक करने पर onClose चलता है — कौन-सी कार्रवाई करनी है, यह आप तय करते हैं (आमतौर पर open स्थिति को false करना)।
import { Dialog } from '@headlessui/react';
import { useState } from 'react';
function AlertDialog() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Open Dialog</button>
<Dialog open={open} onClose={() => setOpen(false)}>
<Dialog.Panel>
<Dialog.Title>Alert</Dialog.Title>
<Dialog.Description>This is an important message.</Dialog.Description>
<button onClick={() => setOpen(false)}>Close</button>
</Dialog.Panel>
</Dialog>
</>
);
}बैकड्रॉप ओवरले जोड़ना
उपयोगकर्ता का ध्यान डायलॉग पर खींचने के लिए मोडल को उसके पीछे मौजूद पेज सामग्री को धुंधला करना चाहिए। अर्ध-पारदर्शी पृष्ठभूमि वाले fixed inset-0 का उपयोग करके पूरे स्क्रीन का बैकड्रॉप जोड़िए। इसे Dialog के पहले चाइल्ड के रूप में, पैनल कंटेनर से पहले रखिए। बैकड्रॉप पर aria-hidden='true' का उपयोग कीजिए, क्योंकि यह केवल सजावटी है — स्क्रीन रीडर को इसकी घोषणा नहीं करनी चाहिए।
<Dialog open={open} onClose={() => setOpen(false)} className='relative z-50'>
{/* Backdrop */}
<div
className='fixed inset-0 bg-black/50 backdrop-blur-sm'
aria-hidden='true'
/>
{/* Panel container — centers the dialog */}
<div className='fixed inset-0 flex items-center justify-center p-4'>
<Dialog.Panel className='bg-white rounded-2xl shadow-2xl max-w-md w-full'>
{/* Dialog content */}
</Dialog.Panel>
</div>
</Dialog>डायलॉग पैनल की स्टाइलिंग
Dialog.Panel दिखाई देने वाला मोडल कंटेनर है। सुघड़ कार्ड बनाने के लिए पृष्ठभूमि, बॉर्डर रेडियस, शैडो, पैडिंग और अधिकतम चौड़ाई की Tailwind क्लासें लगाइए। पैनल पर max-w-* सीमा होनी चाहिए, ताकि बड़ी स्क्रीन पर वह पूरी चौड़ाई में न फैले, जबकि छोटी स्क्रीन पर w-full के साथ प्रतिक्रियाशील बना रहे। माउस से क्लिक करना पसंद करने वाले उपयोगकर्ताओं के लिए ऊपर-दाएँ कोने में बंद करने का बटन जोड़िए।
<Dialog.Panel className='relative bg-white rounded-2xl shadow-2xl max-w-lg w-full p-6'>
{/* Close button */}
<button
onClick={() => setOpen(false)}
className='absolute top-4 right-4 rounded-full p-1 text-gray-400 hover:bg-gray-100 hover:text-gray-600'
>
<XMarkIcon className='h-5 w-5' />
<span className='sr-only'>Close</span>
</button>
{/* Header */}
<Dialog.Title className='text-lg font-semibold text-gray-900 pr-8'>
Delete Project
</Dialog.Title>
<Dialog.Description className='mt-2 text-sm text-gray-600'>
This action cannot be undone. All project data will be permanently removed.
</Dialog.Description>
{/* Actions */}
<div className='mt-6 flex gap-3 justify-end'>
<button onClick={() => setOpen(false)}
className='px-4 py-2 text-sm font-medium rounded-lg border border-gray-300 hover:bg-gray-50'>
Cancel
</button>
<button
className='px-4 py-2 text-sm font-medium rounded-lg bg-red-600 text-white hover:bg-red-700'>
Delete
</button>
</div>
</Dialog.Panel>लंबी सामग्री के लिए स्क्रॉल होने वाला डायलॉग
लंबी सामग्री वाले डायलॉग — जैसे सेवा की शर्तें, फ़ॉर्म विज़ार्ड या विस्तृत पूर्वावलोकन — को ऐसा स्क्रॉल होने योग्य होना चाहिए कि बैकड्रॉप स्क्रॉल न हो। पैनल पर overflow-y-auto लगाइए और max-h-* सीमा दीजिए, ताकि डायलॉग दृश्य क्षेत्र से बाहर न बढ़े। बहुत लंबी सामग्री के लिए डायलॉग को स्क्रीन के ऊपरी भाग के पास रखने हेतु बाहरी केंद्रण कंटेनर में ऊपर की पैडिंग के साथ items-start होना चाहिए।
// Scrollable dialog for long content
<div className='fixed inset-0 overflow-y-auto'>
<div className='flex min-h-full items-start justify-center p-4 pt-16'>
<Dialog.Panel
className='
bg-white rounded-2xl shadow-xl
max-w-2xl w-full
max-h-[80vh] overflow-y-auto
'
>
<div className='sticky top-0 bg-white border-b border-gray-100 px-6 py-4 z-10'>
<Dialog.Title className='text-lg font-semibold'>Terms of Service</Dialog.Title>
</div>
<div className='px-6 py-4 prose prose-sm'>
{/* Long content */}
</div>
<div className='sticky bottom-0 bg-white border-t border-gray-100 px-6 py-4'>
<button className='w-full bg-blue-600 text-white rounded-lg py-2'>Accept</button>
</div>
</Dialog.Panel>
</div>
</div>डायलॉग आकार के विकल्प
Tailwind की max-w-* यूटिलिटी का उपयोग करके पुनः उपयोग योग्य डायलॉग आकार विकल्प बनाइए। पुष्टियों के लिए छोटे, फ़ॉर्म के लिए मध्यम और पूर्वावलोकन या बहु-चरणीय विज़ार्ड के लिए बड़े डायलॉग रखिए। ऐसा DialogModal घटक बनाइए जो size प्रॉप स्वीकार करे और संबंधित अधिकतम-चौड़ाई वाली क्लास लागू करे — यह CVA (class-variance-authority) पैटर्न के लिए स्वाभाविक उपयोग का मामला है।
const panelSizes = {
sm: 'max-w-sm',
md: 'max-w-md',
lg: 'max-w-lg',
xl: 'max-w-2xl',
full: 'max-w-5xl'
};
function DialogModal({ open, onClose, size = 'md', title, description, children }) {
return (
<Dialog open={open} onClose={onClose} className='relative z-50'>
<div className='fixed inset-0 bg-black/50' aria-hidden='true' />
<div className='fixed inset-0 flex items-center justify-center p-4'>
<Dialog.Panel
className={cn(
'bg-white rounded-2xl shadow-xl w-full p-6',
panelSizes[size]
)}
>
{title && <Dialog.Title className='text-lg font-semibold'>{title}</Dialog.Title>}
{description && <Dialog.Description className='mt-1 text-sm text-gray-600'>{description}</Dialog.Description>}
<div className='mt-4'>{children}</div>
</Dialog.Panel>
</div>
</Dialog>
);
}व्यवहार में फ़ोकस प्रबंधन
हेडलेस यूआई डायलॉग खुलने पर फ़ोकस को अपने-आप उसके भीतर ले जाता है। डिफ़ॉल्ट रूप से फ़ोकस पैनल के भीतर पहले फ़ोकस किए जा सकने वाले तत्व पर जाता है। फ़ोकस को किसी विशिष्ट तत्व — जैसे प्राथमिक CTA या टेक्स्ट इनपुट — पर ले जाने के लिए उस तत्व की ओर संकेत करने वाले React ref के साथ initialFocus प्रॉप का उपयोग कीजिए। इससे उन कीबोर्ड और स्क्रीन रीडर उपयोगकर्ताओं का अनुभव बेहतर होता है जिन्हें तुरंत किसी विशेष नियंत्रण के साथ इंटरैक्ट करना होता है।
import { Dialog } from '@headlessui/react';
import { useRef } from 'react';
function DeleteConfirm({ open, onClose, onDelete }) {
const cancelButtonRef = useRef(null);
return (
<Dialog
open={open}
onClose={onClose}
initialFocus={cancelButtonRef} // focus Cancel by default (safer)
>
{/* ...backdrop... */}
<div className='fixed inset-0 flex items-center justify-center p-4'>
<Dialog.Panel className='bg-white rounded-2xl p-6 max-w-sm w-full shadow-xl'>
<Dialog.Title className='font-semibold text-gray-900'>Delete?</Dialog.Title>
<div className='mt-4 flex gap-3 justify-end'>
{/* initialFocus lands here */}
<button ref={cancelButtonRef} onClick={onClose}
className='px-4 py-2 text-sm border rounded-lg'>
Cancel
</button>
<button onClick={onDelete}
className='px-4 py-2 text-sm bg-red-600 text-white rounded-lg'>
Delete
</button>
</div>
</Dialog.Panel>
</div>
</Dialog>
);
}नेस्टेड डायलॉग की परतें
कभी-कभी कोई डायलॉग दूसरा डायलॉग खोलता है — जैसे सेटिंग मोडल के भीतर पुष्टि। नेस्टेड डायलॉग को सही परतों में दिखाने के लिए क्रमशः अधिक ऊँचे z-index मानों का उपयोग कीजिए। प्रत्येक डायलॉग अपने फ़ोकस ट्रैप को स्वतंत्र रूप से संभालता है; हेडलेस यूआई एक साथ खुले कई डायलॉग का समर्थन करता है। प्रत्येक डायलॉग स्तर के लिए स्थिति चर रखिए और उन्हें उलटे क्रम में बंद कीजिए।
function SettingsModal({ open, onClose }) {
const [confirmOpen, setConfirmOpen] = useState(false);
return (
<>
{/* Primary dialog — z-40 */}
<Dialog open={open} onClose={onClose} className='relative z-40'>
<div className='fixed inset-0 bg-black/40' aria-hidden='true' />
<div className='fixed inset-0 flex items-center justify-center p-4'>
<Dialog.Panel className='bg-white rounded-2xl p-6 max-w-lg w-full shadow-xl'>
<h2 className='font-semibold text-lg'>Settings</h2>
<button onClick={() => setConfirmOpen(true)}
className='mt-4 text-red-600 text-sm'>
Reset all settings
</button>
</Dialog.Panel>
</div>
</Dialog>
{/* Nested confirmation — z-50 (higher) */}
<Dialog open={confirmOpen} onClose={() => setConfirmOpen(false)} className='relative z-50'>
{/* ... */}
</Dialog>
</>
);
}पृष्ठभूमि स्क्रॉल रोकना
डायलॉग खुला होने पर उसके पीछे मौजूद पेज सामग्री स्क्रॉल नहीं होनी चाहिए। हेडलेस यूआई इसे अपने-आप नहीं संभालता। ऐसा साइड इफ़ेक्ट जोड़िए जो डायलॉग खुलने पर बॉडी में overflow-hidden जोड़े और बंद होने पर उसे हटा दे। Next.js या React ऐप में डायलॉग घटक के भीतर useEffect या ऐसा कस्टम हुक उपयोग कीजिए जो अनमाउंट होने पर सही ढंग से सफ़ाई करे।
import { useEffect } from 'react';
function useBodyScrollLock(isLocked) {
useEffect(() => {
if (isLocked) {
document.body.classList.add('overflow-hidden');
} else {
document.body.classList.remove('overflow-hidden');
}
// Cleanup on unmount
return () => document.body.classList.remove('overflow-hidden');
}, [isLocked]);
}
// Usage in dialog component
function MyDialog({ open, onClose }) {
useBodyScrollLock(open);
return (
<Dialog open={open} onClose={onClose}>
{/* ... */}
</Dialog>
);
}डायलॉग सुलभता जाँच-सूची
डायलॉग घटक जारी करने से पहले जाँचिए कि वह सुलभता की आवश्यकताएँ पूरी करता है: खुलने पर फ़ोकस डायलॉग में चला जाता है, खुले रहने के दौरान फ़ोकस भीतर सीमित रहता है, Escape डायलॉग बंद करता है, बैकड्रॉप पर क्लिक करने से डायलॉग बंद होता है, बंद होने पर फ़ोकस ट्रिगर तत्व पर लौटता है, स्क्रीन रीडर डायलॉग शीर्षक की घोषणा करते हैं और भीतर के सभी इंटरैक्टिव तत्वों तक कीबोर्ड से पहुँचा जा सकता है। इनमें से अधिकांश काम हेडलेस यूआई संभालता है — अपने कार्यान्वयन में फ़ोकस लौटने और बैकड्रॉप पर क्लिक करने के व्यवहार की जाँच अवश्य कीजिए।
/*
Dialog Accessibility Checklist:
[✓] Focus enters dialog on open (Headless UI automatic)
[✓] Focus trapped inside while open (Headless UI automatic)
[✓] Escape key closes dialog (Headless UI automatic)
[✓] role='dialog' + aria-modal='true' (Headless UI automatic)
[✓] Dialog.Title used for aria-labelledby (Headless UI automatic)
[✓] Dialog.Description for aria-describedby (Headless UI automatic)
[ ] Focus returns to trigger on close → store triggerRef
[ ] Backdrop click closes dialog → pass handler to onClose
[ ] Body scroll locked while open → useBodyScrollLock hook
[ ] Close button has visible label or aria-label
*/डायलॉग के प्रकार: Alert बनाम Confirm बनाम Form
डायलॉग अलग-अलग उद्देश्यों के लिए होते हैं और इन्हें उसी के अनुसार डिज़ाइन किया जाना चाहिए। एक alert dialog एकल स्वीकृति बटन के साथ अत्यावश्यक जानकारी देता है — इनके लिए role='alertdialog' का उपयोग करें। एक confirmation dialog किसी विनाशकारी कार्रवाई से पहले हाँ/नहीं का प्रश्न पूछता है और इसमें Cancel पर डिफ़ॉल्ट फ़ोकस होना चाहिए। एक form dialog में सत्यापन सहित पूरा फ़ॉर्म होता है। प्रत्येक प्रकार के आकार, फ़ोकस और बटन क्रम से जुड़े अलग-अलग प्रचलित नियम होते हैं, जो उपयोगकर्ताओं को यह जल्दी समझने में मदद करते हैं कि उनसे क्या अपेक्षित है।
<!-- Alert dialog: urgent info, single action -->
<Dialog.Panel class='bg-white rounded-2xl p-6 max-w-sm shadow-xl'>
<div class='flex items-start gap-4'>
<div class='flex-shrink-0 w-10 h-10 rounded-full bg-red-100 flex items-center justify-center'>
<ExclamationTriangleIcon class='h-5 w-5 text-red-600' />
</div>
<div>
<Dialog.Title class='text-base font-semibold text-gray-900'>Session Expired</Dialog.Title>
<Dialog.Description class='mt-1 text-sm text-gray-600'>
Your session has expired. Please log in again.
</Dialog.Description>
<button class='mt-4 w-full bg-blue-600 text-white rounded-lg py-2 text-sm font-medium'>
Log In
</button>
</div>
</div>
</Dialog.Panel>त्वरित जाँच
इस पाठ में Tailwind CSS Mastery की अवधारणाओं की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: Headless UI Dialog फ़ोकस ट्रैपिंग, Escape से बंद करना और ARIA भूमिकाएँ अपने-आप संभालता है; backdrop पूरे स्क्रीन पर स्थिर ओवरले होता है, जिसे पैनल से पहले रखा जाता है; और initialFocus खुलने पर कीबोर्ड फ़ोकस को किसी विशेष तत्व पर ले जाता है। अब हम Headless UI के Transition घटक का उपयोग करके डायलॉग के खुलने और बंद होने के संक्रमणों को एनिमेट करेंगे।
एआई शिक्षक के साथ HTML सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “सुलभ डायलॉग बनाना” पाठ निःशुल्क है?
हाँ—“सुलभ डायलॉग बनाना” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Tailwind CSS Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Tailwind CSS Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“सुलभ डायलॉग बनाना” में मैं क्या सीखूँगा?
अंतर्निहित फ़ोकस ट्रैपिंग और Escape कुंजी प्रबंधन वाले मोडल के लिए Headless UI के Dialog कंपोनेंट का उपयोग करें और उन्हें पूरी तरह Tailwind से स्टाइल करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Tailwind CSS Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या Tailwind CSS Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Tailwind CSS Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“सुलभ डायलॉग बनाना” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस Tailwind CSS Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर Tailwind CSS Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- Headless UI का परिचय
- हेडलेस मेनू और ड्रॉपडाउन को स्टाइल करना
- सुलभ डायलॉग बनाना
- Headless UI के साथ ट्रांज़िशन