बॉक्स मॉडल

सीएसएस पॉडकास्ट - 001: द बॉक्स मॉडल

मान लें कि आपके पास थोड़ा-बहुत एचटीएमएल है:

<p>I am a paragraph of text that has a few words in it.</p>

फिर आप इसके लिए यह सीएसएस लिखें:

p {
  width: 100px;
  height: 50px;
  padding: 20px;
  border: 1px solid;
}

कॉन्टेंट, आपके तय किए गए 100 पिक्सल के बजाय 142 पिक्सल चौड़ा होता है और यह आपके एलिमेंट से अलग हो जाता है. ऐसा क्यों है?

बॉक्स मॉडल, सीएसएस का मुख्य आधार है. बॉक्स मॉडल के काम करने के तरीके, सीएसएस के दूसरे पहलुओं पर इस पर क्या असर पड़ता है, और इसे कैसे कंट्रोल किया जा सकता है, यह समझने से आपको सीएसएस का बेहतर अनुमान मिलता है.

सीएसएस के बॉक्स मॉडल को समझने से आपको यह पता लगाने में मदद मिलेगी कि आपका कॉन्टेंट किसी एलिमेंट के अंदर क्यों नहीं आता.

यह ध्यान रखना ज़रूरी है कि सीएसएस में दिखाया जाने वाला हर चीज़ एक बॉक्स होता है. भले ही, वह सिर्फ़ कुछ टेक्स्ट हो या border-radius हो, जो उसे गोल आकार में दिखाता हो.

कॉन्टेंट और साइज़ तय करना

बॉक्स की display वैल्यू, उनके सेट डाइमेंशन, और उनमें शामिल कॉन्टेंट के आधार पर अलग-अलग व्यवहार होता है. यह कॉन्टेंट सादा टेक्स्ट हो सकता है या चाइल्ड एलिमेंट से जनरेट हुए ज़्यादा बॉक्स हो सकते हैं. दोनों में से किसी भी तरह से, कॉन्टेंट से बॉक्स के साइज़ पर डिफ़ॉल्ट रूप से असर पड़ता है.

इसे बाहर रखने के लिए साइज़ का इस्तेमाल करके कंट्रोल किया जा सकता है. इसके अलावा, मूल साइज़ का इस्तेमाल किया जा सकता है, ताकि ब्राउज़र कॉन्टेंट के साइज़ के हिसाब से आपके लिए फ़ैसला ले सके.

यहां एक बुनियादी डेमो दिया गया है, जो दोनों में अंतर के बारे में बताता है:

अगर बॉक्स का साइज़ अलग होता है, तो उसके बाहर निकलने से पहले एक सीमा तय होती है कि कितने कॉन्टेंट जोड़े जा सकते हैं. इससे "बहुत बढ़िया" शब्द ओवरफ़्लो हो जाता है.

डेमो में तय डाइमेंशन और एक मोटे बॉर्डर वाले बॉक्स में "सीएसएस शानदार है" शब्द है. बॉक्स की चौड़ाई तय है, इसलिए इसका साइज़ बहुत बड़ा है. इसका मतलब है कि यह अपने चाइल्ड कॉन्टेंट के साइज़ को कंट्रोल करता है. हालांकि, बॉक्स के लिए "awesome" शब्द बहुत बड़ा है, इसलिए यह पैरंट बॉक्स के बॉर्डर बॉक्स के बाहर ओवरफ़्लो हो गया है (इस बारे में ज़्यादा जानकारी बाद में). इस ओवरफ़्लो को रोकने का एक तरीका यह है कि चौड़ाई को सेट न करके या इस मामले में, width को min-content पर सेट करके बॉक्स को असल साइज़ में रखें. min-content कीवर्ड, बॉक्स को कॉन्टेंट की कम से कम चौड़ाई (शब्द "बेहतरीन") जितना चौड़ा होगा. इससे बॉक्स, टेक्स्ट के चारों ओर पूरी तरह से फ़िट हो जाता है.

यहां एक मुश्किल उदाहरण दिया गया है. इसमें रीयल कॉन्टेंट पर अलग-अलग साइज़ों के असर को दिखाया गया है:

बाहरी साइज़ से ही एलिमेंट के साइज़ को कंट्रोल किया जा सकता है. मूल साइज़ का इस्तेमाल करने से टेक्स्ट ओवरफ़्लो नहीं होता है.

