CSS Block Formatting Context कैसे काम करता है?


80

CSS Block Formatting Context कैसे काम करता है ?

CSS2.1 विनिर्देशों का कहना है कि ब्लॉक प्रारूपण संदर्भ में, शीर्ष पर शुरू करके, बक्से को लंबवत रूप से रखा गया है। यह तब भी होता है जब रास्ते में फ्लोटेड तत्व होते हैं, सिवाय इसके कि ब्लॉक बॉक्स ने एक नया ब्लॉक फॉर्मेटिंग संदर्भ स्थापित किया हो। जैसा कि हम जानते हैं, जब ब्राउज़र ब्लॉक फॉर्मेटिंग संदर्भ में ब्लॉक बॉक्स को प्रस्तुत करते हैं, तो फ्लोटेड तत्व छोड़ दिया जाता है, एक नया ब्लॉक फॉर्मेटिंग संदर्भ कार्य क्यों स्थापित करता है?

सामान्य प्रवाह में बक्से (ब्लॉक बॉक्स और इनलाइन बॉक्स) कैसे होते हैं?

मैंने कहीं पढ़ा है कि ब्लॉक एलिमेंट्स ब्लॉक बॉक्स जेनरेट करते हैं, लेकिन फ्लोटिंग तत्वों को नजरअंदाज कर दिया जाता है जब एक यूजर एजेंट बॉक्स को ड्रॉ करता है और कंटेंट भरने पर उन्हें ध्यान में रखता है। जब भी तैरते हुए तत्व अन्य तत्वों के बक्सों की सीमा को ओवरलैप करेंगे, तो समाधान का उपयोग करके ओवरलैप किए गए तत्वों के लिए एक नया ब्लॉक स्वरूपण संदर्भ स्थापित कर रहा है overflow:hidden

"नया ब्लॉक स्वरूपण संदर्भ अभी भी ब्लॉक प्रारूपण है", इसलिए जब एक बॉक्स को खींचते हैं, तो यह फ्लोटिंग तत्व का भी इलाज करेगा जैसे कि यह बाहर नहीं निकलता है। क्या यह सही है या मुझे गलत लगा है "नया ब्लॉक प्रारूपण संदर्भ?"

अपडेट: अधिक प्रश्न

"यह ऐसा व्यवहार है जो स्तंभ शैली लेआउट के लिए उपयोगी है। हालांकि इसका मुख्य उपयोग फ़्लोट्स को रोकने के लिए है," मुख्य सामग्री "div में कहें, वास्तव में फ़्लोट किए गए साइड कॉलम, यानी फ़्लोट्स जो स्रोत कोड में पहले दिखाई देते हैं।"

मुझे इसका मतलब समझ नहीं आ रहा है, मैं एक उदाहरण दूंगा, शायद आप मुझे समझ जाएंगे।

मुझे लगा कि फ्लोटिंग बॉक्स कॉन्टेगिंग ब्लॉक के शीर्ष पर तैरना चाहिए-क्लास के साथ डिव content। इसके अलावा, यदि फ्लोटिंग बॉक्स पहले मार्कअप में दिखाई देता है, तो यह प्रदर्शित करेगा कि मुझे क्या लगता है कि यह होना चाहिए।

हम इसे कैसे समझा सकते हैं? क्या हम इसे समझाने के लिए "स्वरूपण संदर्भ और इनलाइन स्वरूपण संदर्भ" का उपयोग कर सकते हैं?


क्या आप दस्तावेज़ में एक छवि जोड़ सकते हैं जिसे आप नहीं समझते हैं?
mrk

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

जवाबों:


126

ब्लॉक प्रारूपण संदर्भ

फ्लोट्स, बिल्कुल तैनात तत्व, ब्लॉक कंटेनर (जैसे इनलाइन-ब्लॉक, टेबल-सेल, और टेबल-कैप्शन) जो ब्लॉक बॉक्स नहीं हैं, और 'दिखाई' के अलावा 'अतिप्रवाह' वाले ब्लॉक बॉक्स को छोड़कर (उस मूल्य को प्रचारित किए जाने के अलावा) व्यूपोर्ट के लिए) अपनी सामग्री के लिए नए ब्लॉक फॉर्मेटिंग संदर्भों को स्थापित करें

मेरी बोल्ड के साथ, यह है की स्थापना सा है कि महत्वपूर्ण है

