วิธีแก้ไขปัญหาทั่วไปนี้ใช้การกำหนดตำแหน่งแบบสัมบูรณ์หรือการครอบตัดแบบลอย แต่สิ่งเหล่านี้มีความยุ่งยากในการที่พวกเขาต้องการการปรับแต่งอย่างละเอียดหากคอลัมน์ของคุณเปลี่ยนจำนวน + ขนาดและคุณต้องแน่ใจว่าคอลัมน์ "หลัก" ของคุณยาวที่สุดเสมอ แต่ฉันขอแนะนำให้คุณใช้หนึ่งในสามโซลูชั่นที่มีประสิทธิภาพมากขึ้น:
display: flex
: โดยวิธีที่ง่ายที่สุด & ดีที่สุดและยืดหยุ่นมาก - แต่ไม่รองรับโดย IE9 และรุ่นเก่ากว่า
table
หรือdisplay: table
: ง่ายมากเข้ากันได้ดี (เบราว์เซอร์ทุกอันที่เคยมี) ค่อนข้างยืดหยุ่น
display: inline-block; width:50%
ด้วยการแฮ็กขอบติดลบค่อนข้างง่าย แต่เส้นขอบคอลัมน์ด้านล่างนั้นค่อนข้างยุ่งยาก
1 display:flex
นี่เป็นเรื่องง่ายมากและง่ายต่อการปรับให้เข้ากับรูปแบบที่ซับซ้อนมากขึ้นหรือรายละเอียดที่มากขึ้น - แต่ flexbox รองรับเฉพาะ IE10 หรือใหม่กว่าเท่านั้น (นอกเหนือจากเบราว์เซอร์สมัยใหม่อื่น ๆ )
ตัวอย่าง: http://output.jsbin.com/hetunujuma/1
html ที่เกี่ยวข้อง:
<div class="parent"><div>column 1</div><div>column 2</div></div>
css ที่เกี่ยวข้อง:
.parent { display: -ms-flex; display: -webkit-flex; display: flex; }
.parent>div { flex:1; }
Flexbox มีการสนับสนุนสำหรับตัวเลือกเพิ่มเติมมากมาย แต่เพื่อให้มีคอลัมน์จำนวนพอเพียงด้านบน!
2. <table>
หรือdisplay: table
ที่เรียบง่ายและวิธีที่เข้ากันได้มากที่จะทำเช่นนี้คือการใช้table
- ผมอยากแนะนำให้คุณพยายามที่แรกถ้าคุณต้องการเก่า IE สนับสนุน คุณกำลังจัดการกับคอลัมน์ divs + float ไม่ใช่วิธีที่ดีที่สุดในการทำเช่นนั้น (ไม่พูดถึงความจริงที่ว่า div ที่ซ้อนกันหลายระดับเพื่อเจาะข้อ จำกัด css นั้นแทบจะไม่ "semantic" มากกว่าแค่ใช้ตารางธรรมดา) หากคุณไม่ต้องการใช้table
องค์ประกอบให้พิจารณา cssdisplay: table
(ไม่รองรับ IE7 และรุ่นเก่ากว่า)
ตัวอย่าง: http://jsfiddle.net/emn13/7FFp3/
html ที่เกี่ยวข้อง: (แต่ให้พิจารณาใช้ล้วนๆ<table>
)
<div class="parent"><div>column 1</div><div>column 2</div></div>
css ที่เกี่ยวข้อง:
.parent { display: table; }
.parent > div {display: table-cell; width:50%; }
/*omit width:50% for auto-scaled column widths*/
วิธีนี้มีประสิทธิภาพมากกว่าการใช้overflow:hidden
กับโฟลต คุณสามารถเพิ่มคอลัมน์จำนวนเท่าใดก็ได้ คุณสามารถปรับขนาดอัตโนมัติได้หากต้องการ และคุณคงความเข้ากันได้กับเบราว์เซอร์โบราณ คุณไม่จำเป็นต้องรู้ล่วงหน้าว่าคอลัมน์ใดยาวที่สุด ระดับความสูงก็โอเค
KISS:อย่าใช้แฮ็กโฟลตเว้นแต่ว่าคุณต้องการ หาก IE7 เป็นปัญหาฉันจะยังคงเลือกโต๊ะธรรมดาที่มีคอลัมน์เชิงความหมายผ่านโซลูชัน trick-CSS ที่ยากต่อการดูแลรักษาและยืดหยุ่นน้อยกว่าทุกวัน
อย่างไรก็ตามถ้าคุณต้องการให้เลย์เอาต์ของคุณตอบสนอง (เช่นไม่มีคอลัมน์ในโทรศัพท์มือถือขนาดเล็ก) คุณสามารถใช้@media
เคียวรีเพื่อถอยกลับไปที่เลย์เอาต์บล็อกธรรมดาสำหรับความกว้างของหน้าจอขนาดเล็ก - ซึ่งทำงานได้ไม่ว่าคุณจะใช้<table>
หรือdisplay: table
องค์ประกอบอื่น ๆ
3. display:inline block
แฮ็กมาร์จิ้นติดลบ
display:inline block
อีกทางเลือกหนึ่งคือการใช้งาน
ตัวอย่าง: http://jsbin.com/ovuqes/2/edit
html ที่เกี่ยวข้อง: (ไม่มีช่องว่างระหว่างdiv
แท็กสำคัญ!)
<div class="parent"><div><div>column 1</div></div><div><div>column 2</div></div></div>
css ที่เกี่ยวข้อง:
.parent {
position: relative; width: 100%; white-space: nowrap; overflow: hidden;
}
.parent>div {
display:inline-block; width:50%; white-space:normal; vertical-align:top;
}
.parent>div>div {
padding-bottom: 32768px; margin-bottom: -32768px;
}
นี่เป็นเรื่องยุ่งยากเล็กน้อยและระยะขอบติดลบหมายความว่าด้านล่างของ "จริง" ของคอลัมน์นั้นถูกบดบัง ในทางกลับกันหมายความว่าคุณไม่สามารถวางตำแหน่งใด ๆ ที่เกี่ยวข้องกับด้านล่างของคอลัมน์เหล่านั้นเพราะถูกตัดออกoverflow: hidden
ไป โปรดทราบว่านอกเหนือจากบล็อกแบบอินไลน์คุณสามารถบรรลุผลที่คล้ายกันกับลอย
TL; DR : ใช้flexboxถ้าคุณไม่สนใจ IE9 และรุ่นเก่ากว่า; ลองใช้ตาราง (css) หากตัวเลือกเหล่านั้นไม่เหมาะกับคุณมีแฮ็กมาร์เกตลบ แต่สิ่งเหล่านี้อาจทำให้เกิดปัญหาการแสดงผลแปลก ๆ ที่พลาดได้ง่ายในระหว่างการพัฒนาและมีข้อ จำกัด ด้านเลย์เอาต์ที่คุณต้องระวัง