कारण
समस्या यह है कि फ्लोटिंग तत्व बाहर-बाहर हैं :
एक तत्व प्रवाह से बाहर कहा जाता है अगर यह फ्लोट किया जाता है, बिल्कुल तैनात है, या मूल तत्व है।
इसलिए, वे आसपास के तत्वों को एक प्रवाह तत्व के रूप में प्रभावित नहीं करते हैं ।
यह 9.5 फ्लोट्स में बताया गया है :
चूंकि फ्लोट फ्लो में नहीं है, इसलिए पहले और बाद में फ्लोट बॉक्स में गैर-तैनात ब्लॉक बॉक्स खड़े होते हैं जैसे कि फ्लोट मौजूद नहीं था। हालांकि, फ्लोट के बगल में बनाई गई वर्तमान और बाद की लाइन के बक्से को फ्लोट के मार्जिन बॉक्स के लिए जगह बनाने के लिए आवश्यक रूप से छोटा किया जाता है।
html {
width: 550px;
border: 1px solid;
}
body {
font-family: sans-serif;
color: rgba(0,0,0,.15);
}
body:after {
content: '';
display: block;
clear: both;
}
div {
position: relative;
}
div:after {
font-size: 200%;
position: absolute;
left: 0;
right: 0;
top: 0;
text-align: center;
}
.block-sibling {
border: 3px solid green;
}
.block-sibling:after {
content: 'Block sibling';
color: green;
}
.float {
float: left;
border: 3px solid red;
height: 90px;
width: 150px;
z-index: 1;
}
.float:after {
content: 'Float';
color: red;
}
<div class="float"></div>
<div class="block-sibling">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor.
</div>
यह 10.6 और ऊँचाइयों की गणना में भी निर्दिष्ट है । के लिए "सामान्य" ब्लॉक ,
सामान्य प्रवाह में केवल बच्चों को ध्यान में रखा जाता है (यानी, फ्लोटिंग बॉक्स और बिल्कुल तैनात बक्से की अनदेखी की जाती है […])
html {
width: 550px;
border: 1px solid;
}
body {
font-family: sans-serif;
color: rgba(0,0,0,.15);
}
body:after {
content: '';
display: block;
clear: both;
}
div {
position: relative;
}
div:after {
font-size: 200%;
position: absolute;
left: 0;
right: 0;
top: 0;
text-align: center;
}
.block-parent {
border: 3px solid blue;
}
.block-parent:after {
content: 'Block parent';
color: blue;
}
.float {
float: left;
border: 3px solid red;
height: 130px;
width: 150px;
}
.float:after {
content: 'Float';
color: red;
}
<div class="block-parent">
<div class="float"></div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.
</div>
हैकी समाधान: निकासी
समस्या को हल करने का एक तरीका कुछ फ्लो तत्व को सभी फ़्लोट्स के नीचे रखने के लिए मजबूर करना है। फिर, माता-पिता की ऊंचाई उस तत्व को लपेटने के लिए बढ़ेगी (और इस तरह से तैरती भी)।
इस का उपयोग कर प्राप्त किया जा सकता संपत्ति :clear
यह गुण इंगित करता है कि किसी तत्व के बॉक्स (तों) के कौन से पक्ष
पहले के अस्थायी बॉक्स से सटे हुए नहीं हो सकते हैं ।
html {
width: 550px;
border: 1px solid;
}
body {
font-family: sans-serif;
color: rgba(0,0,0,.15);
}
body:after {
content: '';
display: block;
clear: both;
}
div {
position: relative;
}
div:after {
font-size: 200%;
position: absolute;
left: 0;
right: 0;
top: 0;
text-align: center;
}
.block-parent {
border: 3px solid blue;
}
.block-parent:after {
content: 'Block parent';
color: blue;
}
.float {
float: left;
border: 3px solid red;
height: 84px;
width: 150px;
}
.float:after {
content: 'Float';
color: red;
}
.clear {
clear: both;
text-align: center;
height: 37px;
border: 3px dashed pink;
}
.clear:after {
position: static;
content: 'Block sibling with clearance';
color: pink;
}
<div class="block-parent">
<div class="float"></div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra.
<div class="clear"></div>
</div>
तो एक समाधान एक खाली तत्व जोड़ रहा है, जो clear: both
कि तैरने के अंतिम भाई के रूप में है
<div style="clear: both"></div>
हालाँकि, यह शब्दार्थ नहीं है। तो बेहतर है कि जनक के अंत में एक छद्म तत्व उत्पन्न करें :
.clearfix::after {
clear: both;
display: block;
}
इस दृष्टिकोण के कई प्रकार हैं, जैसे :after
पुराने ब्राउज़रों का समर्थन करने के लिए पदावनत एकल बृहदान्त्र सिंटैक्स का उपयोग करना, या जैसे अन्य ब्लॉक-स्तरीय डिस्प्ले का उपयोग करना display: table
।
हल: बीएफसी की जड़ें
शुरुआत में परिभाषित समस्याग्रस्त व्यवहार का एक अपवाद है: यदि एक ब्लॉक तत्व एक ब्लॉक फॉर्मेटिंग संदर्भ (एक बीएफसी रूट) स्थापित करता है, तो यह अपनी अस्थायी सामग्री को भी लपेट देगा।
ब्लॉक प्रारूपण संदर्भ जड़ों के लिए 10.6.7 'ऑटो' ऊंचाइयों के अनुसार ,
यदि तत्व में कोई अस्थायी वंश है जिसका निचला मार्जिन किनारे तत्व के नीचे की सामग्री के किनारे से नीचे है, तो उन किनारों को शामिल करने के लिए ऊंचाई बढ़ाई जाती है।
html {
width: 550px;
border: 1px solid;
}
body {
font-family: sans-serif;
color: rgba(0,0,0,.15);
}
body:after {
content: '';
display: block;
clear: both;
}
div {
position: relative;
}
div:after {
font-size: 200%;
position: absolute;
left: 0;
right: 0;
top: 0;
text-align: center;
}
.block-parent {
border: 3px solid blue;
}
.block-parent.bfc-root:after {
content: 'BFC parent';
color: blue;
}
.float {
float: left;
border: 3px solid red;
height: 127px;
width: 150px;
}
.float:after {
content: 'Float';
color: red;
}
.bfc-root {
overflow: hidden;
}
<div class="block-parent bfc-root">
<div class="float"></div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit.
</div>
इसके अतिरिक्त, जैसा कि 9.5 फ़्लोट्स में बताया गया है , बीएफसी जड़ें निम्नलिखित के कारण भी उपयोगी हैं:
एक तालिका का बॉर्डर बॉक्स, एक ब्लॉक-स्तर प्रतिस्थापित तत्व, या सामान्य प्रवाह में एक तत्व जो एक नया ब्लॉक स्वरूपण संदर्भ स्थापित करता है […] उसी ब्लॉक प्रारूपण संदर्भ में किसी भी फ़्लोट्स के मार्जिन बॉक्स को ओवरलैप नहीं करना चाहिए क्योंकि तत्व स्वयं ।
html {
width: 550px;
border: 1px solid;
}
body {
font-family: sans-serif;
color: rgba(0,0,0,.15);
}
body:after {
content: '';
display: block;
clear: both;
}
div {
position: relative;
}
div:after {
font-size: 200%;
position: absolute;
left: 0;
right: 0;
top: 0;
text-align: center;
}
.block-sibling {
border: 3px solid green;
}
.block-sibling.bfc-root:after {
content: 'BFC sibling';
color: green;
}
.float {
float: left;
border: 3px solid red;
height: 90px;
width: 150px;
z-index: 1;
}
.float:after {
content: 'Float';
color: red;
}
.bfc-root {
overflow: hidden;
}
<div class="float"></div>
<div class="block-sibling bfc-root">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.
</div>
एक ब्लॉक स्वरूपण संदर्भ द्वारा स्थापित किया गया है
overflow
अन्य के साथ ब्लॉक बॉक्स visible
, जैसेhidden
.bfc-root {
overflow: hidden;
/* display: block; */
}
ब्लॉक कंटेनर जो ब्लॉक बॉक्स नहीं हैं: जब display
सेट किया जाता है inline-block
, table-cell
या table-caption
।
.bfc-root {
display: inline-block;
}
फ़्लोटिंग तत्व: जब या के float
लिए सेट है ।left
right
.bfc-root {
float: left;
}
पूरी तरह से तैनात तत्व: जब या के position
लिए सेट है ।absolute
fixed
.bfc-root {
position: absolute;
}
ध्यान दें कि उन पर अवांछित संपार्श्विक प्रभाव हो सकता है, जैसे अतिप्रवाह सामग्री को क्लिप करना, हटना-फिट करने के लिए ऑटो चौड़ाई की गणना करना, फिट रहना , या आउट-ऑफ-फ्लो बनना। तो समस्या यह है कि बीएफ को स्थापित करने वाले दृश्य अतिप्रवाह के साथ इन-फ्लो ब्लॉक-स्तरीय तत्व होना संभव नहीं है।
L3 इन मुद्दों को प्रदर्शित करें :
बेहतर प्रदर्शन प्रवाह लेआउट प्रदर्शन प्रकारों को बनाने के लिए flow
और आंतरिक तत्व को एक BFC रूट बनाने के लिए एक स्पष्ट स्विच बनाने के लिए बनाया गया । (यह हैक और […] के लिए हैक की आवश्यकता को समाप्त करना चाहिए )flow-root
::after { clear: both; }
overflow: hidden
अफसोस की बात है, अभी तक कोई ब्राउज़र समर्थन नहीं है। अंततः हम उपयोग करने में सक्षम हो सकते हैं
.bfc-root {
display: flow-root;
}