एक लाइन में
CSS यूनिट्स वो भाषा है जिससे हम ब्राउज़र को बताते हैं कि वेबपेज पर चीज़ों को कितना बड़ा या छोटा बनाना है, और यह तय करते हैं कि साइज़ पत्थर की तरह फिक्स होगा या पानी की तरह फ्लेक्सिबल।
ये क्या प्रॉब्लम सॉल्व करता है
वेब के डायल-अप वाले शुरुआती दिनों में, ज़िंदगी बहुत आसान थी। डेवलपर्स एक ही शानदार स्क्रीन रिज़ॉल्यूशन के लिए वेबसाइट डिज़ाइन करते थे—शायद 800x600, या अगर आप बहुत आगे थे तो 1024x768। इस युग का निर्विवाद राजा पिक्सेल (px) था। यह ब्रह्मांड के साथ एक समझौता था: आपके कोड में एक px स्क्रीन पर रोशनी का एक पिक्सेल था। लेआउट उम्मीद के मुताबिक होते थे, भले ही वे नाजुक हों।
फिर आया डिवाइसेस का कैम्ब्रियन विस्फोट। iPhone. Android. टैबलेट्स। पतले बेज़ल वाले लैपटॉप। विशाल 4K मॉनिटर। स्मार्टवॉच। अचानक, वह 960px-चौड़ी वेबसाइट एक विशाल स्क्रीन पर डाक टिकट जैसी दिखने लगी और एक फोन पर एक न चलाया जा सकने वाला, हॉरिजॉन्टली-स्क्रॉलिंग दुःस्वप्न बन गई। पिक्सेल के निश्चितता के शासन का अंत हो गया था। राज्य में अराजकता थी।
इसी अराजकता ने "रिस्पॉन्सिव वेब डिज़ाइन" को जन्म दिया, यह विचार कि एक वेबसाइट को किसी भी स्क्रीन पर ग्रेसफुली अपनाना चाहिए। इसे हासिल करने के लिए, हमें साइज़ की एक नई शब्दावली की ज़रूरत थी—जो एब्सोल्यूट, फिक्स्ड मापों के बारे में नहीं, बल्कि रिश्तों के बारे में थी।
CSS यूनिट्स इसी समस्या का समाधान करती हैं। वे रिलेटिव यूनिट्स (rem, em, %, vw, vh) का एक समृद्ध टूलकिट प्रदान करते हैं जो हमें लचीले, स्केलेबल और वास्तव में रिस्पॉन्सिव इंटरफेस बनाने देते हैं। एक बॉक्स को "500 पिक्सेल चौड़ा हो" कहने के बजाय, अब हम कह सकते हैं "अपने पैरेंट की चौड़ाई का 80% बनो," या "अपने टेक्स्ट का आकार उपयोगकर्ता के पसंदीदा बेस फ़ॉन्ट आकार का 1.5 गुना होने दो।" यह कठोर आदेश देने से हटकर इंटेलिजेंट नियम सेट करने जैसा है।
अंदर की कहानी
इसे सच में समझने के लिए, आपको यूनिट्स को कुछ वैचारिक खेमों में बाँटना होगा। यह सब इस बारे में है कि प्रत्येक यूनिट अपने 'सोर्स ऑफ ट्रुथ' (Source of Truth) के रूप में क्या उपयोग करती है।
एब्सोल्यूट यूनिट्स: अटल शासक
ये यूनिट्स फिक्स्ड होती हैं। इन्हें पैरेंट एलिमेंट, स्क्रीन साइज, या किसी और चीज की परवाह नहीं होती। वे जो हैं, वही हैं।
px(Pixel): जिसे आप जानते हैं और पसंद करते हैं। लेकिन यहाँ एक ट्विस्ट है: एक CSSpxअब एक फिजिकल हार्डवेयर पिक्सेल नहीं है! हाई-रिज़ॉल्यूशन स्क्रीन (जैसे Apple के रेटिना डिस्प्ले) एक "CSS पिक्सेल" की जगह में कई फिजिकल पिक्सेल पैक करते हैं। स्पेसिफिकेशन 1px को एक इंच का 1/96 वां हिस्सा बताता है। यह एब्स्ट्रैक्शन एक1pxबॉर्डर को अलग-अलग पिक्सेल डेंसिटी वाले डिवाइसेस पर लगभग एक जैसी मोटाई का दिखने देता है। यह उन चीजों के लिए सबसे आम यूनिट है जिन्हें आप फिक्स रखना चाहते हैं, जैसेborder-widthया बॉक्स-शैडो ऑफ़सेट।pt(Point): प्रिंट की दुनिया का एक भूत। टाइपोग्राफी में, 1 पॉइंट एक इंच का 1/72 वां हिस्सा होता है। इसका उपयोग स्क्रीन स्टाइलिंग के लिए लगभग कभी नहीं किया जाता है क्योंकि यह पिक्सेल ग्रिड के साथ अलाइन नहीं होता है, लेकिन आप इसे किसी वेबपेज को प्रिंट करने के लिए विशेष रूप से बनाई गई स्टाइलशीट में देख सकते हैं।
फ़ॉन्ट-रिलेटिव यूनिट्स: टेक्स्ट के साथ स्केल होना
ये यूनिट्स स्केलेबल UI बनाने के लिए शानदार हैं जहां स्पेसिंग और एलिमेंट के आकार टेक्स्ट आकार के साथ बढ़ते या घटते हैं।
em: यह अपने सीधे पैरेंट एलिमेंट केfont-sizeके रिलेटिव होता है। यह इसकी ताकत और इसका खतरा दोनों है। अगर एक<div>काfont-size20pxहै, तो उस div के अंदर,padding: 1.5emका मतलब30pxहोगा। लेकिन अगर आप उसके अंदरfont-size: 0.8emके साथ एक और एलिमेंट नेस्ट करते हैं, तो आपको कंपाउंडिंग प्रभाव मिलता है।<div style="font-size: 20px;"> <!-- font-size is 20px --> <p style="padding: 1.5em;"> <!-- padding is 1.5 * 20px = 30px --> <strong style="font-size: 1.2em;"> <!-- font-size is 1.2 * 20px = 24px --> </strong> </p> </div>यह नेस्टिंग जल्दी ही गणितीय पागलपन की ओर ले जा सकती है।
rem(Root Em): वो हीरो जिसकी हमें ज़रूरत थी।remयूनिट केवल रूट एलिमेंट (<html>टैग) केfont-sizeके रिलेटिव होती है। यहemकी कंपाउंडिंग समस्या को खत्म कर देती है। अधिकांश ब्राउज़रों में डिफ़ॉल्टfont-size16pxहोता है, इसलिए डिफ़ॉल्ट रूप से,1remपेज पर हर जगह16pxके बराबर होता है। अगर कोई उपयोगकर्ता एक्सेसिबिलिटी के लिए अपने ब्राउज़र का डिफ़ॉल्ट फ़ॉन्ट आकार बदलता है, तो आपका पूराremआधारित लेआउट उसके साथ स्केल हो जाता है, जो एक बहुत बड़ी जीत है। इसी कारण से,remटाइपोग्राफी, पैडिंग, मार्जिन और अधिकांश लेआउट कंपोनेंट्स को साइज़ देने के लिए मॉडर्न स्टैंडर्ड है।
व्यूपोर्ट-रिलेटिव यूनिट्स: विंडो के हिसाब से साइज़िंग
ये यूनिट्स सीधे ब्राउज़र विंडो ("व्यूपोर्ट") के आकार से जुड़ी होती हैं।
vw(Viewport Width) &vh(Viewport Height): एकvwव्यूपोर्ट की चौड़ाई का 1% होता है; एकvhइसकी ऊंचाई का 1% होता है।width: 50vwका मतलब है "इस एलिमेंट को ब्राउज़र विंडो की आधी चौड़ाई का बनाओ।" इसका सबसे क्लासिक उपयोगheight: 100vhहै, जो एक "हीरो" सेक्शन बनाता है जो स्क्रीन को वर्टिकली पूरी तरह से भर देता है।%(Percentage): ओरिजिनल रिलेटिव यूनिट। यह हमेशा अपने पैरेंट एलिमेंट की किसी प्रॉपर्टी के रिलेटिव होती है।width: 50%का मतलब है पैरेंट कंटेनर की आधी चौड़ाई।font-size: 120%प्रभावी रूप सेfont-size: 1.2emके समान है। इसका व्यवहार कॉन्टेक्स्ट पर निर्भर करता है, जो इसे शक्तिशाली बनाता है लेकिन आपको पैरेंट का ध्यान रखने की आवश्यकता होती है।
clamp() का जादू: फ्लूइड साइज़िंग
यहीं पर सब कुछ एक साथ आता है। clamp() एक CSS फ़ंक्शन है जो आपको एक ऐसा आकार परिभाषित करने देता है जो बढ़ता है लेकिन न्यूनतम और अधिकतम मान के बीच सीमित रहता है।
इसका सिंटैक्स clamp(MIN, PREFERRED, MAX) है।
MIN: एब्सोल्यूट न्यूनतम मान। यह इससे कभी छोटा नहीं होगा।PREFERRED: आदर्श, स्केलेबल मान। यह वह जगह है जहाँ आप आमतौर पर एक व्यूपोर्ट यूनिट का उपयोग करते हैं, जैसे2vw, जिसे अक्सरremयूनिट के साथ जोड़ा जाता है (उदाहरण के लिए,1rem + 2vw)।MAX: एब्सोल्यूट अधिकतम मान। यह इससे कभी बड़ा नहीं होगा।
आइए फ्लूइड टाइपोग्राफी के लिए एक एकदम धांसू उदाहरण देखें:
font-size: clamp(1rem, 1rem + 2vw, 2.25rem);
यह एक अकेली लाइन ब्राउज़र को बताती है:
- "मुझे फ़ॉन्ट का आकार
1rem + 2vwचाहिए।" - "लेकिन, अगर
1rem + 2vwकी गणना1remसे कम होती है (एक छोटी स्क्रीन पर), तो बस1remका उपयोग करें।" - "और अगर
1rem + 2vwकी गणना2.25remसे अधिक होती है (एक विशाल स्क्रीन पर), तो बस2.25remका उपयोग करें।"
आपको पूरी तरह से फ्लूइड टेक्स्ट मिलता है जो स्क्रीन के आकार के साथ स्केल होता है लेकिन कभी भी इतना छोटा नहीं होता कि पढ़ा न जा सके या इतना बड़ा नहीं होता कि हास्यास्पद लगे, और यह सब बिना किसी मीडिया क्वेरी के।
रियल-वर्ल्ड किस्से
कंपाउंडिंग em कैस्केड की तबाही
एक जूनियर डेवलपर को एक नेस्टेड कमेंट थ्रेड बनाने का काम दिया गया था। एक अच्छा, मॉडर्न डेवलपर बनना चाहते हुए, उसने रिलेटिव यूनिट्स का इस्तेमाल किया। उसने हर कमेंट को font-size: .9em और padding: 1em के साथ स्टाइल किया ताकि रिप्लाई थोड़े छोटे हों और फिर भी प्रोपोर्शनल पैडिंग हो। पहला रिप्लाई बहुत अच्छा लग रहा था। लेकिन रिप्लाई-का-रिप्लाई बहुत छोटा था। नेस्टिंग का चौथा लेवल तो बस माइक्रोस्कोपिक टेक्स्ट का एक धुंधला धब्बा था। उसे em यूनिट के कंपाउंडिंग नेचर ने डस लिया था। प्रत्येक लेवल पैरेंट के आकार को 0.9 से गुणा कर रहा था, जिससे एक एक्सपोनेंशियल श्रिंक-रे प्रभाव पैदा हो रहा था।
सबक: em कैस्केड होता है। साइट-वाइड कंसिस्टेंसी के लिए जहाँ आप कंपाउंडिंग नहीं चाहते, rem आपका भरोसेमंद, स्थिर सबसे अच्छा दोस्त है।
वो 'फुल-हाइट' हीरो जो था ही नहीं
एक डिज़ाइनर ने होमपेज के टॉप के लिए एक फुल-स्क्रीन बैकग्राउंड इमेज के साथ एक सुंदर मॉकअप दिया। "इसे स्क्रीन पर पूरा भर दो, चाहे डिवाइस कोई भी हो," वे कहते हैं। डेवलपर, तार्किक रूप से सोचते हुए, हीरो सेक्शन पर height: 100% लगाता है। सेक्शन गायब हो जाता है। वह अविश्वास में घूरता है। एक उन्मत्त डिबगिंग सेशन के बाद, उसे पता चलता है कि height: 100% का मतलब पैरेंट की ऊंचाई का 100% है। लेकिन पैरेंट <body> एलिमेंट की कोई परिभाषित ऊंचाई नहीं थी—उसकी ऊंचाई उसके कंटेंट से निर्धारित होती थी। "ऑटो" का 100% कुछ भी नहीं है। उसने स्टाइल को height: 100vh में बदल दिया। अचानक, जादू हो गया। हीरो सेक्शन उसके लैपटॉप, उसके फोन, और उसके विशाल मॉनिटर पर व्यूपोर्ट के नीचे तक पूरी तरह से स्नैप हो गया।
सबक: प्रतिशत ऊंचाई के लिए एक परिभाषित ऊंचाई वाले पैरेंट की आवश्यकता होती है। व्यूपोर्ट यूनिट्स (vh और vw) उपयोगकर्ता की स्क्रीन डाइमेंशन्स के लिए आपकी सीधी, स्पष्ट रेखा हैं।
परफेक्टली फ्लूइड टेक्स्ट की खोज
एक टीम एक हाई-इम्पैक्ट लैंडिंग पेज बना रही थी। मुख्य हेडलाइन को डेस्कटॉप पर बड़ा लेकिन मोबाइल पर मैनेजेबल होना चाहिए था। उनका पहला दृष्टिकोण मीडिया क्वेरी का उपयोग करना था: डेस्कटॉप के लिए font-size: 80px, टैबलेट के लिए 60px, और मोबाइल के लिए 40px। यह काम कर रहा था, लेकिन यह अजीब लग रहा था। जैसे ही आप ब्राउज़र विंडो का आकार बदलते, टेक्स्ट ब्रेकपॉइंट्स पर अचानक एक आकार से दूसरे में "पॉप" हो जाता था। इसमें élégance की कमी थी। फिर, एक डेवलपर ने clamp() की खोज की। उन्होंने तीन मीडिया क्वेरी और तीन CSS नियमों को एक ही लाइन से बदल दिया: font-size: clamp(2.5rem, 8vw, 5rem);। परिणाम लुभावनी था। टेक्स्ट अब विंडो के आकार बदलने के साथ मक्खन की तरह स्मूथली स्केल हो रहा था, एक निरंतर, फ्लूइड मोशन में बढ़ और घट रहा था।
सबक: मीडिया क्वेरी लेआउट बदलने के लिए हैं, लेकिन clamp() वास्तव में फ्लूइड प्रॉपर्टीज बनाने के लिए है। यह एक स्मूथ, अधिक परिष्कृत उपयोगकर्ता अनुभव प्रदान करता है जो ब्रेकपॉइंट-आधारित साइज़िंग की तुलना में कम "चंकी" महसूस होता है।
आम गलतियाँ और जाल
remके बेस को भूल जाना: अपने सभी साइज़remयूनिट्स में सेट करना बिना यह जाने कि रूटfont-sizeक्या है। एक आम ट्रिकhtml { font-size: 62.5%; }सेट करना है ताकि1remएक सुविधाजनक10pxके बराबर हो जाए। अगर आपको नहीं पता कि ऐसा हो रहा है, तो आपका2remएलिमेंट20pxका होगा, न कि32pxका जैसा आप उम्मीद कर सकते हैं।emबनामremका कन्फ्यूजन: किसी कंपोनेंट की पैडिंग के लिएemका उपयोग करना जब आप चाहते हैं कि यह ग्लोबल UI के साथ स्केल हो (remबेहतर होगा), याremका उपयोग करना जब आप स्पष्ट रूप से चाहते हैं कि किसी आइकन का आकार उस बटन केfont-sizeके साथ स्केल हो जिसके अंदर वह है (emबेहतर होगा)।vwयूनिट्स और स्क्रॉलबार: एक टॉप-लेवल एलिमेंट परwidth: 100vwलागू करना एक क्लासिक भूल है।100vwमाप में वर्टिकल स्क्रॉलबार की चौड़ाई शामिल हो सकती है, जिससे आपका एलिमेंट कंटेंट क्षेत्र से थोड़ा चौड़ा हो जाता है और एक परेशान करने वाला हॉरिजॉन्टल स्क्रॉलबार ट्रिगर हो जाता है।- सिर्फ पिक्सेल का कट्टरवाद:
font-sizeसहित हर चीज के लिए धार्मिक रूप सेpxसे चिपके रहना। यह कठोर डिज़ाइन बनाता है जो उपयोगकर्ता की एक्सेसिबिलिटी प्राथमिकताओं (जैसे एक बड़ा डिफ़ॉल्ट फ़ॉन्ट आकार) को अनदेखा करता है और विभिन्न डिवाइसेस पर अच्छी तरह से अनुकूल नहीं होता है। - अति-उत्साही
vh: मोबाइल डिवाइस परheight: 100vhका उपयोग करना मुश्किल हो सकता है। जब ब्राउज़र UI (जैसे एड्रेस बार) स्क्रॉल करने पर दिखाई देता है या गायब हो जाता है, तो1vhका मान बदल जाता है, जिससे लेआउट जंप करने लगता है। इसनेdvh(डायनेमिक व्यूपोर्ट हाइट) जैसी नई, अधिक स्थिर यूनिट्स को जन्म दिया है।
इसे जानना आपके लिए क्यों ज़रूरी है
अगर आप CSS को छूते हैं, तो आप यूनिट्स से बच नहीं सकते। वे सिलेक्टर्स और प्रॉपर्टीज की तरह ही मौलिक हैं। कौन सी यूनिट का उपयोग करना है, इसके बारे में सोचना हर बार जब आप कोई साइज़ वैल्यू लिखते हैं तो एक स्वचालित प्रक्रिया होनी चाहिए।
सही यूनिट चुनना मॉडर्न वेब डेवलपमेंट की नींव है।
- यह एक्सेसिबिलिटी के लिए आवश्यक है:
remका उपयोग करने से उपयोगकर्ता इंटरफ़ेस को अपनी आवश्यकताओं के अनुसार स्केल कर सकते हैं। - यह रिस्पॉन्सिवनेस का मूल है:
vw,vh, और%का उपयोग करने से लेआउट विभिन्न स्क्रीन पर अनुकूलित हो सकते हैं। - यह फ्लूइड डिज़ाइन की कुंजी है:
clamp()का उपयोग उन स्मूथ, प्रीमियम-फीलिंग अनुभवों को बनाता है जो समकालीन वेबसाइटों को परिभाषित करते हैं।
CSS यूनिट्स में महारत हासिल करना ही एक डेवलपर को उस व्यक्ति से ऊपर उठाता है जो सिर्फ स्टाइल कॉपी-पेस्ट कर सकता है, उस व्यक्ति तक जो एक मजबूत, लचीला और उपयोगकर्ता-केंद्रित इंटरफ़ेस बना सकता है जो हर किसी के लिए, किसी भी डिवाइस पर काम करता है।
और गहराई में जाएँ
- MDN Web Docs: CSS Values and Units — सबसे बेस्ट और प्रैक्टिकल रेफरेंस।
- W3C Specification: CSS Values and Units Module Level 4 — मानक निकाय से सत्य का आधिकारिक स्रोत।
- MDN Web Docs: clamp() —
clamp()फ़ंक्शन का विस्तृत विवरण। - Smashing Magazine: Fun with Viewport Units —
vwऔरvhके रचनात्मक और व्यावहारिक उपयोग। - A Complete Guide to Fluid Typography by CSS-Tricks —
clamp()के विकास को कवर करने वाला एक उत्कृष्ट लेख। - The Surprising Truth About Pixels and Accessibility —
pxबनामremबहस पर एक शानदार गहरा गोता।