स्वाभाविक साइज़ों को चालू और बंद पर टॉगल करें और देखें कि बाहरी साइज़ से आपको ज़्यादा कंट्रोल कैसे मिलता है. बाहरी साइज़ और स्वाभाविक साइज़ से कॉन्टेंट को ज़्यादा कंट्रोल कैसे मिलता है. इफ़ेक्ट देखने के लिए, कार्ड में टेक्स्ट के कुछ वाक्य जोड़ें. अगर इस एलिमेंट का साइज़ बाहरी होता है, तो सीमा से ज़्यादा कॉन्टेंट जोड़ने से पहले, इसे जोड़ा जा सकता है. हालांकि, स्वाभाविक साइज़ से जुड़ी सेटिंग को टॉगल करने पर ऐसा नहीं होता.

डिफ़ॉल्ट रूप से, इस एलिमेंट में 400px के width और height सेट होते हैं. ये डाइमेंशन, एलिमेंट के अंदर की हर चीज़ के लिए सख्त सीमाएं तय करते हैं. इन डाइमेंशन का इस्तेमाल तब तक किया जाता है, जब तक कि बॉक्स के लिए कॉन्टेंट बहुत बड़ा न हो. इसे काम करते हुए देखा जा सकता है. इसके लिए, आपको फूल के नीचे मौजूद कैप्शन को बॉक्स की ऊंचाई से ज़्यादा तापमान में बदलना होगा.

मुख्य शब्द: ओवरफ़्लो तब होता है, जब कॉन्टेंट उस बॉक्स के हिसाब से बहुत बड़ा होता है जिसमें वह है. overflow प्रॉपर्टी का इस्तेमाल करके, यह मैनेज किया जा सकता है कि कोई एलिमेंट, ओवरफ़्लो कॉन्टेंट को कैसे मैनेज करता है.

स्वाभाविक आकार पर स्विच करने से ब्राउज़र बॉक्स के कॉन्टेंट के साइज़ के आधार पर आपके लिए फ़ैसले लेता है. इससे ओवरफ़्लो की संभावना बहुत कम हो जाती है, क्योंकि बॉक्स का आकार अपनी सामग्री के साथ बदल जाता है.

यह ध्यान रखना ज़रूरी है कि साइज़ तय करना, ब्राउज़र की डिफ़ॉल्ट सेटिंग होती है. साथ ही, यह आम तौर पर बाहरी साइज़ की तुलना में ज़्यादा विकल्प देता है.

बॉक्स मॉडल के हिस्से

बॉक्स अलग-अलग बॉक्स मॉडल क्षेत्रों से बने होते हैं जो सभी एक विशिष्ट काम करते हैं.

बॉक्स मॉडल की चार मुख्य जगहों को दिखाने वाला डायग्राम - कॉन्टेंट बॉक्स, पैडिंग बॉक्स, बॉर्डर बॉक्स, और मार्जिन बॉक्स
बॉक्स मॉडल के चार मुख्य हिस्से: कॉन्टेंट बॉक्स, पैडिंग बॉक्स, बॉर्डर बॉक्स, और मार्जिन बॉक्स.

कॉन्टेंट बॉक्स वह हिस्सा होता है जिसमें कॉन्टेंट मौजूद होता है. कॉन्टेंट, अपने पैरंट का साइज़ कंट्रोल कर सकता है. इसलिए, आम तौर पर यह सबसे बड़ा साइज़ होता है.

पैडिंग बॉक्स, कॉन्टेंट बॉक्स के चारों ओर होता है और padding प्रॉपर्टी से बनाई गई स्पेस होती है. पैडिंग (जगह) बॉक्स के अंदर होती है. इसलिए, बॉक्स के बनाए गए स्पेस में बॉक्स का बैकग्राउंड दिखता है. अगर बॉक्स पर overflow: auto या overflow: scroll जैसे ओवरफ़्लो नियम सेट हैं, तो स्क्रोलबार भी इस स्पेस में शामिल हो जाएंगे.

पैडिंग बॉक्स में स्क्रोल बार मौजूद होते हैं.

पैडिंग बॉक्स के चारों तरफ़ बॉर्डर बॉक्स होता है. इसमें स्पेस border की वैल्यू से तय होता है, जो एलिमेंट के लिए एक विज़ुअल फ़्रेम बनाता है. एलिमेंट का बॉर्डर का किनारा वह सीमा होती है जिसे आप देख सकते हैं.

