เหตุผล
ปัญหาคือองค์ประกอบลอยอยู่นอกกระแส :
องค์ประกอบถูกเรียกว่าไม่ไหลหากลอยอยู่ในตำแหน่งที่แน่นอนหรือเป็นองค์ประกอบราก
ดังนั้นจึงไม่ส่งผลกระทบต่อองค์ประกอบโดยรอบเนื่องจากองค์ประกอบในการไหลจะ
นี่คือคำอธิบายใน9.5 Floats :
เนื่องจากการลอยไม่ได้อยู่ในการไหลกล่องบล็อกแบบไม่มีตำแหน่งที่สร้างขึ้นก่อนและหลังการไหลของกล่องโฟลว์ในแนวตั้งราวกับว่าไม่มีการลอยอยู่ อย่างไรก็ตามกล่องบรรทัดปัจจุบันและถัดมาที่สร้างขึ้นถัดจากโฟลตจะสั้นลงตามความจำเป็นเพื่อให้มีที่ว่างสำหรับกล่องมาร์จิ้นของโฟลว์
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
แสดงเช่น
การแก้ไข: ราก BFC
มีข้อยกเว้นสำหรับพฤติกรรมที่เป็นปัญหาที่กำหนดไว้ที่จุดเริ่มต้น: หากองค์ประกอบบล็อกสร้างบริบทการจัดรูปแบบบล็อก (เป็นราก BFC) แล้วมันก็จะห่อเนื้อหาลอยของมัน
ตามความสูง 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 Floatsแล้วราก BFC ก็มีประโยชน์เช่นกันดังต่อไปนี้:
กล่องเส้นขอบของตารางองค์ประกอบระดับแทนที่บล็อกหรือองค์ประกอบในการไหลปกติที่สร้างบริบทการจัดรูปแบบบล็อกใหม่ […] จะต้องไม่ทับซ้อนกล่องระยะขอบของลอยในบริบทการจัดรูปแบบบล็อกเดียวกันเป็นองค์ประกอบตัวเอง .
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;
}
โปรดทราบว่าสิ่งเหล่านั้นอาจมีผลกระทบด้านหลักประกันที่ไม่พึงประสงค์เช่นการตัดเนื้อหาที่มีมากเกินออกไปการคำนวณความกว้างอัตโนมัติด้วยอัลกอริธึมการหดตัวเพื่อให้พอดีหรือล้าสมัย ดังนั้นปัญหาคือมันเป็นไปไม่ได้ที่จะมีองค์ประกอบระดับบล็อกในการไหลพร้อมกับล้นที่มองเห็นได้ที่สร้าง BFC
แสดง L3แก้ไขปัญหาเหล่านี้:
สร้างflow
และชนิดจอแสดงผลด้านในการแสดงที่ดีกว่ารูปแบบการไหลของประเภทการแสดงผลและการสร้างสวิทช์ที่ชัดเจนสำหรับการทำองค์ประกอบBFCราก (สิ่งนี้ควรกำจัดความต้องการแฮ็กที่ชอบและ[…])flow-root
::after { clear: both; }
overflow: hidden
น่าเศร้าที่ยังไม่มีการสนับสนุนเบราว์เซอร์ ในที่สุดเราอาจจะสามารถใช้
.bfc-root {
display: flow-root;
}