ฉันจะส่ง <div> ภายในไปยังด้านล่างของ parent <div> ได้อย่างไร


184

div ภายในรูปภาพ div และรหัสด้านล่างอื่น เพราะจะมีข้อความและรูปภาพของ div div และ div สีแดงจะเป็นองค์ประกอบสุดท้ายของ div parent

ข้อความแสดงแทน

<div style="width: 200px; height: 150px; border: 1px solid black;">
    <div style="width: 100%; height: 50px; border: 1px solid red;">
    </div>
</div>

ดังนั้นรหัสจาก div div มีเหตุผลวางไว้เหนือ div เด็กหรือไม่ รูปภาพและข้อความถูกเพิ่มแบบไดนามิกหรือไม่? คำถามเฉพาะคืออะไร
justkt

คำตอบ:


218

นี่เป็นวิธีหนึ่ง

<div style="position: relative; 
            width: 200px; 
            height: 150px; 
            border: 1px solid black;">

    <div style="position: absolute; 
                bottom: 0; 
                width: 100%; 
                height: 50px; 
                border: 1px solid red;">
    </div>
</div>

แต่เนื่องจาก div ในอยู่ในตำแหน่งแน่นอนคุณจะต้องกังวลเกี่ยวกับเนื้อหาอื่น ๆ ใน div ด้านนอกที่ทับซ้อนกัน (และคุณจะต้องตั้งค่าความสูงคงที่เสมอ)

หากคุณสามารถทำได้ควรทำให้ div ภายในนั้นเป็นวัตถุ DOM สุดท้ายใน div ภายนอกของคุณและตั้งให้เป็น "clear: both"


1
ขอบคุณสำหรับคำอธิบายและการแฮ็ก IE (ถ้าฉันไม่ผิดคุณเพิ่มความกว้าง **: 100% สำหรับการแฮ็ก IE)
uzay95

1
ไม่ความกว้าง: 100% มีอยู่ในต้นฉบับของคุณ - ฉันไม่ได้เพิ่ม
Jon Smock

1
ฉันพยายามทำให้ส่วนที่ฉันเปลี่ยนแปลงเปลี่ยนไป แต่ Markdown ไม่ได้ใช้ในโค้ดบล็อก :-P
Jon Smock

:) จริง ๆ แล้วฉันไม่สามารถเข้าใจวิธีที่เราแฮ็ค IE ด้วยสัญลักษณ์นั่นเป็นเหตุผลว่าทำไมฉันถึงคิดว่ามันคือ IE แฮ็ค :)
uzay95

เพียงจำไว้ว่าถ้าคอนเทนเนอร์หลักลอยวิธีนี้จะไม่ทำงาน
klewis

84

วิธีที่ยืดหยุ่น

HTML:

<div class="parent">
  <div>Images, text, buttons oh my!</div>
  <div>Bottom</div>
</div>

CSS:

.parent {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}

/*  not necessary, just to visualize it */

.parent {
  height: 500px;
  border: 1px solid black;
}


.parent div {
  border: 1px solid red;
}

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

แก้ไข:

ที่มา - คู่มือ Flexbox

การสนับสนุนเบราว์เซอร์สำหรับ flexbox - Caniuse


4
OMG คุณอยู่ที่ไหน [การเขียนโปรแกรมทั้งหมด] ชีวิตของฉัน! ;) ฉันรักที่ว่านี้เป็นเรื่องง่ายมากและไม่ได้ยุ่งกับการวางตำแหน่งและดูเหมือนว่าจะเพียงเกี่ยวกับการทำงานในเบราว์เซอร์ทั้งหมด: caniuse.com/#feat=flexbox นี่ควรเป็นคำตอบและคำตอบที่ยอมรับสำหรับการเขียนโปรแกรมสมัยใหม่
Sablefoste

1
Flexbox มักจะเป็น "วิธีที่ง่าย" ในทุกวันนี้และมีการสนับสนุนเบราว์เซอร์และเอกสารเกือบดี การเพิ่มลิงก์ caniuse ให้กับคำตอบ
Franklin Tarter

80

ทำให้ div นอกposition="relative"และ div ภายในและการตั้งค่ามันposition="absolute"bottom="0"


8
และwidth=100%เช่นกัน
Kevin

6
ใช่มันใช้งานได้ แต่การจัดตำแหน่งแบบสัมบูรณ์แบ่ง "รูปแบบธรรมชาติ" ความสูงของ div ภายในจะไม่ถูกรวมในความสูงของพาเรนต์และเมื่อ div ด้านนอกแคบลงคุณอาจเห็นทับซ้อนกับสิ่งอื่น ๆ ใน div ด้านนอก
Ayush Gupta

15

นี่คือเคล็ดลับ CSS บริสุทธิ์อื่น ๆ ซึ่งไม่ส่งผลกระทบต่อการไหลขององค์ประกอบ

