CSS - ขยายความสูงลูก DIV ความสูงเป็นความสูงของผู้ปกครอง


451

ฉันมีโครงสร้างหน้าเป็น:

<div class="parent">
    <div class="child-left floatLeft">
    </div>

    <div class="child-right floatLeft">
    </div>
</div>

ตอนนี้child-leftDIV จะมีเนื้อหามากขึ้นดังนั้นparentความสูงของ DIV จะเพิ่มขึ้นตาม DIV ลูก

แต่ปัญหาคือchild-rightความสูงไม่เพิ่มขึ้น ฉันจะทำให้ความสูงเท่ากับพ่อแม่ได้อย่างไร


คำตอบ:


459

สำหรับparentองค์ประกอบเพิ่มคุณสมบัติต่อไปนี้:

.parent {
    overflow: hidden;
    position: relative;
    width: 100%;
}

สำหรับ.child-rightสิ่งเหล่านี้แล้ว:

.child-right {
    background:green;
    height: 100%;
    width: 50%;
    position: absolute;
    right: 0;
    top: 0;
}

พบผลการค้นหารายละเอียดเพิ่มเติมกับตัวอย่าง CSS ที่นี่และข้อมูลเพิ่มเติมเกี่ยวกับคอลัมน์ความสูงเท่ากันที่นี่


14
CSS ของคุณส่งผลให้มีพฤติกรรมที่ไม่ได้กำหนดความสูงของผู้ปกครองขึ้นอยู่กับความสูงของเด็ก แต่เด็ก ๆ นั้นมีเปอร์เซ็นต์ความสูงที่กำหนดในรูปแบบของผู้ปกครอง: สิ่งนี้ไม่ถูกต้องและอาจไม่ทำงานในเบราว์เซอร์ข้าม
Eamon Nerbonne

1
ฉันเห็นว่าคุณไม่ได้ลอยทุกอย่างดังนั้นที่กำหนดไว้ที่ค่าใช้จ่ายของการไม่ปรับถ้าเคยคอลัมน์ขวาเติบโตนานกว่าด้านซ้าย (ซึ่งแน่นอนว่าไม่ใช่ในกรณีของคำถาม OP)
Eamon Nerbonne

4
ใช่คุณต้องเพิ่มสิ่งนี้: ช่องว่างภายใน: 32768px; ระยะขอบล่าง: -32768px; เพื่อเด็ก ๆ
Michael

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

3
@ MatthewBlackford: มันเป็น "แฮ็ค" ที่จะป้องกันการยุบตัว คุณสามารถป้องกันการยุบขอบด้วยวิธีอื่น ๆ เช่นการใช้เส้นขอบโปร่งใส 1px แต่ในสาระสำคัญ แต่สิ่งสำคัญที่นี่คือคุณหลีกเลี่ยงการยุบขอบ ฉันจะไม่ใช้วิธีแก้ปัญหานี้ยกเว้นเป็นวิธีสุดท้ายเพราะมันทำให้เกิดข้อผิดพลาดรูปแบบแปลก ๆ และการครอบตัดที่ไม่คาดคิด (หรือเนื้อหาที่ซ้อนทับ) เมื่อสมมติฐานของคุณผิดพลาด กล่าวโดยย่อ: คุณไม่ต้องการทำสิ่งนี้จนกว่าคุณจะต้องการจริงๆ
Eamon Nerbonne

206

วิธีแก้ไขปัญหาทั่วไปนี้ใช้การกำหนดตำแหน่งแบบสัมบูรณ์หรือการครอบตัดแบบลอย แต่สิ่งเหล่านี้มีความยุ่งยากในการที่พวกเขาต้องการการปรับแต่งอย่างละเอียดหากคอลัมน์ของคุณเปลี่ยนจำนวน + ขนาดและคุณต้องแน่ใจว่าคอลัมน์ "หลัก" ของคุณยาวที่สุดเสมอ แต่ฉันขอแนะนำให้คุณใช้หนึ่งในสามโซลูชั่นที่มีประสิทธิภาพมากขึ้น:

  1. display: flex: โดยวิธีที่ง่ายที่สุด & ดีที่สุดและยืดหยุ่นมาก - แต่ไม่รองรับโดย IE9 และรุ่นเก่ากว่า
  2. tableหรือdisplay: table: ง่ายมากเข้ากันได้ดี (เบราว์เซอร์ทุกอันที่เคยมี) ค่อนข้างยืดหยุ่น
  3. 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) หากตัวเลือกเหล่านั้นไม่เหมาะกับคุณมีแฮ็กมาร์เกตลบ แต่สิ่งเหล่านี้อาจทำให้เกิดปัญหาการแสดงผลแปลก ๆ ที่พลาดได้ง่ายในระหว่างการพัฒนาและมีข้อ จำกัด ด้านเลย์เอาต์ที่คุณต้องระวัง


