กฎ CSS“ ชัดเจน: ทั้งคู่” ทำอะไรได้บ้าง


293

กฎ CSS ต่อไปนี้ทำอะไร:

.clear { clear: both; }

และทำไมเราต้องใช้มัน?


22
เมื่อคุณใช้ CSS floatและต้องการองค์ประกอบถัดไปด้านล่างไม่ใช่ทางขวาหรือซ้าย
Riz

ไม่อนุญาตให้มีองค์ประกอบแบบลอยที่ด้านซ้ายและด้านขวาขององค์ประกอบที่ระบุเมื่อใช้องค์ประกอบกับค่าที่ชัดเจน: ทั้งคู่
JackXu

คำตอบ:


687

ฉันจะไม่อธิบายวิธีลอยทำงานที่นี่ (ในรายละเอียด) ตามคำถามนี้มักจะมุ่งเน้นไปที่ ทำไมใช้clear: both;หรือสิ่งที่จะclear: both;ทำ ...

ฉันจะตอบคำถามนี้ให้ง่ายและตรงประเด็นและจะอธิบายให้คุณทราบในเชิงกราฟิกว่าทำไมจึงclear: both;มีความจำเป็นหรือสิ่งที่ทำ ...

โดยทั่วไปแล้วนักออกแบบจะลอยองค์ประกอบไปทางซ้ายหรือไปทางขวาซึ่งจะสร้างพื้นที่ว่างเปล่าในอีกด้านหนึ่งซึ่งช่วยให้องค์ประกอบอื่น ๆ ใช้พื้นที่ที่เหลือ

ทำไมมันลอยองค์ประกอบ?

องค์ประกอบจะลอยเมื่อนักออกแบบต้องการองค์ประกอบระดับบล็อก 2 เคียงข้างกัน ตัวอย่างเช่นเราต้องการออกแบบเว็บไซต์พื้นฐานที่มีเลย์เอาต์ด้านล่าง ...

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างสดของภาพตัวอย่าง

รหัสสำหรับการสาธิต

หมายเหตุ: คุณอาจจะต้องเพิ่มheader, footer, aside, section(และองค์ประกอบ HTML5 อื่น ๆ ) ในฐานะdisplay: block;ในสไตล์ชีตของคุณสำหรับการอย่างชัดเจนการกล่าวขวัญว่าองค์ประกอบเป็นองค์ประกอบระดับบล็อก

คำอธิบาย:

ฉันมีเค้าโครงพื้นฐานส่วนหัว 1 แถบด้านข้าง 1 พื้นที่เนื้อหา 1 และส่วนท้าย 1 ส่วน

ไม่มีการลอยตัวheaderถัดไปมาasideแท็กที่ฉันจะใช้สำหรับแถบด้านข้างของเว็บไซต์ของฉันดังนั้นฉันจะลอยองค์ประกอบไปทางซ้าย

หมายเหตุ: โดยค่าเริ่มต้นองค์ประกอบระดับบล็อกจะใช้เอกสารความกว้าง 100% แต่เมื่อลอยไปทางซ้ายหรือขวาจะปรับขนาดตามเนื้อหาที่เก็บไว้

  1. พฤติกรรมปกติขององค์ประกอบระดับบล็อก
  2. พฤติกรรมลอยตัวขององค์ประกอบระดับบล็อก

ดังนั้นตามที่คุณทราบซ้ายที่ลอยdivออกจากพื้นที่ไปทางขวาไม่ได้ใช้ซึ่งจะช่วยให้divหลังจากที่จะเปลี่ยนในพื้นที่ที่เหลือ

  1. divจะแสดงผลทีละภาพถ้าไม่ลอย
  2. div จะเลื่อนไปด้านข้างถ้าลอยไปทางซ้ายหรือขวา

