Làm cách nào tôi có thể gửi <div> bên dưới xuống dưới cùng của cha mẹ <div>?


184

Các div bên trong một hình ảnh div và mã dưới đây. Bởi vì sẽ có văn bản và hình ảnh của div cha. Và div đỏ sẽ là yếu tố cuối cùng của div cha.

văn bản thay thế

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

Vì vậy, mã từ div cha được đặt hợp lý trên div con? Là hình ảnh và văn bản được thêm động? Câu hỏi cụ thể là gì?
justkt

Câu trả lời:


216

Đây là một cách

<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>

Nhưng vì div bên trong được định vị tuyệt đối, bạn sẽ luôn phải lo lắng về nội dung khác trong div bên ngoài chồng chéo lên nó (và bạn sẽ luôn phải đặt độ cao cố định).

Nếu bạn có thể làm điều đó, tốt hơn là biến div bên trong đó thành đối tượng DOM cuối cùng trong div bên ngoài của bạn và đặt nó thành "xóa: cả hai".


1
Cảm ơn lời giải thích của bạn và IE Hack (nếu tôi không sai, bạn đã thêm ** chiều rộng: 100% cho IE Hack).
uzay95

1
Không, chiều rộng: 100% đã có trong bản gốc của bạn - Tôi đã không thêm nó.
Jon Smock

1
Tôi đã cố gắng in đậm các phần tôi đã thay đổi, nhưng Markdown không áp dụng bên trong các khối mã :-P
Jon Smock

:) Thật ra tôi không thể hiểu được cách chúng tôi hack IE bằng các biểu tượng, đó là lý do tại sao tôi nghĩ đó là IE Hacking :)
uzay95

Chỉ cần lưu ý rằng nếu container cha nổi, phương pháp này sẽ không hoạt động.
klewis

84

Một cách flexbox.

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;
}

nhập mô tả hình ảnh ở đây

Biên tập:

Nguồn - Hướng dẫn Flexbox

Hỗ trợ trình duyệt cho flexbox - Caniuse


4
OMG, bạn đã ở đâu trong suốt cuộc đời [lập trình] của tôi! ;) Tôi thích việc này rất đơn giản và không gây rối với định vị và dường như nó chỉ hoạt động trong tất cả các trình duyệt: caniuse.com/#feat=flexbox . Đây phải là giải pháp và câu trả lời được chấp nhận cho lập trình hiện đại.
Sablefoste

1
Flexbox thường là "cách dễ dàng" ngày nay và có (gần) tài liệu và hỗ trợ trình duyệt tuyệt vời. Thêm liên kết caniuse vào câu trả lời.
Franklin Tarter

80

Tạo div bên ngoài position="relative"và div bên trong position="absolute"và thiết lập nó bottom="0".


8
width=100%quá
Kevin

6
Có, điều này hoạt động nhưng định vị tuyệt đối phá vỡ "bố cục tự nhiên". Chiều cao của div bên trong sẽ không được bao gồm là chiều cao của cha mẹ và khi div bên ngoài hẹp hơn, bạn có thể thấy sự chồng chéo với các thứ khác trong div bên ngoài.
Ayush Gupta

15

Đây là một thủ thuật CSS thuần túy khác, không ảnh hưởng đến luồng phần tử.

#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>


Tuyệt vời nếu không muốn thiết lập chiều cao trên div cha! Cảm ơn bạn!
Johan Nordli

1
đây là câu trả lời tốt nhất cho tôi
Russell Chisholm

Tuyệt quá! Giải pháp flex khác đã di chuyển tất cả nội dung của tôi ra khỏi vị trí, cái này cô lập đối tượng bạn muốn đặt ở phía dưới so với phần còn lại. Giải pháp tuyệt vời!
Alejandro Aristizábal

8

Bạn có thể không muốn định vị tuyệt đối vì nó phá vỡ dòng chảy lại: trong một số trường hợp, một giải pháp tốt hơn là tạo phần tử ông bà display:table;và phần tử cha display:table-cell;vertical-align:bottom;. Sau khi làm điều này, bạn sẽ có thể cung cấp cho các phần tử con display:inline-block;và chúng sẽ tự động chảy về phía dưới của cha mẹ.


8

Lưu ý: Đây không phải là cách tốt nhất có thể để làm điều đó!

Tình huống : Tôi đã phải làm điều tương tự chỉ tôi không thể thêm bất kỳ div nào, do đó tôi bị mắc kẹt với những gì tôi có và thay vì xóa InternalHTML và tạo một cái khác thông qua javascript gần giống như 2 tôi cần có nội dung tại phía dưới (thanh hoạt hình).

Giải pháp: Cho rằng tôi đã mệt mỏi như thế nào vào thời điểm đó có vẻ bình thường khi nghĩ đến một phương pháp như vậy tuy nhiên tôi biết tôi có một phần tử DOM gốc mà chiều cao của thanh bắt đầu từ đó.

Thay vì làm rối với javascript, tôi đã sử dụng câu trả lời CSS ( KHÔNG LUÔN Ý TƯỞNG TỐT )! :)

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

Đúng vậy, thay vì định vị DOM, tôi đã lật ngược cha mẹ của nó trong css.

Đối với kịch bản của tôi, nó sẽ làm việc! Có thể cho người khác quá! Không có ngọn lửa! :)


1
Đây có thể không phải là cách tốt nhất có thể để làm điều đó nhưng đây là cách tiếp cận khá tuyệt vời, rất sáng tạo. Bản thân tôi đã vật lộn vấn đề này trong một thời gian ngày hôm nay, điểm chính của tôi: không có chiều cao được đặt, phải hoàn toàn trôi chảy (không đủ ký tự để giải thích tại sao hiển thị: bảng không hoạt động). Điều này xử lý mọi thứ đẹp đẽ; hình ảnh bên trong div cũng bị lật khi điều này xảy ra nên tôi chỉ sử dụng lớp trên các phần tử đó để lật chúng lại. Trông chính xác như nó cần, không có chiều cao thiết lập. Một chút hacky nhưng hey, đôi khi không có sự thay thế tốt hơn. Làm tốt!
tganyan

4

Đây là cách để tránh các div và bảng tuyệt đối nếu bạn biết chiều cao của cha mẹ:

<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:

Thí dụ


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>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.