องค์ประกอบลอยไม่เพิ่มความสูงขององค์ประกอบภาชนะและด้วยเหตุนี้ถ้าคุณไม่ล้างพวกเขาความสูงภาชนะจะไม่เพิ่ม ...
ฉันจะแสดงให้คุณเห็น:
คำอธิบายเพิ่มเติม:
<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 คอลัมน์คุณอาจfloat
2 คอลัมน์ไป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
กว้าง