आखिरी हिस्सा, मार्जिन बॉक्स आपके बॉक्स के आस-पास की जगह होती है, जिसे बॉक्स के margin नियम के तहत तय किया जाता है. outline और box-shadow जैसी प्रॉपर्टी भी इस जगह का हिस्सा बन जाती हैं. ऐसा इसलिए होता है, क्योंकि इन्हें एलिमेंट के सबसे ऊपर पेंट किया जाता है और इनसे बॉक्स के साइज़ पर कोई असर नहीं पड़ता. किसी बॉक्स पर अपने बॉक्स का 200px का outline-width बदलने से बॉर्डर के किनारे के अंदर कुछ भी नहीं बदलता.

चौड़ी आउटलाइन से, बाकी एलिमेंट के साइज़ पर कोई असर नहीं पड़ता.

एक उपयोगी तुलना

बॉक्स मॉडल को समझना मुश्किल है. इसलिए, आपने अब तक जो कुछ भी सीखा है उसकी तुलना यहां दी गई है.

तीन फ़ोटो फ़्रेम.
बॉक्स मॉडल में फ़िज़िकल फ़ोटो फ़्रेम का इस्तेमाल करके दिखाया गया है.

इस डायग्राम में, किसी दीवार पर एक-दूसरे के बगल में तीन फ़ोटो फ़्रेम लगाए गए हैं. फ़्रेम की गई इमेज के एलिमेंट, बॉक्स मॉडल के हिसाब से होते हैं:

  • कॉन्टेंट बॉक्स, आर्टवर्क होता है.
  • पैडिंग बॉक्स, फ़्रेम और आर्टवर्क के बीच में सफ़ेद माउंटिंग बोर्ड होता है.
  • बॉर्डर बॉक्स, आर्टवर्क के लिए एक लिटरल बॉर्डर देता है.
  • मार्जिन बॉक्स, फ़्रेम के बीच की खाली जगह होती है.
  • शैडो, मार्जिन बॉक्स के बराबर जगह लेती है.

बॉक्स के मॉडल को डीबग करना

ब्राउज़र DevTools, चुने गए बॉक्स के बॉक्स मॉडल का कैलकुलेशन दिखाता है. इससे आपको यह समझने में मदद मिल सकती है कि बॉक्स मॉडल कैसे काम करता है और यह उस वेबसाइट पर किस तरह असर डालता है जिस पर काम किया जा रहा है.

इसे अपने ब्राउज़र में आज़माएं:

  1. DevTools खोलें.
  2. कोई एलिमेंट चुनें.
  3. बॉक्स मॉडल डीबगर दिखाएं.
आउटलाइन डेमो के लिए, बॉक्स मॉडल डीबगर.

बॉक्स मॉडल को कंट्रोल करें

बॉक्स मॉडल को कंट्रोल करने का तरीका जानने के लिए, आपको सबसे पहले यह समझना होगा कि आपके ब्राउज़र में क्या होता है.

हर ब्राउज़र, एचटीएमएल दस्तावेज़ों पर एक उपयोगकर्ता एजेंट स्टाइल शीट लागू करता है. इससे पता चलता है कि अगर एलिमेंट में कोई तय सीएसएस नहीं है, तो उन्हें कैसा दिखना चाहिए और काम करना चाहिए. हर ब्राउज़र के लिए उपयोगकर्ता एजेंट स्टाइल शीट में मौजूद सीएसएस अलग-अलग होती हैं. हालांकि, वे कॉन्टेंट को डिफ़ॉल्ट रूप से पढ़ने लायक बनाती हैं, ताकि पढ़ने में आसानी हो.

उपयोगकर्ता एजेंट स्टाइल शीट की एक प्रॉपर्टी, बॉक्स का डिफ़ॉल्ट display सेट करती है. उदाहरण के लिए, सामान्य फ़्लो में, <div> एलिमेंट की डिफ़ॉल्ट display वैल्यू block, <li> की डिफ़ॉल्ट display वैल्यू, list-item, और <span> की डिफ़ॉल्ट display वैल्यू inline होती है.

inline एलिमेंट में ब्लॉक मार्जिन है, लेकिन दूसरे एलिमेंट इस पर ध्यान नहीं देते. inline-block के साथ, अन्य एलिमेंट ब्लॉक मार्जिन का पालन करते हैं, लेकिन पहला एलिमेंट ज़्यादातर वही व्यवहार रखता है जो inline एलिमेंट में था. block आइटम में डिफ़ॉल्ट रूप से, उपलब्ध इनलाइन स्पेस को भरा जाता है, जबकि inline और inline-block एलिमेंट का साइज़ सिर्फ़ उनके कॉन्टेंट जितना ही होता है.

