Borders, Shadows और Glass
border-radius, मल्टी-लेयर box-shadows, इनसेट शैडो और backdrop-filter से मॉडर्न फ्रॉस्टेड ग्लास UI बनाना सीखें।
🎯 इस पाठ में आप क्या सीखेंगे
📐 `box-shadow` के सभी 6 पैरामीटर्स का पूरा विश्लेषण
ज्यादातर शुरुआती डेवलपर्स केवल 3 वैल्यूज का उपयोग करते हैं जिससे परछाई गंदी और अप्राकृतिक दिखती है। आधुनिक डिजाइन सिस्टम (Tailwind, Stripe, Apple) इन 6 पैरामीटर्स का इस्तेमाल करते हैं:
इसके बिना शैडो बॉक्स के बाहर गिरती है। `inset` लगाने पर शैडो बॉक्स के अंदरूनी फ्रेम में गिरती है — दबे हुए बटन (pressed state) के लिए उत्तम।
क्षैतिज विस्थापन। पॉजिटिव मान शैडो को दाईं ओर ले जाता है; नेगेटिव बाईं ओर। प्राकृतिक रोशनी के लिए X को हमेशा `0px` रखें।
वर्टिकल दूरी। पॉजिटिव मान शैडो को नीचे की ओर गिराता है (जैसे छत की लाइट)। जितना अधिक Y-ऑफसेट होगा, कार्ड उतना ही ऊंचा तैरता दिखेगा।
गॉसियन ब्लर। `0px` होने पर परछाई का किनारा बिल्कुल कठोर दिखता है। जितना ज्यादा ब्लर होगा, परछाई उतनी ही मुलायम और प्राकृतिक बिखरेगी।
सीनियर डिजाइनरों का सीक्रेट! नेगेटिव मान शैडो को ब्लर करने से पहले चारों तरफ से अंदर सिकोड़ लेता है, जिससे अगल-बगल भद्दे काले धब्बे नहीं बनते।
कभी भी सॉलिड ब्लैक `#000000` का उपयोग न करें! पारदर्शी `rgba(15, 23, 42, 0.08)` या ब्रांड कलर के हल्के शेड का उपयोग करें।
⭕ बॉर्डर-रेडियस ज्यामिति और नेस्टेड कॉर्नर का गोल्डन फॉर्मूला
एक नौसिखिए और अनुभवी डिजाइनर के काम में अंतर तुरंत कोनों की बनावट से पकड़ में आ जाता है। जब किसी गोल कोने वाले कार्ड के अंदर कोई दूसरी गोल चीज (जैसे तस्वीर या बैज) रखी हो, तो अंदरूनी रेडियस हमेशा बाहर वाले से छोटा होना चाहिए!
Inner Radius = Outer Radius - Paddingकार्ड का `border-radius: 20px; padding: 12px;` है और अंदरूनी तस्वीर पर भी `border-radius: 20px;` लगा दिया गया।
बाहरी रेडियस (20px) - पैडिंग (12px) = अंदरूनी रेडियस: 8px।
border-radius: 50%;जब चौड़ाई और ऊंचाई बराबर हो तो यह बिल्कुल गोल चक्र (Circular Avatar) बनाता है।
border-radius: 9999px;कैप्सूल या पिल बैज! टेक्स्ट कितना भी लंबा क्यों न हो जाए, दोनों किनारे हमेशा अर्धवृत्ताकार रहते हैं।
border-radius: 40px / 20px;स्लैश सिंटैक्स! यह क्षैतिज और लंबवत रेडियस अलग-अलग तय करके प्राकृतिक अण्डाकार (Squircle) आकार बनाता है।
💻 लाइव ग्लासमोर्फिज्म और शैडो प्लेग्राउंड
🌄 मल्टी-लेयर एलिवेशन: Stripe और Tailwind का सीक्रेट
वास्तविक दुनिया में कोई भी वस्तु सिर्फ एक ही बिंदु से आने वाली रोशनी से नहीं चमकती। हवा और फर्श से टकराकर भी हल्की रोशनी फैलती है। इसी वास्तविकता को CSS में दर्शाने के लिए दो शैडोज़ को कॉमा लगाकर एक साथ लिखा जाता है:
| लेयर का रोल | box-shadow मान | दृश्य प्रभाव |
|---|---|---|
| 1. एम्बिएंट संपर्क शैडो (Ambient) | 0 1px 3px 0 rgba(0,0,0,0.1) | बारीक और हल्की संपर्क रेखा जो वस्तु को सतह से जोड़कर रखती है ताकि वह हवा में कटी-फटी न लगे। |
| 2. डायरेक्ट मुख्य शैडो (Key Light) | 0 20px 25px -5px rgba(0,0,0,0.1) | गहरा और मुलायम वर्टिकल फैलाव जो यह दर्शाता है कि कार्ड बैकग्राउंड से कितनी ऊंचाई (Z-index) पर तैर रहा है। |
.elevated-card {
box-shadow:
0 4px 6px -1px rgba(0, 0, 0, 0.1), /* लेयर 1: बारीक संपर्क परछाई */
0 20px 25px -5px rgba(0, 0, 0, 0.1); /* लेयर 2: वातावरण में फैली ऊंचाई */
}✨ परफेक्ट ग्लासमोर्फिज्म के 4 अनिवार्य घटक
ग्लासमोर्फिज्म धुंधले कांच (Frosted Glass) जैसा अनुभव देता है। यदि इन 4 घटकों में से एक भी छूट जाए, तो प्रभाव फीका और प्लास्टिक जैसा दिखने लगता है:
background: rgba(255, 255, 255, 0.18);यह कांच के आर-पार रंगों को गुजरने देता है। कभी भी सॉलिड सफेद न लगाएं; ओपेसिटी हमेशा 0.15 से 0.25 के बीच रखें।
backdrop-filter: blur(16px);कांच के पीछे मौजूद आकृतियों को धुंधला कर देता है जिससे आगे लिखा हुआ टेक्स्ट बिल्कुल स्पष्ट पढ़ा जा सके।
border: 1px solid rgba(255, 255, 255, 0.35);यह असली कटे हुए कांच के चमकीले किनारे जैसा दिखता है और कार्ड को बैकग्राउंड से अलग पहचान देता है।
box-shadow: 0 0 0 1px rgba(255,255,255,0.1) inset;कांच के अंदरूनी रिफ्लेक्शन को दर्शाने वाला इनसेट शैडो, जो इसे त्रि-आयामी (3D) मोटाई देता है।
कोड का पंक्ति-दर-पंक्ति विश्लेषण
backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px);कार्ड के पीछे के पिक्सल को ब्लर करता है। iOS Safari (iPhone) पर इसे काम कराने के लिए `-webkit-` प्रीफिक्स लगाना अनिवार्य है!
border: 1px solid rgba(255, 255, 255, 0.35);कांच का 1px चमकीला किनारा बनाता है। पारदर्शी सफेद होने के कारण यह पीछे के ग्रेडिएंट रंगों के साथ अपने आप घुल-मिल जाता है।
box-shadow: 0 20px 40px -15px rgba(0, 0, 0, 0.3);नेगेटिव स्प्रेड `-15px` यह पक्का करता है कि परछाई कार्ड के नीचे शांति से रहे और दाएँ-बाएँ भद्दे धब्बे न छोड़े।
.badge { border-radius: 9999px; }मॉडर्न पिल बैज बनाता है। शब्द छोटा हो या बड़ा, दोनों किनारे हमेशा बिल्कुल गोल बने रहते हैं।
Q1CSS नियम `box-shadow: 0 10px 25px -5px rgba(0,0,0,0.1);` में नेगेटिव मान `-5px` क्या दर्शाता है?
Q2`filter: blur(10px);` और `backdrop-filter: blur(10px);` में सबसे बड़ा अंतर क्या है?
Q3यदि किसी कार्ड में `border-radius: 24px;` और `padding: 16px;` हो, तो उसके अंदर मौजूद तस्वीर का `border-radius` कितना होना चाहिए ताकि कोने सममित (concentric) दिखें?
Q4सीनियर डेवलपर्स होवर पर सीधे `box-shadow` को एनिमेट करने (जैसे `transition: box-shadow 0.3s`) से क्यों बचते हैं, और इसके बदले क्या तकनीक अपनाते हैं?
प्रैक्टिस चैलेंज: 3D ग्लो बटन तैयार करें
दाएँ हाथ के लाइव कोड एडिटर में `.cta-btn` बटन पर एक रंगीन ग्लो और बटन दबाने वाला प्रेस इफेक्ट जोड़ें:
- स्टेप 1:
.cta-btn:hoverमें एक चमकदार ब्रांड शैडो जोड़ें:box-shadow: 0 10px 25px -5px rgba(99, 102, 241, 0.5);। - स्टेप 2:
.cta-btn:activeस्यूडो-क्लास जोड़ें जिसमेंtransform: translateY(1px);और इनसेट शैडोbox-shadow: 0 2px 4px rgba(0,0,0,0.2) inset;हो। - स्टेप 3: लाइव प्रिव्यू में बटन पर क्लिक करके दबाए रखें — देखें कि कैसे बटन एक असली कीबोर्ड की तरह अंदर की ओर दबता महसूस होता है!
💡 सही समाधान कोड देखने के लिए यहाँ क्लिक करें
सामान्य गलतियाँ और सीनियर डेवलपर इंटरव्यू प्रश्न
❌ गलती: फोकस इंडिकेटर के लिए Border का उपयोग करना
कीबोर्ड फोकस दर्शाने के लिए कभी भी `border` न लगाएं! फोकस होने पर बॉर्डर की चौड़ाई बदलने से आसपास का पूरा कंटेंट 2px हिल जाता है (लेआउट जिटर)। हमेशा outline: 2px solid #6366f1; outline-offset: 2px; का इस्तेमाल करें, जो बिना लेआउट हिलाए WCAG एक्सेसिबिलिटी मानकों को पूरा करता है।
✅ प्रो टिप: 60 FPS स्मूथ शैडो एनीमेशन ट्रिक
कार्ड होवर को बिना किसी लैग के एनिमेट करने के लिए, भारी शैडो को .card::after पर position: absolute; inset: 0; opacity: 0; transition: opacity 0.2s; के साथ पहले ही रेंडर कर लें। होवर करने पर केवल `opacity: 1` करें — ब्राउज़र इसे सीधे GPU पर 120fps की मक्खन जैसी गति से एनिमेट करेगा!
💬 Interview Q: `border`, `outline`, और `box-shadow: 0 0 0 2px color` में क्या अंतर है?
- Border: बॉक्स मॉडल का हिस्सा है। जगह घेरता है, एलिमेंट का आकार बदलता है, `border-radius` का पालन करता है और बदलने पर रीफ्लो (reflow) करता है।
- Outline: बॉक्स मॉडल के बाहर रहता है। कोई जगह नहीं घेरता, रीफ्लो नहीं करता, और `outline-offset` की सुविधा देता है।
- Box-Shadow रिंग (`0 0 0 2px`): शून्य जगह घेरता है, पूरी तरह `border-radius` के अनुसार मुड़ता है, और कॉमा लगाकर कई रंगों के छल्ले एक साथ बनाए जा सकते हैं।
💬 Interview Q: `backdrop-filter` कई बार स्क्रीन पर रेंडर क्यों नहीं होता या पारदर्शी क्यों नहीं दिखता?
इसके तीन मुख्य कारण होते हैं:
- WebKit प्रीफिक्स गायब होना: iOS Safari पर
-webkit-backdrop-filter: blur(...)अनिवार्य है। इसके बिना बैकग्राउंड ब्लर नहीं होता। - स्टैकिंग कॉन्टेक्स्ट समस्या: यदि पैरेंट पर
opacity < 1याfilterलगा हो, तो ब्राउज़र नया रेंडरिंग सरफेस बना देता है जिससे ब्लर कट सकता है। - ठोस बैकग्राउंड: यदि बैकग्राउंड सॉलिड व्हाइट (`#ffffff`) है, तो ब्लर सफेद पेंट के नीचे दब जाता है और दिखाई नहीं देता! बैकग्राउंड का पारदर्शी होना जरूरी है।
💬 Interview Q: जब किसी पैरेंट पर `overflow: hidden` लगा हो तो `box-shadow` का क्या होता है?
यदि चाइल्ड एलिमेंट पर `box-shadow` है और उसके पैरेंट पर overflow: hidden; लगा है, तो वह परछाई पैरेंट की दीवार पर पहुंचते ही चाकू से कटी हुई जैसी छंट (clip) जाएगी!
समाधान: शैडो हमेशा सबसे बाहरी कंटेनर पर लगाएं, या पैरेंट में इतनी पर्याप्त पैडिंग रखें कि परछाई बिना कटे आराम से बिखर सके।