इसका मतलब यह है कि आप जिस तत्व का उपयोग करते हैं overflow(दृश्य के अलावा कुछ भी) floatया inline-block..etc उसके बाल तत्वों के लेआउट के लिए जिम्मेदार हो जाता है। यह बाल तत्व हैं जो तब "समाहित" होते हैं, चाहे वह तैरता हो या हाशिए का ढहना हो, जिसे वे अपने बाउंडिंग माता-पिता द्वारा पूरी तरह से निहित होना चाहिए।

ब्लॉक फॉर्मेटिंग संदर्भ में, प्रत्येक बॉक्स का बायाँ बाहरी किनारा युक्त ब्लॉक के बाएँ किनारे को स्पर्श करता है (दाएं-से-बाएँ स्वरूपण के लिए, दाएं किनारों को स्पर्श करता है)

उपरोक्त पंक्ति का क्या अर्थ है:

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


फ्लोट क्लीयरेंस

सामान्य परिस्थितियों में फ़्लोट्स को पिछले सभी फ़्लोट किए गए तत्वों को साफ़ करने के लिए माना जाता है, जो कि पहले पूरे स्रोत कोड में फ़्लोट किया गया है, न कि केवल आपके प्रदर्शित "कॉलम" में "फ्लोट क्लीयरेंस स्पेक्स" से बोली का अर्थ है

यह गुण इंगित करता है कि तत्व के बॉक्स के कौन से हिस्से (तों) पहले चल रहे बॉक्स से सटे नहीं हो सकते हैं। 'स्पष्ट' संपत्ति तत्व के अंदर या अन्य ब्लॉक प्रारूपण संदर्भों में तैरने पर विचार नहीं करती है

तो मान लें कि आपके पास एक तीन कॉलम लेआउट है जहाँ बाएँ और दाएँ कॉलम क्रमशः बाएँ और दाएँ फ़्लोट किए जाते हैं, साइड कॉलम अब नए ब्लॉक फ़ॉर्मेटिंग कॉन्टेक्ट्स में हैं, क्योंकि वे फ़्लोट किए गए हैं (याद रखें कि फ्लोट भी उन गुणों में से एक है जो एक नया बीएफसी स्थापित करते हैं। ), इसलिए आप खुशी से उनके अंदर सूची तत्वों को तैर ​​सकते हैं और वे केवल स्पष्ट तैरते हैं जो पहले से ही साइड कॉलम के अंदर हैं, जो अब स्रोत कोड में पहले तैरने के बारे में परवाह नहीं करते हैं


मुख्य सामग्री को एक नया ब्लॉक स्वरूपण संदर्भ बनाने के लिए या नहीं?

अब वह मध्य स्तंभ, आप बस इसे दोनों तरफ से मार्जिन कर सकते हैं, ताकि यह दो तरफ तैरते हुए स्तंभों के बीच बड़े करीने से बैठे और शेष चौड़ाई को ले जाए, वांछित चौड़ाई प्राप्त करने का एक सामान्य तरीका है यदि केंद्र स्तंभ "द्रव" है - जो होगा तब तक ठीक रहें जब तक आपको अपनी सामग्री div के अंदर फ़्लोट्स / निकासी का उपयोग करने की आवश्यकता न हो (उनके लिए "क्लीयरफ़िक्स" हैक्स या टेम्पलेट का उपयोग करने वालों के लिए एक सामान्य घटना)

इसे बहुत ही सरल कोड लें:

यह निम्नलिखित उत्पादन करता है:

यहाँ छवि विवरण दर्ज करें

सामान्य तौर पर यह ठीक है, खासकर यदि आप कोई पृष्ठभूमि रंग या आंतरिक (मुख्य सामग्री में) तैरता - नोटिस तैरता ठीक (अभी तक साफ नहीं) वे करने के लिए उन्हें छोड़कर क्या आप शायद कर रहे हैं लेकिन वे, H3के शीर्ष मार्जिन और pनीचे का मार्जिन वास्तव में सामग्री div (lightgrey पृष्ठभूमि) द्वारा निहित नहीं है।

उपरोक्त कोड जोड़ने के समान सरल मार्जिन वाले परिदृश्य के लिए:

.clear-r {clear: right;}

CSS के लिए, और दूसरा HTML फ्लोट किए गए बॉक्स को इसमें बदलें:

<div class="floated clear-r"> this a floated cleared box</div>