उपयोगकर्ता एजेंट स्टाइल शीट में box-sizing भी सेट होता है, जो बॉक्स को उसके बॉक्स साइज़ का कैलकुलेशन करने का तरीका बताता है. डिफ़ॉल्ट रूप से, सभी एलिमेंट में यह उपयोगकर्ता एजेंट शैली होती है: box-sizing: content-box;. इसका मतलब है कि जब width और height जैसे डाइमेंशन सेट किए जाते हैं, तो वे डाइमेंशन कॉन्टेंट बॉक्स पर लागू होते हैं. अगर आपने padding और border को सेट किया, तो ये वैल्यू कॉन्टेंट बॉक्स के साइज़ में जोड़ दी जाती हैं.

जांचें कि आपको कितना समझ आया

प्रॉपर्टी पर असर डालने वाले बॉक्स मॉडल साइज़ के बारे में अपनी जानकारी को परखें.

.my-box {
  width: 200px;
  border: 10px solid;
  padding: 20px;
}

आपके हिसाब से .my-box की चौड़ाई कितनी होगी?

200 पिक्सल
बॉक्स का साइज़ तय करने की डिफ़ॉल्ट वैल्यू, कॉन्टेंट बॉक्स होती है. इसलिए, चौड़ाई में पैडिंग और बॉर्डर को जोड़ दिया जाता है. अगर बॉक्स में box-sizing: border-box हो, तो 200px सही होगा.
260 पिक्सल
बॉक्स का साइज़ डिफ़ॉल्ट तौर पर कॉन्टेंट-बॉक्स होता है. इसका मतलब है कि पूरे बॉक्स में पैडिंग (जगह) और बॉर्डर जोड़ दिए जाते हैं.

इस बॉक्स की असल चौड़ाई 260 पिक्सल है. सीएसएस, डिफ़ॉल्ट box-sizing: content-box का इस्तेमाल करती है, इसलिए लागू की गई चौड़ाई, कॉन्टेंट की चौड़ाई होती है. साथ ही, उसके दोनों तरफ़ padding और border जोड़ दिए जाते हैं. कॉन्टेंट का साइज़ 200 पिक्सल और पैडिंग (जगह) 40 पिक्सल और बॉर्डर 20 पिक्सल की मदद से दिखने वाली कुल चौड़ाई 260 पिक्सल होती है.

border-box का साइज़ तय करके इसे बदला जा सकता है:

.my-box {
  box-sizing: border-box;
    width: 200px;
    border: 10px solid;
    padding: 20px;
}

बॉक्स के इस वैकल्पिक मॉडल में, सीएसएस को कॉन्टेंट बॉक्स के बजाय बॉर्डर बॉक्स पर width लागू करने के लिए कहा जाता है. इसका मतलब है कि हमारे border और padding को पुश इन किया जाता है. इसलिए, जब आप .my-box को 200px वाइड के लिए सेट करते हैं, तो यह असल में 200px की चौड़ाई में रेंडर होता है.

नीचे दिए गए इंटरैक्टिव डेमो में जानें कि यह सुविधा कैसे काम करती है. box-sizing वैल्यू को टॉगल करने पर, नीले रंग के हिस्से से पता चलता है कि बॉक्स के अंदर कौनसा सीएसएस लागू किया जा रहा है.

कॉन्टेंट-बॉक्स और बॉर्डर-बॉक्स साइज़िंग के असर की तुलना करें.
*,
*::before,
*::after {
  box-sizing: border-box;
}

यह सीएसएस नियम, दस्तावेज़ के हर एलिमेंट और हर ::before और ::after स्यूडो एलिमेंट को चुनता है और box-sizing: border-box लागू करता है. इसका मतलब है कि अब हर एलिमेंट, वैकल्पिक बॉक्स मॉडल का इस्तेमाल करता है.

वैकल्पिक बॉक्स मॉडल का ज़्यादा अनुमान लगाया जा सकता है, इसलिए डेवलपर अक्सर इस नियम को रीसेट और नॉर्मलाइज़र पर जोड़ते हैं, जैसे कि यह.

रिसॉर्स

उपयोगकर्ता एजेंट की स्टाइलशीट