วิธีการทำให้ div ความสูง 100% ของพาเรนต์ลอย


256

นี่คือ HTML:

<div id="outer">
    <div id="inner"></div>
    Test
</div>

และนี่คือ CSS:

#inner {
  float: left;
  height: 100%;
}

เมื่อตรวจสอบด้วยเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ของ Chrome div ภายในจะมีความสูงถึง 0px

ฉันจะบังคับให้เป็น 100% ของส่วนสูงของผู้ปกครองได้อย่างไร


1
คุณต้องการให้ข้อความใน div ด้านนอก (ไม่ใช่ใน div ภายใน) แต่ div ภายในที่ลอยเป็นความสูงของ div ด้านนอก?
edl

ผลลัพธ์สุดท้ายที่คุณพยายามทำคืออะไร? ฉันเดาว่าความสับสนของฉันอยู่ที่ว่าถ้า div ภายในสูงถึงภายนอกและนอกสูงกว่าตัวอักษรนั่นไม่เหมือนกับการมีข้อความใน div ภายในหรือไม่?
edl

2
@ edl: ใช่มันคือ :) เหตุผลที่ฉันต้องการอย่างนี้คือ div ภายในมีรูปภาพเป็นพื้นหลัง ข้อความต้องอยู่ด้านข้าง ทั้งคู่ต้องอยู่ใน div ภายนอกเนื่องจากมีภาพพื้นหลังด้วย
Nathan Osman

3
นอกจากนี้ดูstackoverflow.com/questions/1122381
Chadwick

2
การเห็นและลองคำตอบสำหรับคำถามนี้เป็นเพียงแค่ความหดหู่ใจ
EternalHour

คำตอบ:


125

สำหรับ#outerความสูงจะขึ้นอยู่กับเนื้อหาและมี#innerความสูงตามนั้นทำให้องค์ประกอบทั้งสองอยู่ในตำแหน่งที่แน่นอน

รายละเอียดเพิ่มเติมสามารถพบได้ในสเปคสำหรับคุณสมบัติ CSS สูงแต่เป็นหลัก#innerจะต้องละเว้น#outerความสูงถ้า#outerสูงก็คือauto, เว้นแต่ #outerอยู่ในตำแหน่งอย่างแน่นอน แล้ว#innerความสูงจะเป็น 0, เว้นแต่ #innerตัวเองอยู่ในตำแหน่งอย่างแน่นอน

<style>
    #outer {
        position:absolute; 
        height:auto; width:200px; 
        border: 1px solid red; 
    }
    #inner {
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer'>
    <div id='inner'>
    </div>
    text
</div>

อย่างไรก็ตาม ... ด้วยการวางตำแหน่ง#innerอย่างแน่นอนการfloatตั้งค่าจะถูกละเว้นดังนั้นคุณจะต้องเลือกความกว้างสำหรับ#innerอย่างชัดเจนและเพิ่มการเติม#outerเพื่อปลอมการตัดข้อความที่ฉันสงสัยว่าคุณต้องการ ตัวอย่างเช่นด้านล่างช่องว่างภายในของ#outerคือความกว้างของ#inner+3 สะดวกสบาย (โดยรวมคือเพื่อให้ได้#innerความสูงถึง 100%) ไม่จำเป็นต้องห่อข้อความไว้ด้านล่าง#innerดังนั้นสิ่งนี้จะดูเหมือน#innerลอยอยู่

<style>
    #outer2{
        padding-left: 23px;
        position:absolute; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2{
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
   }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
    text
</div>

ฉันลบคำตอบก่อนหน้าของฉันเนื่องจากมีข้อสันนิษฐานผิดเกี่ยวกับเป้าหมายของคุณมากเกินไป


118
อืม .. คำถามเกี่ยวกับ div ของ Floated คุณตอบเกี่ยวกับ divs ตำแหน่งอย่างแน่นอน
Mihkel L.

57
ฉันไม่เคยหยุดแปลกใจว่ามันซับซ้อนเพียงใดในการบรรลุสิ่งที่เรียบง่ายอย่างบ้าคลั่งในHTML/CSS:)
Yuriy Nakonechnyy

15
มีวิธีใดในการทำเช่นนี้โดยไม่มีความกว้างการเข้ารหัส ไม่ดีสำหรับภาชนะบรรจุที่ตอบสนอง
Jake Wilson

23
ฉันไม่รู้ว่าทำไมเรื่องนี้จึงเป็นที่ยอมรับและได้รับการสนับสนุนอย่างมาก คำถามเกี่ยวกับ divs ลอยตัวซึ่งเป็นสิ่งที่ทำให้ฉันมาที่นี่จากการค้นหาของฉันและแทนที่จะตอบคำถามเหล่านี้ตำแหน่ง div อย่างแน่นอน
Matt K

2
วิธีทำให้ภาชนะลอยในแนวตั้งพอดีกับภาชนะ โดยไม่ทำให้มันลอยอีกต่อไป! ฮ่าฮ่า ลองดีและใกล้พอที่จะถือว่ามีประโยชน์จริง
Rolf

