Xếp chồng Divs từ dưới lên trên


139

Khi nối divs vào a divvới chiều cao cố định, các div con sẽ xuất hiện từ trên xuống dưới, dán ở viền trên cùng.

┌─────────────────────────┐
 Child Div 1             
 Child Div 2             
                         
                         
                         
└─────────────────────────┘

Bây giờ tôi đang cố gắng hiển thị chúng từ dưới lên trên như thế này (bám vào viền dưới):

┌─────────────────────────┐
                         
                         
                         
 Child Div 1             
 Child Div 2             
└─────────────────────────┘
┌─────────────────────────┐
                         
                         
 Child Div 1             
 Child Div 2             
 Child Div 3             
└─────────────────────────┘
┌───────────────────────┬─┐
 Child Div 2           │▲│
 Child Div 3            
 Child Div 4            
 Child Div 5           │█│
 Child Div 6           │▼│
└───────────────────────┴─┘

Và như vậy ... Tôi hy vọng bạn hiểu ý tôi.

Điều này chỉ đơn giản là có thể thực hiện được với CSS (một cái gì đó như vertical-align: bottom)? Hay tôi phải hack một cái gì đó cùng với JavaScript?

Câu trả lời:


46

Tất cả các câu trả lời bỏ lỡ điểm cuộn thanh câu hỏi của bạn. Và đó là một khó khăn. Nếu bạn chỉ cần điều này để làm việc cho các trình duyệt hiện đại và IE 8+, bạn có thể sử dụng định vị bảng vertical-align:bottommax-height. Xem MDN để biết khả năng tương thích trình duyệt cụ thể.

Bản trình diễn (căn dọc)

.wrapper {
  display: table-cell;
  vertical-align: bottom;
  height: 200px;
}
.content {
  max-height: 200px;
  overflow: auto;
}

html

<div class="wrapper">
  <div class="content">
     <div>row 1</div>
     <div>row 2</div>
     <div>row 3</div>  
  </div>
</div>  

Ngoài ra, tôi nghĩ rằng không thể chỉ với CSS. Bạn có thể làm cho các phần tử dính vào đáy thùng chứa của chúng position:absolute, nhưng nó sẽ đưa chúng ra khỏi dòng chảy. Kết quả là họ sẽ không kéo dài và làm cho container có thể cuộn được.

Demo (vị trí tuyệt đối)

.wrapper {
  position: relative;
  height: 200px;
}
.content {
  position: absolute;
  bottom: 0;
  width: 100%;
}

overflow-y:autocho container
venimus

@venimus - Nó sẽ hiển thị một thanh cuộn bị vô hiệu hóa, vì chiều cao của người chứa không bị ảnh hưởng bởi một position:absoluteđứa trẻ.
gblazex


Tôi đã cập nhật câu trả lời. Bạn có thể giải quyết vấn đề về thanh cuộn trong các trình duyệt hiện đại (IE 7+).
gblazex

1
Cảm ơn câu trả lời của bạn, trình bao bọc thực hiện công việc tốt.
Wulf

38

Một câu trả lời hiện đại hơn cho điều này sẽ được sử dụng flexbox.

Cũng như nhiều tính năng hiện đại khác, chúng sẽ không hoạt động trong các trình duyệt cũ , vì vậy trừ khi bạn sẵn sàng bỏ hỗ trợ cho các trình duyệt từ thời IE8-9, bạn sẽ cần tìm phương pháp khác.

Đây là cách nó được thực hiện:

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

.child {
  /* whatever */
}

Và đó là tất cả những gì bạn cần. Để đọc thêm flexbox, xem MDN .

Đây là một ví dụ về điều này với một số kiểu dáng cơ bản: http://codepen.io/Mest/pen/Gnbfk


Câu trả lời tuyệt vời, cảm ơn bạn rất nhiều! Chưa nghe thấy flexboxes, âm thanh thực sự thú vị!
Wulf

4
Điều này đảo ngược thứ tự nhưng không kéo chúng xuống dưới cùng của cha mẹ.
Edward Anderson

@nilbus bạn có quan tâm đến công phu không? Các thử nghiệm trước đây của tôi và thậm chí ví dụ đính kèm chắc chắn dường như kéo xuống phía dưới của phần tử cha.
Nils Muffersson

Có vẻ như tôi đang nhầm. Có lẽ có một phong cách mâu thuẫn đã khiến nó không hoạt động đối với tôi. Cảm ơn!
Edward Anderson