ตกลงดังนั้นนี่เป็นสิ่งที่องค์ประกอบระดับบล็อกทำงานเมื่อลอยไปทางซ้ายหรือขวาดังนั้นตอนนี้เหตุใดจึงclear: both;ต้องมีและทำไม

ดังนั้นหากคุณสังเกตในรูปแบบการสาธิต - ในกรณีที่คุณลืมนี่คือ ..

ฉันใช้ระดับที่เรียกว่า.clearและมันถือคุณสมบัติที่เรียกว่ามีมูลค่าclear เพื่อช่วยให้ดูว่าทำไมมันต้องbothboth

ฉันลอยasideและsectionองค์ประกอบทางด้านซ้ายดังนั้นสมมติว่าสถานการณ์ที่เรามีสระว่ายน้ำที่headerเป็นดินแดนที่มั่นคงasideและsectionลอยอยู่ในสระว่ายน้ำและส่วนท้ายเป็นดินแดนที่มั่นคงอีกครั้งบางสิ่งเช่นนี้ ..

มุมมองลอย

ดังนั้นน้ำทะเลสีฟ้าจึงไม่ทราบว่าพื้นที่ขององค์ประกอบที่ลอยอยู่นั้นสามารถใหญ่กว่าสระหรือเล็กลงได้ดังนั้นนี่เป็นปัญหาที่พบได้บ่อยซึ่งปัญหา 90% ของผู้เริ่มต้น CSS: ทำไมพื้นหลังขององค์ประกอบคอนเทนเนอร์ไม่ยืดออก เมื่อมันถือองค์ประกอบลอย มันเป็นเพราะองค์ประกอบของตู้คอนเทนเนอร์เป็นสระว่ายน้ำที่นี่และสระว่ายน้ำไม่มีความคิดว่าวัตถุจำนวนมากลอยอยู่หรือสิ่งที่ความยาวหรือความกว้างขององค์ประกอบลอยเป็นดังนั้นมันจะไม่ยืด

  1. การไหลปกติของเอกสาร
  2. ส่วนที่ลอยไปทางซ้าย
  3. เคลียร์ Floated Element เพื่อยืดสีพื้นหลังของภาชนะ

(อ้างถึงส่วน[Clearfix]ของคำตอบนี้สำหรับวิธีที่เป็นระเบียบในการทำสิ่งนี้ฉันใช้divตัวอย่างที่ว่างเปล่าเพื่อจุดประสงค์ในการอธิบาย)

ฉันได้ให้ตัวอย่าง 3 ข้อข้างต้นอันดับที่ 1 เป็นผังเอกสารปกติที่redพื้นหลังจะแสดงตามที่คาดไว้เนื่องจากคอนเทนเนอร์ไม่เก็บวัตถุที่ลอยอยู่

ในตัวอย่างที่สองเมื่อวัตถุลอยไปทางซ้ายองค์ประกอบคอนเทนเนอร์ (POOL) จะไม่ทราบขนาดขององค์ประกอบลอยและด้วยเหตุนี้มันจะไม่ยืดความสูงองค์ประกอบลอย

ป้อนคำอธิบายรูปภาพที่นี่

หลังจากใช้clear: both;แล้วส่วนประกอบของคอนเทนเนอร์จะถูกยืดออกไปจนถึงขนาดองค์ประกอบลอย

ป้อนคำอธิบายรูปภาพที่นี่

อีกเหตุผลหนึ่งที่ clear: both;ใช้คือการป้องกันไม่ให้องค์ประกอบเลื่อนขึ้นในพื้นที่ที่เหลือ

สมมติว่าคุณต้องการองค์ประกอบ 2 รายการเคียงข้างกันและอีกองค์ประกอบหนึ่งอยู่ด้านล่าง ... ดังนั้นคุณจะลอย 2 องค์ประกอบไปทางซ้ายและคุณต้องการอีกองค์ประกอบหนึ่งที่อยู่ด้านล่าง

  1. divลอยไปทางซ้ายทำให้sectionเคลื่อนที่ไปในอวกาศที่เหลือ
  2. ลอยน้ำdivล้างเพื่อให้sectionแท็กจะแสดงด้านล่างลอยdivs

