एक वाक्य में
CSS की box-shadow प्रॉपर्टी आपको किसी एलिमेंट के फ्रेम से एक या एक से ज़्यादा शैडो (shadows) बनाने देती है, जिससे वेब पेज पर गहराई, ऊंचाई, या अंदरूनी चमक का भ्रम पैदा होता है।
यह क्या समस्या हल करता है
शुरुआती वेब डिज़ाइन की सपाट दुनिया में, सब कुछ एक ही तल पर था। कोई गहराई नहीं थी, कोई ऊंचाई नहीं थी। अगर आप चाहते थे कि कोई चीज़ उभर कर दिखे, तो आप उसे बड़ा या ज़्यादा चमकीले रंग का बना देते थे। और अगर आप सच में किसी बटन को क्लिक करने लायक दिखाने के लिए शैडो चाहते थे, तो यह एक बहुत बड़ी मुसीबत थी।
इसका "समाधान" था Photoshop चालू करना, एक ड्रॉप शैडो वाला बॉक्स बनाना, और उसे एक इमेज के रूप में एक्सपोर्ट करना। फिर आप इस इमेज को अपने एलिमेंट के बैकग्राउंड के रूप में इस्तेमाल करते थे। इसे हल्के शब्दों में कहें तो, यह एक भयानक जुगाड़ था। इमेज भारी होती थीं, जिससे आपकी साइट धीमी हो जाती थी। हाई-रिज़ॉल्यूशन स्क्रीन पर वे पिक्सलेटेड दिखती थीं। अगर बॉक्स का आकार बदलना होता, तो वे स्केल नहीं हो पाती थीं। और अगर डिज़ाइनर शैडो को "धुंधले ग्रे" से "थोड़ा और धुंधले ग्रे" में बदलना चाहता, तो आपको वापस Photoshop में जाकर सब कुछ फिर से शुरू करना पड़ता था। यह तरीका अविश्वसनीय, अक्षम और मेंटेनेंस के लिए एक बुरा सपना था।
फिर, CSS3 एक सुपरहीरो की तरह मैदान में उतरा। box-shadow प्रॉपर्टी ने डेवलपर्स को कोड के साथ शैडो बनाने का एक तरीका दिया। अचानक, शैडो अब भारी-भरकम बिटमैप आर्टिफैक्ट नहीं रहे; वे डॉक्यूमेंट के डायनामिक, स्केलेबल और एनिमेटेबल हिस्से बन गए।
शुरुआत में, डेवलपर्स ने इसका इस्तेमाल वही सरल ड्रॉप शैडो बनाने के लिए किया जो वे Photoshop में बनाते थे। लेकिन box-shadow की असली ताकत सिर्फ पुराने तरीके को फिर से बनाना नहीं थी, बल्कि एक नया तरीका सक्षम करना था। यह Google के मटेरियल डिज़ाइन जैसे डिज़ाइन सिस्टम की आधारशिला बन गया, जो पदानुक्रम (hierarchy) को बताने और एक स्पर्शनीय, कागज जैसा इंटरफ़ेस बनाने के लिए शैडो और ऊंचाई का उपयोग करता है। box-shadow ने हमें सीधे ब्राउज़र में रौशनी और परछाई के साथ पेंट करने का एक नेटिव, कोड-आधारित तरीका देकर इमेज के साथ नकली गहराई बनाने की समस्या को हल कर दिया।
यह अंदर से कैसे काम करता है
पहली नज़र में, box-shadow सरल लगता है। लेकिन एक अच्छे जादू के करतब की तरह, इसकी सादगी में आश्चर्यजनक रूप से काफी गहराई छिपी है (यह श्लेष अलंकार जानबूझकर है!)।
एक सिंगल शैडो की बनावट
एक सिंगल शैडो को वैल्यूज़ की एक सीरीज़ द्वारा परिभाषित किया जाता है जो ब्राउज़र को बताती है कि इसे कहाँ रखना है, इसे कितना धुंधला बनाना है, इसे कितना बड़ा करना है, और किस रंग का उपयोग करना है।
मूल सिंटैक्स है box-shadow: offset-x offset-y blur-radius spread-radius color;। आइए इसे तोड़कर समझते हैं।
| पैरामीटर | यह क्या करता है | उदाहरण वैल्यू |
|---|---|---|
offset-x |
शैडो को हॉरिजॉन्टली (horizontally) मूव करता है। पॉजिटिव वैल्यू इसे दाईं ओर ले जाती है, नेगेटिव वैल्यू बाईं ओर। | 10px |
offset-y |
शैडो को वर्टिकली (vertically) मूव करता है। पॉजिटिव वैल्यू इसे नीचे ले जाती है, नेगेटिव वैल्यू ऊपर। | 10px |
blur-radius |
धुंधलेपन को नियंत्रित करता है। 0 एक तेज, हार्ड-एज वाली शैडो है। बड़ी वैल्यू एक नरम, अधिक फैली हुई ब्लर बनाती हैं। |
20px |
spread-radius |
शैडो के स्रोत के आकार को बढ़ाता या सिकोड़ता है। पॉजिटिव वैल्यू शैडो को एलिमेंट से बड़ा बनाती हैं; नेगेटिव वैल्यू इसे सिकोड़ती हैं। | 5px |
color |
शैडो का रंग। यथार्थवादी प्रभाव के लिए rgba(0, 0, 0, 0.1) जैसे सेमी-ट्रांसपेरेंट रंग का उपयोग करना महत्वपूर्ण है। |
rgba(0,0,0,0.5) |
केवल offset-x और offset-y ही आवश्यक हैं, लेकिन बिना ब्लर या रंग के शैडो कोई खास शैडो नहीं होती।
/* एक सरल शैडो: 10px नीचे, 10px दाईं ओर, 20px ब्लर, 50% ओपेसिटी पर काला */
.card {
box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);
}
inset कीवर्ड: बॉक्स के अंदर जाना
डिफ़ॉल्ट रूप से, शैडो एलिमेंट से बाहर की ओर डाली जाती हैं, जैसे कि एलिमेंट पेज के ऊपर तैर रहा हो। शुरुआत में inset कीवर्ड जोड़कर, आप इसे पूरी तरह से पलट सकते हैं।
.pressed-button {
/* यह शैडो एलिमेंट के पैडिंग बॉक्स के *अंदर* डाली गई है */
box-shadow: inset 5px 5px 10px rgba(0, 0, 0, 0.2);
}
एक इनसेट शैडो एलिमेंट के बॉर्डर के अंदर, उसके बैकग्राउंड के ऊपर खींची जाती है। यह "दबे हुए" बटन प्रभाव, धंसे हुए दिखने वाले इनपुट फ़ील्ड, या इमेज पर विग्नेट (vignette) प्रभाव बनाने के लिए एकदम सही है। यह पेज के ऊपर कुछ बनाने के बजाय उसमें नक्काशी करने जैसा है।
लेयरिंग शैडो: यथार्थवादी गहराई का रहस्य
असली कलाकारी यहीं से शुरू होती है। box-shadow प्रॉपर्टी शैडो की कॉमा-सेपरेटेड लिस्ट स्वीकार कर सकती है। यह उन शैडो को बनाने का रहस्य है जो प्राकृतिक दिखती हैं, न कि 2008 के किसी अनाड़ी Photoshop प्रभाव की तरह।
वास्तविक दुनिया की परछाइयाँ एक समान धब्बा नहीं होतीं। अपनी मेज पर रखी किसी वस्तु के बारे में सोचें। आमतौर पर ठीक इसके नीचे एक छोटी, गहरी, तेज़ शैडो होती है (अम्ब्रा), और एक बड़ी, नरम, ज़्यादा ट्रांसपेरेंट शैडो होती है जो बाहर की ओर फैलती है (पेनम्ब्रा)।
हम कई box-shadow डेफिनिशन को लेयर करके इसे दोहरा सकते हैं। ब्राउज़र उन्हें एक के ऊपर एक रखता है, जिसमें लिस्ट में पहली शैडो सबसे ऊपर होती है।
.super-card {
box-shadow:
/* लेयर 1 (ऊपर): 'अम्ब्रा' के लिए एक छोटी, गहरी शैडो */
0 4px 6px -1px rgba(0, 0, 0, 0.1),
/* लेयर 2 (नीचे): 'पेनम्ब्रा' के लिए एक चौड़ी, नरम शैडो */
0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
यह छोटा सा स्निपेट एक ऐसी शैडो बनाता है जो किसी भी सिंगल-लेयर शैडो की तुलना में कहीं ज़्यादा यथार्थवादी है। दो या तीन (या अधिक!) सूक्ष्म शैडो को मिलाकर, आप गहराई और ऊंचाई का एक विश्वसनीय भ्रम पैदा कर सकते हैं जो आपके UI को अधिक वास्तविक और परिष्कृत महसूस कराता है। यह तकनीक कई आधुनिक डिज़ाइन प्रणालियों की नींव है, और टूल अक्सर आपके लिए इन लेयर्ड स्टैक को जेनरेट करते हैं।
वास्तविक दुनिया की कहानियाँ
'फ्लोटिंग' एक्शन बटन का मामला
एक स्टार्टअप अपने लोकप्रिय मोबाइल ऐप का वेब-आधारित संस्करण बना रहा था। इसका सिग्नेचर UI एलिमेंट एक फ्लोटिंग एक्शन बटन (FAB) था जो नीचे-दाएं कोने में मँडराता था। इस काम के लिए नियुक्त जूनियर डेवलपर ने उस पर एक सरल box-shadow: 0 5px 10px black; लगा दिया। डिज़ाइन रिव्यू में, लीड डिज़ाइनर ने मुँह बना लिया। "यह तैरता हुआ नहीं लग रहा है," उसने कहा। "यह ऐसा लग रहा है जैसे इस पर एक अजीब सा, काला धब्बा है।" बटन पेज से चिपका हुआ लग रहा था, न कि उसके ऊपर उठा हुआ।
निराश होकर, डेवलपर ने एडवांस्ड शैडो तकनीकों के बारे में गहराई से खोजबीन की। उन्होंने लेयरिंग की खोज की। एक कठोर शैडो को तीन शैडो के स्टैक से बदलकर, उन्होंने कोड क्रैक कर लिया। पहली शैडो बटन के ठीक नीचे बहुत छोटी, अपेक्षाकृत गहरी थी ताकि उसे ज़मीन से जुड़ा हुआ दिखाया जा सके। दूसरी एक मध्यम, थोड़ी हल्की शैडो थी जो उसके आकार को परिभाषित करती थी। तीसरी एक बड़ी, बहुत पारदर्शी और अत्यधिक धुंधली शैडो थी जो आसपास के क्षेत्र में फैलती हुई रोशनी का अनुकरण करती थी। परिणाम परिवर्तनकारी था। बटन अब वास्तव में तैरता हुआ लग रहा था, एक नरम, जटिल शैडो डाल रहा था जिसने इसे ऊंचाई का वास्तविक एहसास दिया।
सबक: यथार्थवादी गहराई असली रोशनी की नकल करने से आती है। विभिन्न आकार, ब्लर और ओपेसिटी की सूक्ष्म शैडो को लेयर करना एलिमेंट्स को "तैरता हुआ" दिखाने की कुंजी है।
गायब हो रही परफॉर्मेंस का रहस्य
एक डेटा एनालिटिक्स कंपनी ने एक सुंदर नया डैशबोर्ड लॉन्च किया। यह कार्ड्स से भरा था, प्रत्येक एक अलग मीट्रिक दिखा रहा था, और प्रत्येक पर एक आकर्षक होवर इफ़ेक्ट था जहाँ कार्ड बढ़ती हुई शैडो के साथ ऊपर उठता था। उनके हाई-एंड डेवलपर लैपटॉप पर, यह मक्खन की तरह स्मूथ था। लेकिन सपोर्ट टिकटों की बाढ़ आ गई। "नया डैशबोर्ड बहुत धीमा है!" "स्क्रॉल करने से मेरे कंप्यूटर का पंखा जेट इंजन की तरह घूमने लगता है!"
परफॉर्मेंस टीम ने जांच शुरू की। ब्राउज़र के डेवलपर टूल्स का उपयोग करते हुए, उन्होंने टाइमलाइन प्रोफाइलर में हर बार जब कोई उपयोगकर्ता स्क्रॉल करता या किसी कार्ड पर होवर करता, तो लाल रंग का समुद्र देखा। ब्राउज़र "पेंट" पर बहुत अधिक समय खर्च कर रहा था। दोषी? प्रत्येक कार्ड में होवर पर एक राक्षसी शैडो थी: box-shadow: 0 50px 100px -20px rgba(0,0,0,0.5);। विशाल ब्लर रेडियस (100px) का मतलब था कि ब्राउज़र को एनीमेशन के हर एक फ्रेम पर स्क्रीन के एक बहुत बड़े क्षेत्र को फिर से पेंट करना पड़ रहा था।
इसका समाधान दोतरफा था। सबसे पहले, उन्होंने एक महंगी शैडो को एक अधिक अनुकूलित, मल्टी-लेयर शैडो से बदल दिया, जिसने बहुत छोटे ब्लर रेडियस के साथ एक समान रूप प्राप्त किया। दूसरा, होवर इफ़ेक्ट के लिए, उन्होंने box-shadow के बजाय transform: scale(1.05) प्रॉपर्टी को ट्रांज़िशन किया। यह ब्राउज़र के लिए एनिमेट करने में बहुत सस्ता था। जैंक (jank) गायब हो गया, और उपयोगकर्ता खुश थे।
सबक: मुफ्त में कुछ नहीं मिलता। एक बड़ी, धुंधली शैडो की विज़ुअल अपील की एक वास्तविक परफॉर्मेंस लागत होती है। ब्लर रेडियस के प्रति सचेत रहें, खासकर जब शैडो को एनिमेट कर रहे हों।
वो 'दबा हुआ' बटन जो दबा हुआ नहीं था
एक UI डिज़ाइनर टॉगल फिल्टर का एक सेट चाहता था जो सक्रिय होने पर "अंदर दबा हुआ" दिखे। एक डेवलपर द्वारा पहली कोशिश में एक सरल क्लास परिवर्तन का उपयोग किया गया: सक्रिय बटन को एक गहरा बैकग्राउंड और 1px सॉलिड inset बॉर्डर मिला। यह काम कर रहा था, लेकिन यह सही नहीं लग रहा था। यह एक सपाट बटन जैसा लग रहा था जिसके अंदर एक रेखा खींची गई हो, न कि एक सतह में दबा हुआ बटन।
एक सीनियर डेवलपर ने कोड देखा और एक लाइन का सुझाव दिया। "box-shadow: inset ... आज़माएँ"। बॉर्डर्स के साथ नकली बनाने के बजाय, उन्होंने एक उचित इनसेट शैडो का इस्तेमाल किया। ऊपर और बाईं ओर एक नरम, गहरी inset शैडो, और नीचे और दाईं ओर एक बहुत हल्की, लगभग सफेद inset शैडो। इसने ऊपर-बाईं ओर से एक प्रकाश स्रोत का पूरी तरह से अनुकरण किया जो "दबे हुए" क्षेत्र के अंदर एक शैडो डाल रहा था और विपरीत किनारों पर एक हाइलाइट बना रहा था। प्रभाव तत्काल और विश्वसनीय था। बटन अब सिर्फ "सक्रिय" नहीं दिख रहा था; यह शारीरिक रूप से अंदर दबा हुआ लग रहा था।
सबक: जब आप धंसे हुए या दबे हुए प्रभाव बनाना चाहते हैं, तो बॉर्डर्स और बैकग्राउंड के साथ संघर्ष न करें। box-shadow के लिए inset कीवर्ड इस काम के लिए सही टूल है, जो विशेष रूप से उस आंतरिक-शैडो भ्रम को बनाने के लिए बनाया गया है।
आम गलतियाँ और जाल
- शुद्ध काले रंग का उपयोग करना: वास्तविक दुनिया में कोई भी चीज़
#000000शैडो नहीं डालती है। वास्तविक शैडो परिवेशी प्रकाश से प्रभावित होती हैं और अपने आस-पास से रंग लेती हैं। एक बहुत बड़ा सुधार एक सेमी-ट्रांसपेरेंट काले रंग का उपयोग करना है, जैसेrgba(0, 0, 0, 0.1)। एक और भी बेहतर कदम है अपने ऐप के प्राथमिक या बैकग्राउंड रंग का एक गहरा, डिसैचुरेटेड संस्करण उपयोग करना। - एकल, कठोर शैडो: एक एकल, गहरी, हार्ड-एज वाली
box-shadowआपके डिज़ाइन को पुराना दिखाने का सबसे तेज़ तरीका है। यह 2010 में ठीक था, लेकिन आज यह "डेवलपर आर्ट" जैसा लगता है। लेयरिंग आधुनिक, पेशेवर दिखने वाले UI का मार्ग है। box-shadowप्रॉपर्टी को एनिमेट करना: यह किया जा सकता है, लेकिन यह अक्सर एक परफॉर्मेंस ट्रैप होता है।blur-radiusयाspread-radiusजैसी प्रॉपर्टी को एनिमेट करने से ब्राउज़र को हर फ्रेम पर महंगे रीपेंट ऑपरेशन करने पड़ते हैं, जिससे जैंकी (janky) एनिमेशन हो सकते हैं। इसके बजायtransformयाopacityको एनिमेट करना अक्सर स्मूथ होता है।- प्रकाश स्रोत को भूल जाना: एक आम गलती यह है कि पेज पर हर एलिमेंट पर बिल्कुल एक ही
box-shadow(जैसे,10px 10px ...) लागू कर देना, चाहे उसकी स्थिति कुछ भी हो। अच्छा डिज़ाइन एक सुसंगत, आभासी प्रकाश स्रोत का संकेत देता है, जो आमतौर पर ऊपर-बाईं ओर से होता है। इसका मतलब है कि शैडो आम तौर पर नीचे और दाईं ओर गिरनी चाहिए (offset-yपॉजिटिव है,offset-xपॉजिटिव या शून्य है)। असंगत शैडो एक UI को अराजक और अप्राकृतिक महसूस कराती हैं। - कोई शैडो न होना एक बुरी शैडो से बेहतर है: यदि आपके पास एक अच्छी, लेयर्ड शैडो बनाने का समय या टूल नहीं है, तो अलगाव बनाने के लिए अन्य तकनीकों (जैसे बॉर्डर्स या सूक्ष्म बैकग्राउंड रंग परिवर्तन) का उपयोग करना अक्सर बेहतर होता है। एक खराब तरीके से बनाई गई शैडो बिना किसी शैडो के डिज़ाइन को और भी सस्ता बना सकती है।
यह आपके रडार पर क्यों होना चाहिए
box-shadow को समझना फ्रंट-एंड कोड या डिज़ाइन को छूने वाले किसी भी व्यक्ति के लिए बेहद ज़रूरी है। यह आधुनिक, सहज इंटरफेस बनाने के लिए CSS शस्त्रागार में सबसे शक्तिशाली उपकरणों में سے एक है।
- यह पदानुक्रम (hierarchy) बनाता है: शैडो हमारे दिमाग को बताती हैं कि क्या महत्वपूर्ण है। अधिक प्रमुख शैडो वाला एलिमेंट हमारे "करीब" दिखाई देता है और इस प्रकार अधिक महत्वपूर्ण लगता है। यह एक जटिल UI के माध्यम से उपयोगकर्ता का ध्यान निर्देशित करने के लिए मौलिक है, पेज के ऊपर पॉप होने वाले मोडल डायलॉग से लेकर प्राथमिक कॉल-टू-एक्शन बटन तक।
- यह सीमाओं को نرمی से परिभाषित करता है:
box-shadowसे पहले, हम एलिमेंट्स को अलग करने के लिएborder: 1px solid grey;का उपयोग करते थे। शैडो हमें उसी अलगाव को बहुत नरम, अधिक जैविक तरीके से बनाने की अनुमति देती हैं। एक साइडबार और मुख्य सामग्री के बीच एक सूक्ष्म शैडो एक कठोर रेखा की तुलना में अधिक सुखद लगती है। - यह स्पर्शनीय (tactile) इंटरफेस बनाता है: अच्छी तरह से तैयार की गई शैडो, आउटसेट और इनसेट दोनों, एक डिजिटल इंटरफ़ेस को मूर्त महसूस करा सकती हैं। वे बटनों को क्लिक करने योग्य और इनपुट को भरने योग्य होने का एहसास देती हैं। यह सिर्फ सजावट नहीं है; यह उपयोगिता का एक कार्यात्मक हिस्सा है।
box-shadow में महारत हासिल करना - विशेष रूप से लेयरिंग और सूक्ष्मता की कला - एक स्पष्ट मार्कर है जो एक ऐसे डेवलपर के बीच का साफ़ अंतर है जो सिर्फ़ चीज़ों को चलाता है, और एक ऐसे डेवलपर के बीच जो चीज़ों को खूबसूरती से चलाता है।
और गहराई में जाएं
- MDN Web Docs:
box-shadow: दिन-प्रतिदिन के लिए अंतिम संदर्भ। इंटरैक्टिव उदाहरणों के साथ व्यापक। - W3C Spec: CSS Backgrounds and Borders Module Level 3: आधिकारिक विनिर्देश। यह सत्य का स्रोत है जिसे ब्राउज़र निर्माता लागू करते हैं। यह घना है, लेकिन नियम यहीं लिखे गए हैं।
- Designing Beautiful Shadows in CSS by Josh W. Comeau: एक शानदार, गहराई से लिखा गया लेख जो भव्य, यथार्थवादी, लेयर्ड शैडो बनाने की कला और विज्ञान में गोता लगाता है।
- Smashing Magazine: A New Way To Create “Glassmorphism”: एक उदाहरण कि कैसे
box-shadowको अन्य CSS गुणों (जैसेbackdrop-filter) के साथ मिलाकर जटिल, आधुनिक डिज़ाइन प्रभाव बनाए जा सकते हैं।