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


95

ฉันต้องการด้านนอกdivซึ่งเป็นสีดำเพื่อห่อหุ้มมันให้divลอยอยู่ภายใน ฉันไม่ต้องการที่จะใช้style='height: 200pxในdivกับouterdivรหัสตามที่ผมต้องการให้เป็นโดยอัตโนมัติสูงของเนื้อหา (เช่นลอยdivs)

<div id='outerdiv' style='border: 1px solid black;background-color: black;'>
<div style='width=300px;border: red 1px dashed;float: left;'>
    <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
</div>

<div style='width=300px;border: red 1px dashed;float: right;'>
    <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
</div>

จะบรรลุเป้าหมายนี้ได้อย่างไร?

คำตอบ:


169

คุณสามารถตั้งค่าouterdivCSS เป็นสิ่งนี้

#outerdiv {
    overflow: hidden; /* make sure this doesn't cause unexpected behaviour */
}

คุณสามารถทำได้โดยการเพิ่มองค์ประกอบต่อท้ายด้วยclear: both. สามารถเพิ่มได้ตามปกติโดยใช้ JS (ไม่ใช่วิธีแก้ปัญหาที่ดี) หรือด้วย:afterCSS pseudo element (ไม่รองรับอย่างกว้างขวางใน IE รุ่นเก่า)

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

คุณยังสามารถลองลอยคอนเทนเนอร์หลักได้ แต่อาจเป็นไปไม่ได้ / ยากขึ้นอยู่กับการออกแบบของคุณ


37
ฉันหวังว่าฉันจะเข้าใจตรรกะที่ว่าทำไม overflow: hidden ทำงานในกรณีนี้
masteroleary

2
ใช่ฉันหวังว่าไม่ใช่แค่ฉันที่คิดว่านี่เป็นเรื่องที่เข้าใจง่าย อเล็กซ์?
regularmike

3
@masteroleary @regularmike HTML/CSSไม่เคยมีเทคโนโลยี UI ที่ดีดังนั้นสิ่งที่ต่อต้านได้ง่ายในนั้นจึงเป็นเรื่องธรรมดา :)
Yuriy Nakonechnyy

2
@masteroleary ฉันรู้ว่านี่เป็นกระทู้เก่า แต่ฉันเพิ่งพยายามตอบคำถามที่คล้ายกันที่stackoverflow.com/questions/21041297#21041625 - หวังว่ามันจะช่วยได้
xec

1
+1 สำหรับการfloatแก้ปัญหา ทำงานได้ดีกับผู้อื่นที่ล้มเหลวโดยเฉพาะเมื่อจับคู่กับ Twitter Bootstrap
Fizzix

17

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

การแก้ไขคำตอบของ Alex (& Garret's clearfix) ของ "การเพิ่มองค์ประกอบในตอนท้ายด้วย clear: both" คุณสามารถทำได้ดังนี้

    <div id='outerdiv' style='border: 1px solid black; background-color: black;'>
        <div style='width: 300px; border: red 1px dashed; float: left;'>
            <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
        </div>

        <div style='width: 300px; border: red 1px dashed; float: right;'>
            <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
        </div>
        <div style='clear:both;'></div>
    </div>

วิธีนี้ใช้งานได้ (แต่อย่างที่คุณเห็น CSS แบบอินไลน์ไม่ค่อยสวยนัก)


เหตุใดฉันจึงถูกจัดอันดับให้ต่ำลง? มันได้ผลและฉันยอมรับอย่างถูกต้องว่ามันไม่ใช่ทางออกที่ดี
Lycana

1
ฉันไม่แน่ใจฉัน +1 เพื่อให้คุณกลับไปที่ 0 เป็นอย่างน้อย บางทีคุณอาจถูกโหวตลงเพราะคุณไม่ได้แก้ไข CSS ที่ไม่ถูกต้องของเขา ... เช่นการใช้เครื่องหมายเท่ากับเพื่อตั้งค่าคุณสมบัติ CSS ไม่ถูกต้อง
alex

ยุติธรรมเพียงพอ ขอขอบคุณที่ +1 alex ฉันคิดว่ามันเป็นคำพูดของฉันที่ยุติธรรม
Lycana

โซลูชันนี้เป็น IMO ที่ดีกว่า ฉันจะยอมรับคำตอบนี้หากเป็นคำถามของฉัน
ksg91

8

คุณอาจต้องการลองใช้โฟลตแบบปิดเองได้ตามรายละเอียดในhttp://www.sitepoint.com/simple-clearing-of-floats/

ดังนั้นอาจลองอย่างใดอย่างหนึ่งoverflow: auto(โดยปกติจะใช้งานได้) หรือoverflow: hiddenตามที่ alex กล่าว


การทำงานที่ซ่อนอยู่ แต่คุณพูดถูกว่าอัตโนมัติทำงานได้ดีกว่า ขอบคุณ.
Matt Setter

7

ฉันรู้ว่าบางคนจะเกลียดฉัน แต่ฉันพบว่าdisplay:table-cellสามารถช่วยได้ในกรณีนี้

มันสะอาดกว่าจริงๆ


การแสดงผลการใช้ Div ด้านนอก: ตาราง; และภายใน div ใช้ display: table-cell;
Anukul Limpanasil

4

ก่อนอื่นคุณไม่ได้ใช้width=300pxนั่นคือการตั้งค่าแอตทริบิวต์สำหรับแท็กไม่ใช่ CSS ให้ใช้width: 300px;แทน

ฉันขอแนะนำให้ใช้clearfixเทคนิคกับไฟล์#outerdiv. Clearfixเป็นวิธีแก้ปัญหาทั่วไปในการล้าง 2 div แบบลอยดังนั้น div พาเรนต์จะขยายเพื่อรองรับ div 2 ตัว

<div id='outerdiv' class='clearfix' style='width:600px; background-color: black;'>
    <div style='width:300px; float: left;'>
        <p>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx</p>
    </div>

    <div style='width:300px; float: left;'>
        <p>zzzzzzzzzzzzzzzzzzzzzzzzzzzzz</p>
    </div>
</div>

นี่คือตัวอย่างสถานการณ์ของคุณและสิ่งที่ Clearfix ดำเนินการเพื่อแก้ไข


3

ใช้ jQuery:

ตั้งค่า Parent Height = Child offsetHeight

$(document).ready(function() {
    $(parent).css("height", $(child).attr("offsetHeight"));
}

3
Overkill เมื่อคุณทำได้ด้วย CSS เพียงอย่างเดียว
alex

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

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