इस बार आपको यह मिलेगा:

यहाँ छवि विवरण दर्ज करें

दूसरा फ्लोट दाहिने हिस्से को साफ कर रहा है लेकिन यह दाहिने कॉलम की पूरी ऊंचाई को साफ कर रहा है। सही कॉलम स्रोत कोड में पहले फ्लोट किया गया है, इसलिए इसे बताए अनुसार साफ़ कर रहा है! शायद वांछित प्रभाव नहीं है, हालांकि, यह भी ध्यान दें h3और pमार्जिन अभी भी ढह गए हैं (निहित नहीं हैं)।


बच्चों की खातिर इसे एक ब्लॉक फॉर्मेटिंग संदर्भ स्थापित करें!

और अंत में मुख्य सामग्री कॉलम को ज़िम्मेदारी दें - अपनी सामग्री के लिए - एक ब्लॉक स्वरूपण संदर्भ बनें - margin: 0 200px;मुख्य सामग्री CSS और ADD से निकालें overflow: hidden;और आप इसे प्राप्त करें:

यहाँ छवि विवरण दर्ज करें

यह संभवतः बहुत अधिक है जैसे आप क्या होने की उम्मीद करेंगे, ध्यान दें कि अब फ़्लैट्स निहित हैं, वे सही साइड कॉलम को अनदेखा करना ठीक से स्पष्ट करते हैं, h3और pहाशिये के बजाय मार्जिन भी निहित हैं।

इन दिनों रीसेट के व्यापक उपयोग के साथ मार्जिन कम ध्यान देने योग्य है (और IE अभी भी उन्हें काफी सही नहीं मिला है) लेकिन केंद्र के "मुख्य सामग्री" के साथ जो हुआ वह यह है कि यह ब्लॉक प्रारूपण संदर्भ बन गया है और अब इसके लिए जिम्मेदार है स्वयं का बच्चा (वंशज) तत्व। यह वास्तव में बहुत hasLayout के माइक्रोसॉफ्ट के शुरुआती दिनों धारणा के समान है, यह एक ही गुण का उपयोग करता है display: inline-block, floatऔर overflowकुछ भी दिखाई अलावा अन्य, और निश्चित रूप से तालिका सेल हमेशा लेआउट .. यह कीड़े के बिना तथापि है;)

आशा है कि थोड़ा मदद करता है, किसी भी सवाल पूछने के लिए स्वतंत्र महसूस हो रहा है!


अद्यतन: प्रश्न में अधिक जानकारी फिर से:

जब आप कहते हैं, "लेकिन जब उपयोगकर्ता एजेंट बॉक्स को खींचते हैं और जब वे सामग्री भरते हैं तो उन्हें ध्यान में रखते हुए अस्थायी तत्वों को अनदेखा कर दिया जाता है।"

हाँ, अपने कंटेनर बक्से को आम तौर पर उखाड़ फेंकते हैं, यह है कि माता-पिता की सीमाओं के बारे में आपका क्या मतलब है? जब एक ब्लॉक एलिमेंट खींचा जाता है और उसमें एक फ्लोट होता है तो ब्लॉक पेरेंट स्वयं फ्लोट के नीचे एक आयत के रूप में खींचा जाता है और यह अन्य चाइल्ड एलिमेंट्स के "इनलाइन अनाम बॉक्स" या बस "लाइन बॉक्स" के लिए छोटा होता है, जिसके लिए जगह बनाने के लिए छोटा किया जाता है। नाव

यह कोड लें:

जो इस का उत्पादन करता है:

कैसे तैरता है काम

आप देखते हैं कि मूल तत्व में वास्तव में फ्लोट नहीं होता है, क्योंकि यह इसे पूरी तरह से लपेटता नहीं है .. फ्लोट बस तैर रहा है सामग्री के ऊपर है - यदि आप div में सामग्री जोड़ना जारी रखना चाहते थे तो यह अंततः लपेट जाएगा। फ़्लोट के नीचे क्योंकि pतत्व की (अनाम) "लाइन बक्से" के लिए कोई ज़रूरत नहीं होगी खुद को किसी भी अधिक छोटा करने के लिए।