1
ดีมาก แต่ควรทราบว่าคุณไม่สามารถใช้ระยะขอบระหว่างเซลล์เหล่านี้ (และการขยายจะไม่ช่วยถ้าคุณต้องการให้มีสไตล์)
Wordpressor

3
border-spacing:10px;ในองค์ประกอบตารางจะแนะนำการเว้นวรรคเช่นระยะขอบ หรือคุณสามารถเพิ่มคอลัมน์พิเศษ (ว่าง) ที่คุณต้องการพื้นที่พิเศษ และคุณยังสามารถเพิ่มการเติมภายในเซลล์ตาราง อย่างไรก็ตามการแพ็ดนั้นจะรวมอยู่ในพื้นหลังอย่างไรก็ตามอาจไม่ใช่สิ่งที่คุณต้องการ แต่คุณพูดถูกว่ามันไม่ยืดหยุ่นเท่าอัตรากำไรปกติ และคุณไม่สามารถวางตำแหน่งใด ๆ ที่เกี่ยวข้องกับคอลัมน์ซึ่งอาจเป็นปัญหา
Eamon Nerbonne

1
ดังนั้นจะดีกว่าเลย์เอาต์แบบโต๊ะน้อยกว่าหรือไม่
ไดนามิก

3
ฉันต้องพูดว่า: ฉันเห็นด้วยกับคุณว่าในกรณีนี้ตารางง่าย ๆ ก็เพียงพอแล้ว ปัญหาคือมีมุมมองทั่วไปที่จะไม่สนใจเค้าโครงทั้งหมดที่มีตาราง
ไดนามิก

3
ปัญหาเกี่ยวกับตารางคือเมื่อหน้าจอถูกปรับขนาดให้มีความกว้างน้อยลง (การออกแบบที่ตอบสนองได้) เซลล์ตารางจะถูกบีบอัดแทนที่จะเรียงซ้อนทับหนึ่งทับด้านบนของหน้าถัดไป วิธีที่สองด้วยการเติมด้านล่าง: 32768px; ระยะขอบล่าง: -32768px; ค่อนข้างน่าทึ่งและทำสิ่งที่ฉันต้องการ ... ขอบคุณสำหรับสิ่งนั้น ... bottom border เป็นปัญหาแม้ว่า ...
Serj Sagan

23

สำหรับผู้ปกครอง:

display: flex;

สำหรับเด็ก:

align-items: stretch;

คุณควรเพิ่มคำนำหน้าตรวจสอบ caniuse


2
จะไม่แนะนำ IE9 ยังคงเป็นสิ่งที่

ขอบคุณสำหรับคำตอบ; มันใช้งานได้ดี! "คุณควรเพิ่มคำนำหน้าตรวจสอบ caniuse" บรรทัดนั้นหมายความว่าอะไร คุณสามารถเพิ่มข้อมูลเพิ่มเติมสำหรับผู้เริ่มต้นได้ไหม?
Md Sifatul Islam

@MdSifatulIslam ไปที่นี่: caniuse.com/#feat=flexboxคุณสามารถดูว่าเบราว์เซอร์บางตัวที่คุณต้องการสนับสนุนต้องการคำนำหน้าคุณลักษณะหรือไม่
Aiphee

18

ฉันพบคำตอบมากมาย แต่อาจเป็นทางออกที่ดีที่สุดสำหรับฉัน

.parent { 
  overflow: hidden; 
}
.parent .floatLeft {
  # your other styles
  float: left;
  margin-bottom: -99999px;
  padding-bottom: 99999px;
}

คุณสามารถตรวจสอบโซลูชันอื่น ๆ ได้ที่นี่http://css-tricks.com/fluid-width-equal-height-columns/


ฉันไม่รู้ว่าทำไมงานนี้ แต่มันแก้ปัญหาของฉันเหมือนมีเสน่ห์ ขอบคุณ
รวม

ทำงานให้ฉันด้วย แม้ว่าจะไม่ใช่วิธีที่สะอาด ขอบคุณ!
Mark Anthony Uy

18
แฮ็คเป็นนรก ฉันไม่แนะนำสิ่งนี้สำหรับแอปพลิเคชันการผลิต
FedericoCapaldo

