กฎ CSS ต่อไปนี้ทำอะไร:
.clear { clear: both; }
และทำไมเราต้องใช้มัน?
กฎ CSS ต่อไปนี้ทำอะไร:
.clear { clear: both; }
และทำไมเราต้องใช้มัน?
คำตอบ:
ฉันจะไม่อธิบายวิธีลอยทำงานที่นี่ (ในรายละเอียด) ตามคำถามนี้มักจะมุ่งเน้นไปที่ ทำไมใช้clear: both;
หรือสิ่งที่จะclear: both;
ทำ ...
ฉันจะตอบคำถามนี้ให้ง่ายและตรงประเด็นและจะอธิบายให้คุณทราบในเชิงกราฟิกว่าทำไมจึงclear: both;
มีความจำเป็นหรือสิ่งที่ทำ ...
โดยทั่วไปแล้วนักออกแบบจะลอยองค์ประกอบไปทางซ้ายหรือไปทางขวาซึ่งจะสร้างพื้นที่ว่างเปล่าในอีกด้านหนึ่งซึ่งช่วยให้องค์ประกอบอื่น ๆ ใช้พื้นที่ที่เหลือ
องค์ประกอบจะลอยเมื่อนักออกแบบต้องการองค์ประกอบระดับบล็อก 2 เคียงข้างกัน ตัวอย่างเช่นเราต้องการออกแบบเว็บไซต์พื้นฐานที่มีเลย์เอาต์ด้านล่าง ...
ตัวอย่างสดของภาพตัวอย่าง
รหัสสำหรับการสาธิต
หมายเหตุ: คุณอาจจะต้องเพิ่มheader
, footer
, aside
, section
(และองค์ประกอบ HTML5 อื่น ๆ ) ในฐานะdisplay: block;
ในสไตล์ชีตของคุณสำหรับการอย่างชัดเจนการกล่าวขวัญว่าองค์ประกอบเป็นองค์ประกอบระดับบล็อก
ฉันมีเค้าโครงพื้นฐานส่วนหัว 1 แถบด้านข้าง 1 พื้นที่เนื้อหา 1 และส่วนท้าย 1 ส่วน
ไม่มีการลอยตัวheader
ถัดไปมาaside
แท็กที่ฉันจะใช้สำหรับแถบด้านข้างของเว็บไซต์ของฉันดังนั้นฉันจะลอยองค์ประกอบไปทางซ้าย
หมายเหตุ: โดยค่าเริ่มต้นองค์ประกอบระดับบล็อกจะใช้เอกสารความกว้าง 100% แต่เมื่อลอยไปทางซ้ายหรือขวาจะปรับขนาดตามเนื้อหาที่เก็บไว้
ดังนั้นตามที่คุณทราบซ้ายที่ลอยdiv
ออกจากพื้นที่ไปทางขวาไม่ได้ใช้ซึ่งจะช่วยให้div
หลังจากที่จะเปลี่ยนในพื้นที่ที่เหลือ
ตกลงดังนั้นนี่เป็นสิ่งที่องค์ประกอบระดับบล็อกทำงานเมื่อลอยไปทางซ้ายหรือขวาดังนั้นตอนนี้เหตุใดจึงclear: both;
ต้องมีและทำไม
ดังนั้นหากคุณสังเกตในรูปแบบการสาธิต - ในกรณีที่คุณลืมนี่คือ ..
ฉันใช้ระดับที่เรียกว่า.clear
และมันถือคุณสมบัติที่เรียกว่ามีมูลค่าclear
เพื่อช่วยให้ดูว่าทำไมมันต้องboth
both
ฉันลอยaside
และsection
องค์ประกอบทางด้านซ้ายดังนั้นสมมติว่าสถานการณ์ที่เรามีสระว่ายน้ำที่header
เป็นดินแดนที่มั่นคงaside
และsection
ลอยอยู่ในสระว่ายน้ำและส่วนท้ายเป็นดินแดนที่มั่นคงอีกครั้งบางสิ่งเช่นนี้ ..
ดังนั้นน้ำทะเลสีฟ้าจึงไม่ทราบว่าพื้นที่ขององค์ประกอบที่ลอยอยู่นั้นสามารถใหญ่กว่าสระหรือเล็กลงได้ดังนั้นนี่เป็นปัญหาที่พบได้บ่อยซึ่งปัญหา 90% ของผู้เริ่มต้น CSS: ทำไมพื้นหลังขององค์ประกอบคอนเทนเนอร์ไม่ยืดออก เมื่อมันถือองค์ประกอบลอย มันเป็นเพราะองค์ประกอบของตู้คอนเทนเนอร์เป็นสระว่ายน้ำที่นี่และสระว่ายน้ำไม่มีความคิดว่าวัตถุจำนวนมากลอยอยู่หรือสิ่งที่ความยาวหรือความกว้างขององค์ประกอบลอยเป็นดังนั้นมันจะไม่ยืด
(อ้างถึงส่วน[Clearfix]ของคำตอบนี้สำหรับวิธีที่เป็นระเบียบในการทำสิ่งนี้ฉันใช้div
ตัวอย่างที่ว่างเปล่าเพื่อจุดประสงค์ในการอธิบาย)
ฉันได้ให้ตัวอย่าง 3 ข้อข้างต้นอันดับที่ 1 เป็นผังเอกสารปกติที่red
พื้นหลังจะแสดงตามที่คาดไว้เนื่องจากคอนเทนเนอร์ไม่เก็บวัตถุที่ลอยอยู่
ในตัวอย่างที่สองเมื่อวัตถุลอยไปทางซ้ายองค์ประกอบคอนเทนเนอร์ (POOL) จะไม่ทราบขนาดขององค์ประกอบลอยและด้วยเหตุนี้มันจะไม่ยืดความสูงองค์ประกอบลอย
หลังจากใช้clear: both;
แล้วส่วนประกอบของคอนเทนเนอร์จะถูกยืดออกไปจนถึงขนาดองค์ประกอบลอย
อีกเหตุผลหนึ่งที่ clear: both;
ใช้คือการป้องกันไม่ให้องค์ประกอบเลื่อนขึ้นในพื้นที่ที่เหลือ
สมมติว่าคุณต้องการองค์ประกอบ 2 รายการเคียงข้างกันและอีกองค์ประกอบหนึ่งอยู่ด้านล่าง ... ดังนั้นคุณจะลอย 2 องค์ประกอบไปทางซ้ายและคุณต้องการอีกองค์ประกอบหนึ่งที่อยู่ด้านล่าง
div
ลอยไปทางซ้ายทำให้section
เคลื่อนที่ไปในอวกาศที่เหลือdiv
ล้างเพื่อให้section
แท็กจะแสดงด้านล่างลอยdiv
s สุดท้าย แต่ไม่ท้ายสุดfooter
แท็กจะถูกแสดงหลังจากองค์ประกอบลอยเนื่องจากฉันใช้clear
คลาสก่อนที่จะประกาศfooter
แท็กของฉันซึ่งทำให้มั่นใจได้ว่าองค์ประกอบลอย (ซ้าย / ขวา) ทั้งหมดจะถูกล้างจนถึงจุดนั้น
มาถึง clearfix ซึ่งเกี่ยวข้องกับลอย ตามที่ระบุไว้แล้วโดย@Elkyวิธีที่เราล้างข้อมูลการลอยเหล่านี้ไม่ใช่วิธีที่สะอาดในการทำตามที่เราใช้div
องค์ประกอบที่ว่างซึ่งไม่ใช่div
องค์ประกอบที่มีไว้สำหรับ ดังนั้นที่นี่ clearfix มา
คิดว่ามันเป็นองค์ประกอบเสมือนซึ่งจะสร้างองค์ประกอบที่ว่างเปล่าสำหรับคุณก่อนที่องค์ประกอบหลักของคุณจะสิ้นสุดลง สิ่งนี้จะล้างองค์ประกอบของ wrapper ของคุณด้วยตัวเองโดยถือองค์ประกอบที่ลอยอยู่ องค์ประกอบนี้จะไม่มีอยู่ใน DOM ของคุณอย่างแท้จริง แต่จะทำงานได้
เมื่อต้องการล้างองค์ประกอบของ wrapper ที่มีองค์ประกอบลอยเราสามารถใช้
.wrapper_having_floated_elements:after { /* Imaginary class name */
content: "";
clear: both;
display: table;
}
สังเกต:after
องค์ประกอบหลอกที่ฉันใช้เพื่อสิ่งclass
นั้น ที่จะสร้างองค์ประกอบเสมือนสำหรับองค์ประกอบ wrapper ก่อนที่จะปิดตัวเอง ถ้าเราดูใน dom คุณสามารถดูว่ามันปรากฏในแผนผังเอกสารได้อย่างไร
ดังนั้นถ้าคุณเห็นมันจะแสดงผลหลังจากเด็กลอยdiv
ที่เราล้างลอยซึ่งไม่มีอะไร แต่เทียบเท่ากับการมีdiv
องค์ประกอบที่ว่างเปล่าที่มีclear: both;
คุณสมบัติที่เราใช้สำหรับเรื่องนี้เช่นกัน ตอนนี้ทำไมdisplay: table;
และcontent
อยู่นอกขอบเขตคำตอบนี้ แต่คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับองค์ประกอบหลอกได้ที่นี่องค์ประกอบหลอกนี่
โปรดทราบว่านี้จะทำงานใน IE8 เป็นIE8 สนับสนุน:after
หลอก
นักพัฒนาส่วนใหญ่ลอยเนื้อหาของพวกเขาไปทางซ้ายหรือขวาบนหน้าของพวกเขาอาจ divs ถือโลโก้แถบด้านข้างเนื้อหา ฯลฯ divs เหล่านี้จะลอยไปทางซ้ายหรือขวาออกจากส่วนที่เหลือของพื้นที่ที่ไม่ได้ใช้และด้วยเหตุนี้ถ้าคุณวางคอนเทนเนอร์อื่น ๆ ลอยเกินไปในพื้นที่ที่เหลือดังนั้นเพื่อป้องกันการclear: both;
ใช้มันจะล้างองค์ประกอบทั้งหมดที่ลอยไปทางซ้ายหรือขวา
------------------ ----------------------------------
div1(Floated Left) Other div takes up the space here
------------------ ----------------------------------
ตอนนี้ถ้าคุณต้องการให้ div อื่น ๆ แสดงผลด้านล่างdiv1
ดังนั้นคุณจะใช้clear: both;
ดังนั้นมันจะช่วยให้คุณแน่ใจว่าคุณได้ทำการล้างโฟลตซ้ายหรือขวา
------------------
div1(Floated Left)
------------------
<div style="clear: both;"><!--This <div> acts as a separator--></div>
----------------------------------
Other div renders here now
----------------------------------
display: inline-block
องค์ประกอบและผู้ปกครองที่สามารถใช้งานtext-align: left
, text-align: center
หรือtext-align: right
ตัวอย่างเช่น
clear
คุณสมบัติบ่งชี้ว่าซ้ายขวาหรือทั้งสองด้านขององค์ประกอบไม่สามารถจะอยู่ติดกับองค์ประกอบลอยก่อนหน้านี้ในบริบทการจัดรูปแบบบล็อกเดียวกัน องค์ประกอบที่ถูกล้างจะถูกผลักออกไปด้านล่างองค์ประกอบลอยที่เกี่ยวข้อง ตัวอย่าง:
clear: none;
องค์ประกอบยังคงอยู่ติดกับองค์ประกอบลอยclear: left;
องค์ประกอบผลักองค์ประกอบด้านล่างลอยซ้ายclear: right;
องค์ประกอบผลักองค์ประกอบด้านล่างลอยขวาclear: both;
องค์ประกอบผลักด้านล่างองค์ประกอบลอยทั้งหมดclear
ไม่มีผลต่อการลอยนอกบริบทการจัดรูปแบบบล็อกปัจจุบันdisplay: inline-block;
คุณสมบัติ CSS จากสถานการณ์นี้ มันจะยืดองค์ประกอบหลักองค์ประกอบพี่น้องซึ่งมีระดับinline-block
float-left
ซึ่งทำให้ "ล้างไม่มีผลต่อการลอยนอกบริบทการจัดรูปแบบบล็อกปัจจุบัน" คำสั่งที่ไม่ถูกต้อง มีใครอธิบายได้ไหม
display: inline-block
หมายความว่ามันจะไม่สร้างบริบทการจัดรูปแบบบล็อก (b) การลอย / เคลียร์ภายในองค์ประกอบนั้นและการลอยครั้งแรกทั้งหมดกลายเป็นส่วนหนึ่งของบริบทการจัดรูปแบบบล็อกเดียวกัน (วิวพอร์ต)
เพียงลองลบclear:both
คุณสมบัติออกจากdiv
ด้วยclass
sample
และดูว่ามันลอยตามมาdivs
อย่างไร
คำตอบของนายเอเลี่ยนนั้นสมบูรณ์แบบ แต่อย่างไรก็ตามฉันไม่แนะนำให้ใช้<div class="clear"></div>
เพราะมันเป็นแค่แฮ็คที่ทำให้มาร์กอัปของคุณสกปรก นี่เป็นสิ่งที่ไร้ประโยชน์div
ในแง่ของโครงสร้างที่ไม่ดีและความหมายทำให้โค้ดของคุณไม่ยืดหยุ่น ในเบราว์เซอร์บางตัว div นี้ทำให้มีความสูงเพิ่มขึ้นและคุณต้องเพิ่มheight: 0;
ว่ายิ่งแย่ลงไปกว่าเดิม แต่ปัญหาที่แท้จริงเริ่มต้นเมื่อคุณต้องการเพิ่มพื้นหลังหรือเส้นขอบรอบองค์ประกอบลอยของคุณ - มันก็จะยุบเพราะเว็บที่ถูกออกแบบมาไม่ดี ฉันแนะนำให้ห่อองค์ประกอบลอยในภาชนะที่มีกฎ CSS clearfix นี่คือแฮ็คเช่นกัน แต่สวยงามยืดหยุ่นได้มากกว่าในการใช้งานและอ่านได้สำหรับหุ่นยนต์มนุษย์และ SEO
clearfix
: stackoverflow.com/questions/211383/…
เมื่อคุณต้องการวางองค์ประกอบหนึ่งที่องค์ประกอบอื่น ๆ ด้านล่างคุณใช้รหัสนี้ใน CSS มันใช้สำหรับลอย
หากคุณลอยเนื้อหาคุณสามารถลอยไปทางซ้ายหรือขวา ... ดังนั้นในเค้าโครงทั่วไปคุณอาจมีการนำทางด้านซ้าย div เนื้อหาและส่วนท้าย
เพื่อให้แน่ใจว่าส่วนท้ายอยู่ด้านล่างทั้งสองของโฟลต (ถ้าคุณลอยไปทางซ้ายและขวา) จากนั้นคุณวางท้าย clear: both
แล้วคุณใส่ท้ายเป็น
วิธีนี้จะอยู่ด้านล่างทั้งสองลอย
(ถ้าคุณเหลือแค่การล้างคุณก็แค่ต้องการ clear: left;
เท่านั้น)
ผ่านบทช่วยสอนนี้:
float
และต้องการองค์ประกอบถัดไปด้านล่างไม่ใช่ทางขวาหรือซ้าย