Tôi tìm thấy trong mã ví dụ, có .parent {vị trí: đã sửa;} làm cho công việc này. Ngoài ra, cuộn trong bản demo không hoạt động trên Chome, bạn cần những thứ sau: .parant {-webkit-flex: 1 1 auto; tràn-y: tự động; min-height: 0px;} và xóa vị trí cố định
Ng Sek Long

1

Chúng ta chỉ cần sử dụng biến đổi CSS để lưu trữ này.

Tôi đã tạo ra một codepen cho nó. https://codepen.io/king-dev/pen/PoPgXEg

.root {
  transform: scaleY(-1);
}
.root > div {
  transform: scaleY(-1);
}

Ý tưởng là lật gốc trước theo chiều ngang và sau đó lật trực tiếp div con.

LƯU Ý: phương pháp trên cũng đảo ngược thứ tự của div. Nếu bạn chỉ đơn giản muốn đặt chúng để bắt đầu từ dưới cùng, bạn có thể làm như sau.

.root {
  display: flex;
  flex-direction: column;
  height: 100px;
  overflow-y: auto;
}
.root > div:first-child {
  margin-top: auto;
}

0

Giữ nó cũ đi ...

Tôi muốn làm điều tương tự trong một #header div vì vậy tôi đã tạo một div trống được gọi #headspacevà đặt nó lên trên cùng ngăn xếp (bên trong #header):

<div id="header">
    <div id="headspace"></div>
    <div id="one">some content</div>
    <div id="two">other content</div>
    <div id="three">more content</div>
</div> <!-- header -->

Sau đó, tôi đã sử dụng một tỷ lệ phần trăm , cho chiều cao của #headspace div vô hình , để đẩy những người khác xuống. Thật dễ dàng để sử dụng các công cụ phát triển / thanh tra của trình duyệt để làm cho điều này vừa phải.

#header {
    width: 100%;
    height: 10rem;
    overflow: auto;
}

#headspace {
    width: 100%;
    height: 42%;    /* Experiment with Inspect (Element) tool */
}

#one, #two, #three {
    /* Insert appropriate dimensions for others... */
}

Điều này sẽ chỉ hoạt động nếu bạn có nội dung cố định. nếu bạn có nội dung động và không biết ai sẽ xuất hiện nhiều div, điều này sẽ không hoạt động.
Sajid Ali

Đó chỉ là một giải pháp nhỏ mà tôi đã sử dụng. Không có đề cập cụ thể về sự cần thiết cho nội dung động - đối với tất cả những gì tôi biết, trang này được làm mới hoàn toàn mỗi khi divđược thêm vào. Vì vậy, tôi đặt nó ở đây trong trường hợp ai đó thực sự muốn một giải pháp tĩnh hơn. Nói cách khác: Tôi nghĩ rằng một phiếu bầu bằng 0 sẽ phù hợp hơn một phiếu bầu tiêu cực.
veganaiZe

Cảm ơn bạn đã dành thời gian và cung cấp một câu trả lời với nội dung tĩnh. Tôi tôn trọng điều đó. Câu hỏi cho thấy rõ nội dung động, Child Div #nơi các div con đang tăng và khi tăng thêm một độ cao nhất định, cần có cuộn hiển thị. vì vậy câu trả lời này không cung cấp giải pháp cho câu hỏi thực tế.
Sajid Ali

0

tôi muốn công việc này với bootstarp như ứng dụng trò chuyện trong đó dòng thông báo từ dưới lên trên

Sau khi đọc các thứ, tôi tìm thấy điều này

tôi có một lớp div giả định bên ngoài .outerDiv và sau đó là UI, liệt kê

.outerDiv {
    height: 361px;
    position: relative;
}
ui.msg-content{
    width: 100%;
    bottom: 0;
    position: absolute;
    max-height: 98%;
    overflow-y: auto;
}

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

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



-5
<div style="height: 500px;">
    <div style="height: 20px; position: absolute; bottom: 120px;">Child Div 1</div>
    <div style="height: 20px; position: absolute; bottom: 100px;">Child Div 2</div>
    <div style="height: 20px; position: absolute; bottom: 80px;">Child Div 3</div>
    <div style="height: 20px; position: absolute; bottom: 60px;">Child Div 4</div>
    <div style="height: 20px; position: absolute; bottom: 40px;">Child Div 5</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.