ตัวอย่างที่ 1

ป้อนคำอธิบายรูปภาพที่นี่


ตัวอย่างที่ 2

ป้อนคำอธิบายรูปภาพที่นี่

สุดท้าย แต่ไม่ท้ายสุดfooterแท็กจะถูกแสดงหลังจากองค์ประกอบลอยเนื่องจากฉันใช้clearคลาสก่อนที่จะประกาศfooterแท็กของฉันซึ่งทำให้มั่นใจได้ว่าองค์ประกอบลอย (ซ้าย / ขวา) ทั้งหมดจะถูกล้างจนถึงจุดนั้น


Clearfix

มาถึง 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 คุณสามารถดูว่ามันปรากฏในแผนผังเอกสารได้อย่างไร

Clearfix

ดังนั้นถ้าคุณเห็นมันจะแสดงผลหลังจากเด็กลอย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
----------------------------------

3
หากคุณไม่เคยได้ยินเกี่ยวกับการลอยตัวมาก่อนฉันแนะนำให้คุณอ่านคำแนะนำเบื้องต้นเกี่ยวกับการลอยตัวเช่นดูลิงค์ในคำตอบถัดไป จากนั้นกลับมาอ่านคำตอบนี้ - มันจะเข้าท่า
osa

37
รับทราบว่าการลอยตัวนั้นไม่ได้ถูกคิดค้นขึ้นเพื่อมีองค์ประกอบระดับบล็อกสองแบบเคียงข้างกันนั่นเป็นเพียงผลข้างเคียง! จุดประสงค์ดั้งเดิมคือการอนุญาตให้ข้อความไหลไปรอบ ๆ รูปภาพแบบอินไลน์ดังนั้นคุณจึงลอยภาพในทิศทางใดทิศทางหนึ่ง
ผีของมาดาราระ

3
คำตอบสั้น ๆ ที่เกี่ยวข้องในการอ้างถึงก่อนอ่านสิ่งนี้เพียงเพื่อให้ได้แนวคิดทั่วไป .. stackoverflow.com/questions/16568272/
Mr. Alien Alien

@ mr-alien ตัวอย่างที่ดีอย่างไรก็ตามในกรณีของjsfiddle.net/N82UD/1เมื่อคุณลดขนาดหน้าจอมีปัญหากับการลอยและองค์ประกอบ "เคลียร์" ไม่ได้ติดตามการไหล: jsfiddle.net/N82UD/138มัน ใช้เวลากับพื้นที่ของรายการที่ลอย 2
Omar

1
@Carlo: ทางเลือกที่ใช้บ่อยในเทมเพลตเช่น Twitter Bootstrap เช่น; คือการวางdisplay: inline-blockองค์ประกอบและผู้ปกครองที่สามารถใช้งานtext-align: left, text-align: centerหรือtext-align: rightตัวอย่างเช่น
Daan

39

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

clear: none; องค์ประกอบยังคงอยู่ติดกับองค์ประกอบลอย

clear: left; องค์ประกอบผลักองค์ประกอบด้านล่างลอยซ้าย

clear: right; องค์ประกอบผลักองค์ประกอบด้านล่างลอยขวา

clear: both; องค์ประกอบผลักด้านล่างองค์ประกอบลอยทั้งหมด

clear ไม่มีผลต่อการลอยนอกบริบทการจัดรูปแบบบล็อกปัจจุบัน


1
ยอดเยี่ยม นี่คือคำตอบที่ดีที่สุด ฉันสงสัยว่าทำไมคำตอบอื่นถึงได้รับการยอมรับ
sawa