124

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

display: flex;

คุณควรเพิ่มคำนำหน้าบางส่วนhttp://css-tricks.com/using-flexbox/

แก้ไข: ข้อเสียเปรียบเท่านั้นคือ IE ตามปกติ IE9 ไม่สนับสนุนการดิ้น http://caniuse.com/flexbox

แก้ไข 2: ตามที่ @toddsby สังเกตว่าการจัดเรียงรายการนั้นสำหรับพาเรนต์และค่าเริ่มต้นของมันจะยืดออก หากคุณต้องการค่าที่แตกต่างกันสำหรับเด็กมีคุณสมบัติการจัดตำแหน่งตัวเอง

แก้ไข 3: jsFiddle: https://jsfiddle.net/bv71tms5/2/


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

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

นี่คือคำตอบที่นี่ IE9 กำลังจะออกไปเร็ว ๆ นี้และอาจช่วยได้ด้วยการทำให้ดีและแข็งแกร่ง โซลูชันนี้ดีเรียบง่ายและใช้งานง่าย ... ฉันแฮ็คการรวมโซลูชันทางเลือกเข้าด้วยกัน ;)
jrista

2
ตามที่สเปคล่าสุดสำหรับ flexbox: ดูw3.org/TR/css-flexbox-1/#align-items-property align-items: stretch;ไม่จำเป็นเนื่องจากเป็นค่าเริ่มต้น นอกจากนี้ควรกำหนดให้ผู้ปกครองไม่ใช่เด็ก
toddsby

1
เพิ่มซอในการตอบ @Tigran
Aiphee

77

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

<style>
    #outer2 {
        padding-left: 23px;
        position: relative; 
        height:auto; 
        width:200px; 
        border: 1px solid red; 
    }
    #inner2 {
        left:0;
        position:absolute; 
        height:100%; 
        width:20px; 
        border: 1px solid black; 
    }
</style>

<div id='outer2'>
    <div id='inner2'>
    </div>
</div>

14
เย็นนี้จะน้อยกว่าความต้องการ จำกัด Chadwick ของposition:absolute(ซึ่งอาจยุ่งเกี่ยวกับรูปแบบของเว็บไซต์)
henry

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

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

ขอบคุณมากมาก ผมเคยโพสต์โซลูชั่นที่เฉพาะเจาะจงของฉันเป็นคำตอบสำหรับคำถามอื่นบนดังนั้น: stackoverflow.com/a/31749164/84661
Brian Haak

24

ตราบใดที่คุณไม่จำเป็นต้องสนับสนุน Internet Explorer รุ่นก่อนหน้า IE8 คุณสามารถใช้display: table-cellเพื่อทำสิ่งนี้:

HTML:

<div class="outer">
    <div class="inner">
        <p>Menu or Whatever</p>
    </div>
    <div class="inner">
        <p>Page contents...</p>
    </div>
</div>

CSS:

.inner {
    display: table-cell;
}

สิ่งนี้จะบังคับให้แต่ละองค์ประกอบกับ.innerคลาสครอบครองความสูงเต็มขององค์ประกอบหลัก


แม้ว่าจะใช้งานได้ แต่จะไม่แสดงระยะขอบแม้ว่าคุณจะระบุไว้ก็ตาม ดังนั้นวิธีนี้จะล้มเหลวหากคุณต้องการกำหนดระยะขอบ คุณสามารถกำหนดช่องว่างภายในเป็นวิธีแก้ไขปัญหา แต่คุณจะแก้ไขได้อย่างไรถ้าคุณต้องการระยะขอบ (& ไม่ใช่ช่องว่างภายใน)
Devner

13
ฉันทำอะไรบางอย่างหายไปหรือเปล่า คำถามของคุณขอให้องค์ประกอบที่ลอยมีความสูง 100% เมื่อลอยdisplay: table-cell;องค์ประกอบจะไม่เติมความสูงของคอนเทนเนอร์อีกต่อไปหรือไม่ ฉันต้องคิดถึงบางสิ่งบางอย่างเพราะเป็นคำถามของคุณเอง ...
user56reinstatemonica8

16

ฉันทำตัวอย่างเพื่อแก้ไขปัญหาของคุณ

คุณต้องทำเสื้อคลุมลอยแล้ววางตำแหน่ง Div ของคุณอย่างสมบูรณ์และให้ความสูง 100%

HTML

<div class="container">
    <div class="left">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." </div>
  <div class="right-wrapper">
    <div class="right">"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." </div>
  </div>
  <div class="clear">&nbsp;</div>
</div>

CSS:

.container {
    width: 100%;
    position:relative;
}
.left {
    width: 50%;
    background-color: rgba(0, 0, 255, 0.6);
    float: left;
}
.right-wrapper {
    width: 48%;
    float: left;
}
.right {
    height: 100%;
    position: absolute;
}