นี่มันช่างวิเศษจริงๆ ฉันไม่คิดว่ามันจะใช้งานได้จริง
Tom McDonough

11

โปรดตั้งค่า div หลักเป็น div ย่อยoverflow: hidden
แล้วคุณสามารถตั้งค่าจำนวนมากสำหรับการเติมด้านล่าง ตัวอย่างเช่น
padding-bottom: 5000px
จากmargin-bottom: -5000px
นั้น div ลูกทั้งหมดจะเป็นความสูงของผู้ปกครอง
แน่นอนว่าสิ่งนี้จะไม่ทำงานหากคุณพยายามใส่เนื้อหาใน div parent (นอก div อื่น ๆ )

.parent{
    border: 1px solid black;
    overflow: hidden;
    height: auto;
}
.child{
    float: left;
    padding-bottom: 1500px;
    margin-bottom: -1500px;
}
.child1{
    background: red;
    padding-right: 10px;    
}
.child2{
    background: green;
    padding-left: 10px;
}
<div class="parent">
    <div class="child1 child">
        One line text in child1
    </div>
    <div class="child2 child">
        Three line text in child2<br />
        Three line text in child2<br />
        Three line text in child2
    </div>
</div>

ตัวอย่าง: http://jsfiddle.net/Tareqdhk/DAFEC/


ดูเหมือนจะสกปรกเล็กน้อย แต่ได้ผลสำหรับฉัน - ทางออกเดียวสำหรับคำถามนี้ ฉันลองสิ่งนี้โดยใช้ twitter bootstrap
cukabeka

8

พ่อแม่มีความสูงหรือไม่? หากคุณตั้งค่าความสูงของผู้ปกครองเช่นนั้น

div.parent { height: 300px };

จากนั้นคุณสามารถทำให้เด็กยืดได้เต็มความสูงเช่นนี้

div.child-right { height: 100% };

แก้ไข

นี่คือวิธีที่คุณจะใช้ JavaScript


ผู้ปกครองไม่มีความสูงคงที่ มันกำลังขยายตามความสูงซ้ายของเด็ก
Veera

อ่าฉันคิดมากแล้วคุณจะต้องใช้จาวาสคริปท์ฉันจะต่อท้ายในไม่ช้า
Olical

@ ลิงก์ JSFiddle เสียหาย ลบออกหรืออัปเดตคำตอบ ขอบคุณ!
itsmysterybox

1
ตอนนี้ลิงก์ไปยัง js ให้ 404
Chanoch

5

CSS table display เหมาะอย่างยิ่งสำหรับสิ่งนี้:

.parent {
  display: table;
  width: 100%;
}
.parent > div {
  display: table-cell;
}
.child-left {
  background: powderblue;
}
.child-right {
  background: papayawhip;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

คำตอบเดิม (สมมติว่าคอลัมน์ใด ๆ สามารถสูงได้):

คุณกำลังพยายามทำให้ความสูงของผู้ปกครองขึ้นอยู่กับความสูงของเด็กและความสูงของเด็กขึ้นอยู่กับความสูงของผู้ปกครอง จะไม่คำนวณ คอลัมน์ CSS Faux เป็นทางออกที่ดีที่สุด มีมากกว่าหนึ่งวิธีในการทำเช่นนั้น ฉันไม่ควรใช้จาวาสคริปต์


จุดดี. ถ้าความสูงของเด็กขึ้นอยู่กับความสูงของพี่น้องที่สูงที่สุด (ไม่ว่าจะเป็นความสูงของพ่อแม่หรือไม่ก็ตาม) ไม่ใช่พ่อแม่? ฉันเดาว่าไม่สามารถทำได้ใน CSS
mikato

ไม่พี่น้องไม่สามารถส่งผลกระทบต่อความสูงของกันและกัน อย่างไรก็ตามเค้าโครงdisplay: table+ display: table-cellจะสร้างผลลัพธ์ที่ต้องการ
Salman A

เยี่ยมมาก! อย่างไรก็ตามฉันลงเอยด้วยการลองสิ่งนี้และฉันต้องการแยกช่องว่างระหว่าง divs / cells และจบลงด้วยการทำ divs ภายในภายใน table-cell divs เพื่อให้บรรลุผลนั้นแน่นอนว่าสูญเสียความสามารถในการใช้ความสูงแบบเต็ม เพราะ divs ด้านในไม่ใช่ div-cell table - ปัญหาเดียวกันแน่นอน ความคิดใด ๆ ชนิดของระยะห่างระหว่างเซลล์ที่ขาดหายไปในขณะนี้
mikato

อ่ามีระยะห่างระหว่างขอบใน CSS! stackoverflow.com/questions/339923/…ฉันสามารถทำให้ div เหมือนโต๊ะทำงานได้ดีกับการแยกช่องว่างโดยใช้ระยะห่างระหว่างเส้นขอบ ตอนนี้ฉันมีความสามารถในการสร้างเซลล์ตาราง (บล็อกพื้นหลังสี) ใช้ความสูงเต็มของผู้ปกครองหรือไม่โดยการใช้ฉลาดของเซลล์ตาราง divs
mikato

แค่ gotcha ที่ฉันพบเจอ: คุณไม่สามารถใช้กับfloat: stackoverflow.com/questions/20110217/…
Joshua Pinter

4

ฉันเพิ่งทำสิ่งนี้บนเว็บไซต์ของฉันโดยใช้ jQuery รหัสจะคำนวณความสูงของ div ที่สูงที่สุดและตั้ง div อื่น ๆ ให้อยู่ในระดับความสูงเดียวกัน นี่คือเทคนิค:

http://www.broken-links.com/2009/01/20/very-quick-equal-height-columns-in-jquery/

ฉันไม่เชื่อว่าheight:100%จะได้ผลดังนั้นหากคุณไม่ทราบความสูงของ div อย่างชัดเจนฉันไม่คิดว่าจะมีโซลูชัน CSS ที่แท้จริง


1
คุณควรทริกเกอร์สิ่งนี้อย่างน้อยก็พร้อมการปรับขนาดการเปลี่ยนแนวการปรับขนาดแบบอักษร
netAction

4

ฉันใช้มันสำหรับส่วนความคิดเห็น:

.parent {
    display: flex;
    float: left;
    border-top:2px solid black;
    width:635px;
    margin:10px 0px 0px 0px;
    padding:0px 20px 0px 20px;
    background-color: rgba(255,255,255,0.5);
}
    
.child-left {
	align-items: stretch;
	float: left;
	width:135px;
	padding:10px 10px 10px 0px;
	height:inherit;
	border-right:2px solid black;
}

.child-right {
	align-items: stretch;
	float: left;
	width:468px;
	padding:10px;
}
<div class="parent">
  <div class="child-left">Short</div>
  <div class="child-right">Tall<br>Tall</div>
</div>

คุณสามารถลอยเด็กไปทางขวา แต่ในกรณีนี้ฉันคำนวณความกว้างของแต่ละ div อย่างแม่นยำ


1
สิ่งแรกที่อยู่ในใจของฉันคือความสูง: สืบทอดไม่แน่ใจว่าทำไมไม่มีใคร upvoted
Andreas

3

หากคุณทราบถึง bootstrap คุณสามารถทำได้อย่างง่ายดายโดยใช้คุณสมบัติ 'flex' สิ่งที่คุณต้องทำคือส่งคุณสมบัติ css ด้านล่างให้กับ parent div

.homepageSection {
  overflow: hidden;
  height: auto;
  display: flex;
  flex-flow: row;
}

.homepageSectionผู้ปกครองของฉันอยู่ที่ไหน ตอนนี้เพิ่ม div ลูกใน html ของคุณเป็น

<div class="abc col-md-6">
<div class="abc col-md-6">

ที่ abc คือลูกของฉัน div.You สามารถตรวจสอบความเท่าเทียมกันของความสูงใน div ลูกทั้งสองโดยไม่คำนึงถึงชายแดนเพียงแค่ให้ชายแดนกับลูก div


0
<div class="parent" style="height:500px;">
<div class="child-left floatLeft" style="height:100%">
</div>

<div class="child-right floatLeft" style="height:100%">
</div>
</div>

ฉันใช้สไตล์อินไลน์เพื่อให้ความคิด


-2

ฉันเรียนรู้เคล็ดลับเรียบร้อยในการสัมภาษณ์ฝึกงาน คำถามเดิมคือคุณจะมั่นใจได้อย่างไรว่าความสูงของแต่ละองค์ประกอบบนสุดในสามคอลัมน์มีความสูงเท่ากันซึ่งแสดงเนื้อหาทั้งหมดที่มี โดยทั่วไปสร้างองค์ประกอบลูกที่มองไม่เห็นที่แสดงความสูงสูงสุดที่เป็นไปได้

<div class="parent">
    <div class="assert-height invisible">
        <!-- content -->
    </div>
    <div class="shown">
        <!-- content -->
    </div>
</div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.