จะเกิดอะไรขึ้นถ้าเราลบdisplay: inline-block;คุณสมบัติ CSS จากสถานการณ์นี้ มันจะยืดองค์ประกอบหลักองค์ประกอบพี่น้องซึ่งมีระดับinline-block float-leftซึ่งทำให้ "ล้างไม่มีผลต่อการลอยนอกบริบทการจัดรูปแบบบล็อกปัจจุบัน" คำสั่งที่ไม่ถูกต้อง มีใครอธิบายได้ไหม
Sashrika Waidyarathna

@SashrikaWaidyarathna: องค์ประกอบหลักไม่จำเป็นต้องสร้างบริบทการจัดรูปแบบบล็อกสำหรับลูก ๆ ในตัวอย่างของคุณ (a) การลบdisplay: inline-blockหมายความว่ามันจะไม่สร้างบริบทการจัดรูปแบบบล็อก (b) การลอย / เคลียร์ภายในองค์ประกอบนั้นและการลอยครั้งแรกทั้งหมดกลายเป็นส่วนหนึ่งของบริบทการจัดรูปแบบบล็อกเดียวกัน (วิวพอร์ต)
Salman

@SalmanA ขอขอบคุณสำหรับคำอธิบายอ้างอิง css ฉันไม่ทราบคำจำกัดความของบริบทการจัดรูปแบบบล็อก
Sashrika Waidyarathna

2
Sundar Pichai doppelganger?
Manoj Kumar


13

คำตอบของนายเอเลี่ยนนั้นสมบูรณ์แบบ แต่อย่างไรก็ตามฉันไม่แนะนำให้ใช้<div class="clear"></div>เพราะมันเป็นแค่แฮ็คที่ทำให้มาร์กอัปของคุณสกปรก นี่เป็นสิ่งที่ไร้ประโยชน์divในแง่ของโครงสร้างที่ไม่ดีและความหมายทำให้โค้ดของคุณไม่ยืดหยุ่น ในเบราว์เซอร์บางตัว div นี้ทำให้มีความสูงเพิ่มขึ้นและคุณต้องเพิ่มheight: 0;ว่ายิ่งแย่ลงไปกว่าเดิม แต่ปัญหาที่แท้จริงเริ่มต้นเมื่อคุณต้องการเพิ่มพื้นหลังหรือเส้นขอบรอบองค์ประกอบลอยของคุณ - มันก็จะยุบเพราะเว็บที่ถูกออกแบบมาไม่ดี ฉันแนะนำให้ห่อองค์ประกอบลอยในภาชนะที่มีกฎ CSS clearfix นี่คือแฮ็คเช่นกัน แต่สวยงามยืดหยุ่นได้มากกว่าในการใช้งานและอ่านได้สำหรับหุ่นยนต์มนุษย์และ SEO


โพสต์อื่นนี้มีรายละเอียดเพิ่มเติมเกี่ยวกับ clearfix : stackoverflow.com/questions/211383/…
Bill Hoag

2

เมื่อคุณต้องการวางองค์ประกอบหนึ่งที่องค์ประกอบอื่น ๆ ด้านล่างคุณใช้รหัสนี้ใน CSS มันใช้สำหรับลอย

หากคุณลอยเนื้อหาคุณสามารถลอยไปทางซ้ายหรือขวา ... ดังนั้นในเค้าโครงทั่วไปคุณอาจมีการนำทางด้านซ้าย div เนื้อหาและส่วนท้าย

เพื่อให้แน่ใจว่าส่วนท้ายอยู่ด้านล่างทั้งสองของโฟลต (ถ้าคุณลอยไปทางซ้ายและขวา) จากนั้นคุณวางท้าย clear: bothแล้วคุณใส่ท้ายเป็น

วิธีนี้จะอยู่ด้านล่างทั้งสองลอย

(ถ้าคุณเหลือแค่การล้างคุณก็แค่ต้องการ clear: left;เท่านั้น)

ผ่านบทช่วยสอนนี้:


3
กวดวิชาอะไร
Peter Mortensen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.