मैंने पैराग्राफ तत्व को रंगीन किया है ताकि आप देख सकें कि यह वास्तव में फ्लोट के नीचे चला जाता है, डार्कग्रै बैकग्राउंड वह है जहाँ पैराग्राफ़ शुरू होता है, सफ़ेद पाठ वह जगह है जहाँ "अनाम लाइन बॉक्स" शुरू होता है - यह केवल उन्हें वास्तव में है जो "कमरे बनाते हैं" "फ्लोट के लिए, जब तक कि आप इसे अन्यथा नहीं बताते (यानी आप संदर्भ बदलते हैं)

उपरोक्त चित्र का संदर्भ देते हुए, यदि आप pतत्व के बाईं ओर हाशिये पर हैं, तो यह फ्लोट के नीचे से पाठ को लपेटना बंद कर देगा क्योंकि "लाइन बॉक्स" (सफेद पाठ) केवल बाएं किनारे को स्पर्श करेगा उनके कंटेनर, और आप pफ्लोट के स्पष्ट, दाईं ओर रंगीन पृष्ठभूमि लाएंगे , लेकिन आपने pस्वरूपण संदर्भ के व्यवहार को नहीं बदला होगा । ऊपर के पहले चित्र में केंद्र स्तंभ की तरह;)


clairesuzy, बहुत बहुत धन्यवाद! यह वास्तव में मुझे बहुत मदद करता है। लेकिन मुझे अभी भी कुछ सवाल हैं। मैंने इसे मूल सवालों में जोड़ दिया है। मुझे उम्मीद है कि आप मेरी मदद कर सकते हैं।
एलीन ताओ

1
@ एलीन दो चीजें चल रही हैं - मुझे लगता है कि आपके अतिरिक्त प्रश्न को पहले उदाहरण द्वारा समझाया गया है। सामग्री के बाद बैंगनी फ्लोट किए गए बक्से दिखाई देते हैं क्योंकि वे जहां स्रोत में हैं, एक फ्लोट शीर्ष पर तैरता नहीं है, पिछले से ऊपर जाएं सामग्री (जैसा कि यह शीर्ष मार्जिन उस जगह से अधिक नहीं होना चाहिए जहां यह होना चाहिए) - बाएं और दाएं कॉलम भी फ्लोट किए गए बॉक्स हैं जो पहले स्रोत में हैं और बीच के कॉलम के बिना एक नया बीएफसी बन जाता है यदि आप कोशिश करते हैं और बैंगनी फ्लोट को साफ करते हैं तो वे पहले भी स्रोत के फ्लोट किए गए स्तंभों को साफ करेगा .. क्या वह मदद करता है?
क्लेयरसुजि

1
@ लिलेन उस लिंक को ब्लॉक स्तर के तत्वों और इनलाइन स्तर के तत्व का वर्णन कर रहा है, बस मूल बातें इतनी नहीं हैं कि एक प्रारूपण संदर्भ में। ब्लॉक तत्व हमेशा 100% चौड़ाई लेते हैं और एक दूसरे के ऊपर (डिफ़ॉल्ट रूप से) बैठते हैं - इनलाइन तत्व अगल-बगल बैठते हैं, जैसे लिंक, स्पैन आदि .. यहां तक ​​कि चौड़ाई या ऊंचाई भी न लें, ताकि उनके पास कोई विकल्प न हो। एक तैरता हुआ तत्व स्वचालित रूप से ब्लॉक स्तर का तत्व बन जाता है, इसलिए यदि आप एक इनलाइन स्तर पर तैरते हैं तो <span>यह ब्लॉक स्तर की तरह हो जाता है <div>
clairesuzy

1
cont .. इसका कारण यह है कि pबैकग्राउंड फ्लोट के अंतर्गत आता है क्योंकि फ्लोटेड तत्व फ्लो से हटा दिए जाते हैं, जैसा कि पड़ोसी तत्वों को वास्तव में पता नहीं है कि वे वहां हैं, और क्योंकि वे उसी स्वरूपण के संदर्भ में pदिखते हैं यह आयामों के लिए मूल कंटेनर है .. (इसीलिए आप एक फ़्लोट के बगल में 100% चौड़ी चीज नहीं डाल सकते हैं - क्योंकि यह 100% कंटेनर का 100% है। केवल अनाम बॉक्स में ही फ्लोट का पता चलता है; )
clairesuzy

1
@clairesuzy - आपके द्वारा पोस्ट की गई छवि बाहर है, क्या आप कृपया रीपोस्ट कर सकते हैं?
bfavaretto
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.