องค์ประกอบลอยไม่เพิ่มความสูงขององค์ประกอบภาชนะและด้วยเหตุนี้ถ้าคุณไม่ล้างพวกเขาความสูงภาชนะจะไม่เพิ่ม ...
ฉันจะแสดงให้คุณเห็น:



คำอธิบายเพิ่มเติม:
<div>
<div style="float: left;"></div>
<div style="width: 15px;"></div> <!-- This will shift
besides the top div. Why? Because of the top div
is floated left, making the
rest of the space blank -->
<div style="clear: both;"></div>
<!-- Now in order to prevent the next div from floating beside the top ones,
we use `clear: both;`. This is like a wall, so now none of the div's
will be floated after this point. The container height will now also include the
height of these floated divs -->
<div></div>
</div>
คุณยังสามารถเพิ่มoverflow: hidden;องค์ประกอบของคอนเทนเนอร์ได้ แต่ฉันขอแนะนำให้คุณใช้clear: both;แทน
นอกจากนี้หากคุณต้องการล้างองค์ประกอบด้วยตนเองคุณสามารถใช้
.self_clear:after {
content: "";
clear: both;
display: table;
}
CSS Float ทำงานอย่างไร?
อะไรคือสิ่งที่ลอยและสิ่งที่จะทำอย่างไร
floatคุณสมบัติจะเข้าใจผิดโดยเริ่มต้นมากที่สุด ทีนี้ทำอะไรกันแน่float? ในขั้นต้นfloatคุณสมบัติได้รับการแนะนำให้ไหลภาพรอบข้อความซึ่งจะลอยหรือleft นี่เป็นอีกคำอธิบายโดย @Madara Uchicharight
ดังนั้นการใช้floatคุณสมบัตินี้ในการวางกล่องแบบเคียงข้างกันผิดหรือไม่? คำตอบคือไม่ ; ไม่มีปัญหาหากคุณใช้floatคุณสมบัตินี้เพื่อตั้งค่ากล่องแบบเคียงข้างกัน
องค์ประกอบแบบลอยตัวinlineหรือblockระดับจะทำให้องค์ประกอบทำงานเหมือนinline-blockองค์ประกอบ
การสาธิต
หากคุณลอยองค์ประกอบleftหรือrightที่widthขององค์ประกอบจะถูก จำกัด ให้เนื้อหามันถือเว้นแต่widthจะกำหนดไว้อย่างชัดเจน ...
คุณไม่สามารถองค์ประกอบfloat centerนี่เป็นปัญหาที่ใหญ่ที่สุดที่ฉันเคยเห็นกับผู้เริ่มต้นใช้float: center;งานซึ่งไม่คุ้มค่าสำหรับfloatอสังหาริมทรัพย์ floatโดยทั่วไปจะใช้เพื่อfloat/ ย้ายเนื้อหาไปทางซ้ายหรือไปทางขวาสุด มีเพียง แต่เป็นสี่ค่าที่ถูกต้องสำหรับfloatเช่นคุณสมบัติleft, right, none(เริ่มต้น) inheritและ
องค์ประกอบหลักยุบเมื่อมีองค์ประกอบลูกลอยเพื่อป้องกันสิ่งนี้เราใช้clear: both;คุณสมบัติเพื่อล้างองค์ประกอบลอยทั้งสองด้านซึ่งจะป้องกันการยุบตัวขององค์ประกอบหลัก สำหรับข้อมูลเพิ่มเติมคุณสามารถดูคำตอบอื่นของฉันที่นี่
(สำคัญ)ลองคิดดูสิว่าเรามีองค์ประกอบอะไรหลายอย่าง เมื่อเราใช้float: left;หรือfloat: right;องค์ประกอบย้ายเหนือกองโดยหนึ่ง ดังนั้นองค์ประกอบในโฟลว์เอกสารปกติจะซ่อนอยู่หลังองค์ประกอบลอยเนื่องจากอยู่ในระดับสแต็กเหนือองค์ประกอบลอยปกติ (โปรดอย่าเชื่อมโยงสิ่งนี้กับz-indexสิ่งที่แตกต่างอย่างสิ้นเชิง)
ยกตัวอย่างเพื่ออธิบายวิธีการทำงานของ CSS โดยสมมติว่าเราต้องการเลย์เอาต์ 2 คอลัมน์แบบง่ายที่มีส่วนหัวส่วนท้ายและ 2 คอลัมน์ดังนั้นนี่คือสิ่งที่พิมพ์เขียวดูเหมือน ...