#parent {
  min-height: 100vh; /* set height as you need */
  display: flex;
  flex-direction: column;
  background: grey;
}
.child {
  margin-top: auto;
  background: green;
}
<div id="parent">
  <h1>Positioning with margin</h1>
  <div class="child">
    Content to the bottom
  </div>
</div>


สิ่งที่ยอดเยี่ยมถ้าไม่ต้องการตั้งค่าความสูงบน div หลัก! ขอบคุณ!
Johan Nordli

1
นี่เป็นคำตอบที่ดีที่สุดสำหรับฉัน
Russell Chisholm

ที่ดี! โซลูชันแบบยืดหยุ่นอื่นย้ายเนื้อหาทั้งหมดของฉันออกจากที่นี่อันนี้แยกวัตถุที่คุณต้องการวางที่ด้านล่างจากส่วนที่เหลือ สุดยอดทางออก!
Alejandro Aristizábal

8

คุณอาจไม่ต้องการตำแหน่งแน่นอนเพราะมันแบ่ง reflow: ในบางสถานการณ์เป็นทางออกที่ดีคือการทำให้องค์ประกอบปู่ย่าตายายและองค์ประกอบหลักdisplay:table; display:table-cell;vertical-align:bottom;หลังจากทำเช่นนี้คุณควรจะสามารถให้องค์ประกอบของเด็กdisplay:inline-block;และพวกเขาจะไหลไปทางด้านล่างของผู้ปกครองโดยอัตโนมัติ


8

หมายเหตุ: นี่ไม่ใช่วิธีที่ดีที่สุดที่จะทำได้!

สถานการณ์ : ฉันต้องทำแบบเดียวกันนี้เท่านั้นฉันไม่สามารถเพิ่ม divs พิเศษได้ดังนั้นฉันจึงติดอยู่กับสิ่งที่ฉันมีและแทนที่จะลบ innerHTML และสร้างอีกหนึ่งทาง javascript เหมือน 2 เรนเดอร์ฉันจำเป็นต้องมีเนื้อหาที่ ด้านล่าง (แถบภาพเคลื่อนไหว)

วิธีแก้ปัญหา: เมื่อดูว่าฉันเหนื่อยแค่ไหนมันถึงเป็นเรื่องปกติที่จะคิดถึงวิธีการแบบนี้ แต่ฉันรู้ว่าฉันมีองค์ประกอบ DOM หลักซึ่งความสูงของแท่งเริ่มต้นจาก

แทนที่จะล้อเล่นกับ javascript อีกต่อไปฉันใช้คำตอบ CSS ( ไม่ใช่ความคิดที่ดีเสมอไป )! :)

-moz-transform:rotate(180deg);
-webkit-transform:rotate(180deg);
-ms-transform:rotate(180deg);

ใช่ว่าถูกต้องแทนที่จะวางตำแหน่ง DOM ฉันได้เปิดพาเรนต์กลับหัวลงใน css

สำหรับสถานการณ์ของฉันมันจะทำงาน! เป็นไปได้สำหรับคนอื่นด้วย! ไม่มีเปลวไฟ! :)


1
นี่อาจไม่ใช่วิธีที่ดีที่สุดในการทำ แต่วิธีนี้มันยอดเยี่ยมและสร้างสรรค์มาก ตัวฉันเองได้ต่อสู้กับปัญหานี้มาระยะหนึ่งแล้วในวันนี้ซึ่งเป็นจุดยึดหลักของฉัน: ไม่มีความสูงที่ตั้งไว้ต้องลื่นไหลอย่างสมบูรณ์ (มีตัวอักษรไม่เพียงพอที่จะอธิบายได้ว่าทำไมจอแสดงผล: จัดการทุกสิ่งอย่างสวยงาม; ภาพใน div ยังพลิกเมื่อเกิดเหตุการณ์นี้ขึ้นดังนั้นฉันจึงใช้คลาสกับองค์ประกอบเหล่านั้นเพื่อพลิกกลับ ดูอย่างที่ควรจะเป็นโดยไม่มีความสูง ค่อนข้างแฮ็ก แต่เดี๋ยวก่อนบางครั้งก็ไม่มีทางเลือกที่ดีกว่า ทำได้ดี!
tganyan

4

นี่คือวิธีหลีกเลี่ยง div และตารางที่แน่นอนหากคุณทราบความสูงของผู้ปกครอง:

<div class="parent">
    <div class="child"> <a href="#">Home</a>
    </div>
</div>

CSS:

.parent {
    line-height:80px;
    border: 1px solid black;
}
.child {
    line-height:normal;
    display: inline-block;
    vertical-align:bottom;
    border: 1px solid red;
}

JsFiddle:

ตัวอย่าง


0
<div style="width: 200px; height: 150px; border: 1px solid black;position:relative">
    <div style="width: 100%; height: 50px; border: 1px solid red;position:absolute;bottom:0">
    </div>
</div>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.