คำอธิบาย: . div ที่ถูกต้องอยู่ในตำแหน่งที่แน่นอน นั่นหมายความว่าความกว้างและความสูงและตำแหน่งด้านบนและด้านซ้ายจะถูกคำนวณตามผู้ปกครองคนแรกที่วางตำแหน่งอย่างแน่นอนหรือสัมพันธ์กันเท่านั้นหากคุณสมบัติความกว้างหรือความสูงมีการประกาศอย่างชัดเจนใน CSS; หากไม่ได้ประกาศอย่างชัดเจนคุณสมบัติเหล่านั้นจะถูกคำนวณโดยยึดตามพาเรนต์คอนเทนเนอร์ (.right-wrapper)

ดังนั้นความสูง 100% ของ DIV จะถูกคำนวณตามความสูงสุดท้ายของคอนเทนเนอร์และตำแหน่งสุดท้ายของตำแหน่ง. right จะถูกคำนวณตามคอนเทนเนอร์หลัก


1
นี่เป็นโซลูชันที่มั่นคงสำหรับสถานการณ์ที่คุณสามารถรับประกันได้ว่า.rightเนื้อหาของคอลัมน์นั้นสั้นกว่า.leftเนื้อหาของคอลัมน์ ตัวอย่างเช่นหากคุณใช้สิ่งนี้กับส่วนประกอบที่.leftคอลัมน์มีเนื้อหาที่มีขนาดแตกต่างกันบางส่วนและคอลัมน์ที่ถูกต้องจะแสดงลูกศรไปยังหน้ารายละเอียดแล้วโซลูชันนี้ทำงานได้ดี +1 สำหรับสิ่งนั้น
Zachary Kniebel

15

นี่เป็นวิธีที่ง่ายกว่าในการบรรลุเป้าหมายดังกล่าว:

  1. ตั้งค่าจอแสดงผลสามส่วน (#outer) container: table
  2. และตั้งค่าองค์ประกอบของตัวเอง (#inner) จอแสดงผล: ตารางเซลล์
  3. ลบลอย
  4. ความสำเร็จ
#outer{
    display: table;
}
#inner {
    display: table-cell;
    float: none;
}

ขอบคุณ @Itay ใน Floated div ความสูง 100%


8

หากคุณพร้อมที่จะใช้ jQuery เล็กน้อยคำตอบนั้นง่าย!

$(function() {
    $('.parent').find('.child').css('height', $('.parent').innerHeight());
});

วิธีนี้ใช้งานได้ดีสำหรับการลอยองค์ประกอบเดียวไปยังด้านที่มีความสูง 100% ขององค์ประกอบหลักในขณะที่องค์ประกอบลอยอื่น ๆ ซึ่งปกติจะล้อมรอบจะถูกเก็บไว้ที่ด้านหนึ่ง

หวังว่านี่จะช่วยให้แฟน ๆ jQuery


18
ดูเหมือนว่า overkill จะโยนจาวาสคริปต์ที่ปัญหาเลย์เอาต์นี้
kontur

1
เป็นคนที่ต้องพัฒนาใน IE: ขอบคุณ!
โกง

1
อาจจะ overkill เล็กน้อย แต่นี่เป็นคำตอบที่สวยงามขอบคุณ!
มาร์ติน

1
ฉันยอมรับว่าปัญหาการระบุตำแหน่งทั้งหมดควรได้รับการแก้ไขโดยไม่มี JS
michaeluskov

1
เป็น overkill ที่จะใช้ JS AND jQuery
ViliusL

3

นี่คือตัวอย่างโค้ดสำหรับระบบกริดที่มีความสูงเท่ากัน

#outer{
width: 100%;
margin-top: 1rem;
display: flex;
height:auto;
}

ด้านบนเป็น CSS สำหรับ div ภายนอก

#inner{
width: 20%;
float: left;
border: 1px solid;
}

ด้านบนคือ div ภายใน

หวังว่านี่จะช่วยคุณได้


1

สิ่งนี้ช่วยฉัน

#outer {
    position:relative;
}
#inner {
    position:absolute;
    top:0;
    left:0px;
    right:0px;
    height:100%;
}

เปลี่ยนขวา: และซ้าย: เพื่อตั้งค่าความกว้าง #inner ที่ต้องการ


1

กรณีที่คล้ายกันเมื่อคุณต้องการองค์ประกอบลูกหลายมีความสูงเดียวกันสามารถแก้ไขได้ด้วย flexbox:

https://css-tricks.com/using-flexbox/

ตั้งค่าdisplay: flex;สำหรับผู้ปกครองและflex: 1;องค์ประกอบลูกพวกเขาทั้งหมดจะมีความสูงเท่ากัน


-1

ลอง

#outer{overflow: auto;}

แสดงตัวเลือกเพิ่มเติมใน: คุณจะป้องกันไม่ให้ผู้ปกครองขององค์ประกอบลอยได้อย่างไร?


"การล้น: ซ่อนตัวเลือก" ดูเหมือนว่าจะทำงานได้ดีขึ้นเพราะมีโอกาสที่จะกลิ้งไม่ ...
โรดริโก Barreiro

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