ในตัวอย่างข้างต้นเราจะลอยเฉพาะกล่องสีแดงทั้งที่คุณสามารถfloatทั้งไปที่leftหรือคุณสามารถfloatไปที่leftและอื่น ๆrightเช่นกันขึ้นอยู่กับรูปแบบถ้ามันเป็น 3 คอลัมน์คุณอาจfloat2 คอลัมน์ไปleftที่อื่น หนึ่งไปrightจึงขึ้นอยู่แม้ว่าในตัวอย่างนี้เรามีรูปแบบที่เรียบง่ายคอลัมน์ 2 เพื่อจะfloatหนึ่งไปleftและอื่น ๆ rightไป
มาร์กอัปและสไตล์สำหรับการสร้างโครงร่างอธิบายเพิ่มเติม ...
<div class="main_wrap">
<header>Header</header>
<div class="wrapper clear">
<div class="floated_left">
This<br />
is<br />
just<br />
a<br />
left<br />
floated<br />
column<br />
</div>
<div class="floated_right">
This<br />
is<br />
just<br />
a<br />
right<br />
floated<br />
column<br />
</div>
</div>
<footer>Footer</footer>
</div>
* {
-moz-box-sizing: border-box; /* Just for demo purpose */
-webkkit-box-sizing: border-box; /* Just for demo purpose */
box-sizing: border-box; /* Just for demo purpose */
margin: 0;
padding: 0;
}
.main_wrap {
margin: 20px;
border: 3px solid black;
width: 520px;
}
header, footer {
height: 50px;
border: 3px solid silver;
text-align: center;
line-height: 50px;
}
.wrapper {
border: 3px solid green;
}
.floated_left {
float: left;
width: 200px;
border: 3px solid red;
}
.floated_right {
float: right;
width: 300px;
border: 3px solid red;
}
.clear:after {
clear: both;
content: "";
display: table;
}
ไปทีละขั้นตอนกับเค้าโครงและดูว่า float ทำงานอย่างไร ..
ครั้งแรกของทั้งหมดที่เราใช้กระดาษห่อองค์ประกอบหลักคุณสามารถเพียงแค่คิดว่ามันเป็นวิวพอร์ตของคุณแล้วเราจะใช้headerและกำหนดheightของ50pxดังนั้นไม่มีอะไรแฟนซีมี เป็นเพียงองค์ประกอบระดับบล็อกที่ไม่ลอยตามปกติซึ่งจะใช้100%พื้นที่ในแนวนอนเว้นแต่ว่ามันจะลอยหรือเรากำหนดinline-blockให้มัน
ค่าแรกที่ถูกต้องfloatคือleftในตัวอย่างของเราเราใช้float: left;สำหรับ.floated_leftดังนั้นเราตั้งใจจะลอยบล็อกไปยังleftองค์ประกอบของภาชนะของเรา
คอลัมน์ลอยไปทางซ้าย
และใช่ถ้าคุณเห็นองค์ประกอบหลักซึ่งถูก.wrapperยุบไปแล้วองค์ประกอบที่คุณเห็นด้วยเส้นขอบสีเขียวจะไม่ขยาย แต่ก็ควรใช่ไหม จะกลับมาอีกครั้งในตอนนี้สำหรับตอนนี้เรามีคอลัมน์ที่ลอยไปleftแล้ว
เมื่อมาถึงคอลัมน์ที่สองให้มันเป็นคอลัมน์floatนี้right
คอลัมน์อื่นลอยไปทางขวา
ที่นี่เรามี300pxคอลัมน์กว้าง ๆ ซึ่งเราfloatไปที่rightซึ่งจะนั่งข้างคอลัมน์แรกขณะที่มันลอยไปที่leftและเนื่องจากมันลอยไปที่leftมันสร้างรางน้ำว่างเปล่าให้กับrightและเนื่องจากมีพื้นที่ว่างเพียงพอบนrightของเราrightองค์ประกอบลอยนั่งอย่างสมบูรณ์แบบข้างleftหนึ่ง
ถึงกระนั้นองค์ประกอบหลักก็ถูกยุบเอาล่ะมาแก้ไขกันเถอะ มีหลายวิธีในการป้องกันองค์ประกอบหลักไม่ให้ยุบ
- เพิ่มองค์ประกอบระดับบล็อกว่างเปล่าและใช้
clear: both;ก่อนที่องค์ประกอบหลักจะจบลงซึ่งมีองค์ประกอบที่ลอยอยู่ตอนนี้สิ่งนี้เป็นโซลูชันราคาถูกสำหรับclearองค์ประกอบลอยของคุณซึ่งจะทำงานให้คุณ แต่ฉันขอแนะนำไม่ให้ใช้สิ่งนี้
เพิ่ม<div style="clear: both;"></div>ก่อน.wrapper divจบเช่น
<div class="wrapper clear">
<!-- Floated columns -->
<div style="clear: both;"></div>
</div>
การสาธิต
ดีที่แก้ไขได้ดีมากไม่มีผู้ปกครองยุบอีกต่อไป แต่มันเพิ่มมาร์กอัปที่ไม่จำเป็นใน DOM ดังนั้นบางคนแนะนำให้ใช้overflow: hidden;ในองค์ประกอบผู้ปกครองที่ถือองค์ประกอบเด็กลอยซึ่งทำงานตามที่ตั้งใจไว้
ใช้overflow: hidden;บน.wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
การสาธิต
สิ่งนั้นช่วยเราให้เป็นองค์ประกอบทุกครั้งที่เราต้องการclear floatแต่เมื่อฉันทดสอบกรณีต่าง ๆ เกี่ยวกับสิ่งนี้มันก็ล้มเหลวในbox-shadowองค์ประกอบหนึ่งซึ่งใช้กับองค์ประกอบลูก
การสาธิต (ไม่เห็นเงาทั้ง 4 ด้านoverflow: hidden;ทำให้เกิดปัญหานี้)
แล้วตอนนี้ล่ะ? บันทึกองค์ประกอบไม่overflow: hidden;ต้องไปหาแฮ็คแก้ไขที่ชัดเจนใช้ตัวอย่างข้อมูลด้านล่างใน CSS ของคุณและเช่นเดียวกับที่คุณใช้overflow: hidden;สำหรับองค์ประกอบหลักโทรclassไปด้านล่างในองค์ประกอบหลักเพื่อล้างตัวเอง
.clear:after {
clear: both;
content: "";
display: table;
}
<div class="wrapper clear">
<!-- Floated Elements -->
</div>
การสาธิต
ที่นี่เงาทำงานตามที่ตั้งใจไว้และมันจะทำการล้างองค์ประกอบหลักซึ่งป้องกันการยุบ
และสุดท้ายเราใช้ส่วนท้ายหลังจากเราclearลอยองค์ประกอบ
การสาธิต
เมื่อใดจะfloat: none;ใช้ต่อไปตามที่เป็นค่าเริ่มต้นดังนั้นการใช้งานใด ๆ ที่จะประกาศfloat: none;?
ขึ้นอยู่กับว่าถ้าคุณต้องการการออกแบบที่ตอบสนองคุณจะใช้ค่านี้หลายครั้งเมื่อคุณต้องการให้องค์ประกอบที่ลอยอยู่ของคุณแสดงผลที่ด้านล่างด้วยความละเอียดที่แน่นอน สำหรับfloat: none;คุณสมบัตินั้นมีบทบาทสำคัญที่นั่น
ตัวอย่างโลกแห่งความจริงfloatมีประโยชน์เพียงใด
- ตัวอย่างแรกที่เราได้เห็นคือการสร้างหนึ่งหรือมากกว่าหนึ่งเค้าโครงคอลัมน์
- ใช้
imgลอยอยู่ภายในpซึ่งจะทำให้เนื้อหาของเราไหลไปมา
การสาธิต (โดยไม่ลอยimg)
ตัวอย่าง 2 (imgลอยไปที่left)
- ใช้
floatสำหรับสร้างเมนูแนวนอน - สาธิต
ลอยองค์ประกอบที่สองด้วยหรือใช้ "ระยะขอบ"
สุดท้าย แต่ไม่ใช่อย่างน้อยฉันต้องการอธิบายกรณีนี้โดยเฉพาะที่คุณfloatเพียงองค์ประกอบเดียวleftแต่คุณไม่ทำอย่างfloatอื่นดังนั้นจะเกิดอะไรขึ้น
สมมติว่าถ้าเราลบfloat: right;จากของเรา.floated_right classที่divจะแสดงผลจากการที่รุนแรงleftที่มันไม่ได้ลอย
การสาธิต
ดังนั้นในกรณีนี้คุณสามารถfloatไปที่leftเช่นกัน
หรือ
คุณสามารถใช้margin-leftซึ่งจะเท่ากับขนาดของคอลัมน์ลอยซ้ายคือ200pxกว้าง