Căn chỉnh một phần tử xuống dưới cùng với flexbox


375

Tôi có một divvới một số trẻ em:

<div class="content">
  <h1>heading 1</h1>
  <h2>heading 2</h2>
  <p>Some more or less text</p>
  <a href="/" class="button">Click me</a>
</div>

và tôi muốn bố trí sau:

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|can have many      |
|rows               |
|                   |
|                   |
|                   | 
|link-button        |
 -------------------

Bất kể có bao nhiêu văn bản trong ptôi muốn .buttonluôn luôn ở phía dưới mà không đưa nó ra khỏi dòng chảy. Tôi đã nghe điều này có thể đạt được với Flexbox nhưng tôi không thể làm cho nó hoạt động được.


7
Chỉ cần cho nó postition: absolute; bottom 0;?
Jonathan

12
@Jonathan trình bao bọc không có chiều cao cố định. Nếu tôi lấy nó ra khỏi luồng, nó sẽ chồng lên văn bản
thay thế kích thước

2
@supersize Q cũ nhưng bạn có thể đã đưa ra trình bao bọc position:relative- điều đó thật ngớ ngẩn vì tôi nghĩ nó tương đối theo mặc định nhưng bạn đã cài đặt nó để chứa định vị tuyệt đối của trẻ. Sau đó bottom:0sẽ phù hợp tuôn ra.
Jacksonkr

Jacksonkr đã đúng, đây là giải pháp TỐT NHẤT, những giải pháp khác quá dài, quá phức tạp hoặc không hoạt động đúng cách
Barbz_YHOOL

2
@Jacksonkr vị trí mặc định của div là statickhông relative.
thay thế

Câu trả lời:


641

Bạn có thể sử dụng lề tự động

Trước khi căn chỉnh thông qua justify-contentalign-self, bất kỳ không gian trống tích cực nào cũng được phân phối cho lề tự động theo chiều đó.

Vì vậy, bạn có thể sử dụng một trong những (hoặc cả hai):

p { margin-bottom: auto; } /* Push following elements to the bottom */
a { margin-top: auto; } /* Push it and following elements to the bottom */

Ngoài ra, bạn có thể tạo phần tử trước khi atăng để lấp đầy không gian có sẵn:

p { flex-grow: 1; } /* Grow to fill available space */


2
Đối với tôi, điều này hoạt động trong Chrome, nhưng không phải trong Safari trên iOS 10.2. Bất cứ ai có thể xác nhận?
Matthew

@Oriol Tôi thích cách tiếp cận này, nhưng không phải là tác dụng phụ của việc mất lợi nhuận sụp đổ, bạn sẽ làm gì về điều này?
Neil

11
flex-grow làm việc cho tôi. Đây là cách tôi đã làmhtml { height: 100%; } body { min-height: 100%; display: flex; flex-direction: column; } #site-content { flex: 1; }
protoEveachion

2
Cũng là một lưu ý phụ, hãy nhớ height: 100%về yếu tố cha mẹ mà bạn đang cố gắng đẩy thứ gì đó xuống đáymargin-top: auto;
skolind

1
"bất kỳ không gian trống tích cực nào cũng được phân phối cho lề tự động theo chiều đó." Đó là những điều nhỏ bé như thế này rất thanh lịch, đối với tôi giải pháp này là 2 dòng mã dựa trên câu trả lời của bạn. cảm ơn bạn :)
danjah

146

Bạn có thể sử dụng display: flex để đặt một phần tử xuống phía dưới, nhưng tôi không nghĩ bạn muốn sử dụng flex trong trường hợp này, vì nó sẽ ảnh hưởng đến tất cả các phần tử của bạn.

Để đặt một phần tử xuống đáy bằng flex, hãy thử điều này:

.container {
  display: flex;
}

.button {
  align-self: flex-end;
}

Đặt cược tốt nhất của bạn là đặt vị trí: tuyệt đối với nút và đặt thành bottom: 0hoặc bạn có thể đặt nút bên ngoài thùng chứa và sử dụng âm transform: translateY(-100%)để đưa nó vào thùng chứa như thế này:

.content {
    height: 400px;
    background: #000;
    color: #fff;
}
.button {
    transform: translateY(-100%);
    display: inline-block;
}

Kiểm tra JSFiddle này


6
nếu bạn muốn nó ở dưới cùng, hãy đảm bảo đặt hướng uốn thành cột.
Viliami

3
Nếu tôi không thể cung cấp chiều cao thì sao?
Đánh dấu

Những gì làm việc cho tôi chỉ là: `` `. nội dung {hiển thị: flex; hướng flex: cột; justify-content: flex-end; } <div class = "content"> <a class="bottom"> Thứ gì đó </a> </ div> `` `
gsalgadotoledo

84

Giải pháp align-self: flex-end;không hiệu quả với tôi nhưng giải pháp này đã làm trong trường hợp bạn muốn sử dụng flex:

Kết quả

 -------------------
|heading 1          |
|heading 2          | 
|paragraph text     |
|                   |
|                   |
|                   | 
|link button        |
 -------------------

Lưu ý: Khi "chạy đoạn mã", bạn phải cuộn xuống để xem liên kết ở phía dưới.

.content {
  display: flex;
  justify-content: space-between;
  flex-direction: column;
  height: 300px;
}

.content .upper {
  justify-content: normal;
}

/* Just to show container boundaries */
.content .upper, .content .bottom, .content .upper > * {
  border: 1px solid #ccc;
}
<div class="content">
  <div class="upper">
	  <h1>heading 1</h1>
	  <h2>heading 2</h2>
	  <p>paragraph text</p>
  </div>

  <div class="bottom">
	  <a href="/" class="button">link button</a>
  </div>
</div>


1
nội dung là cột chứa nó chứa 2 container khác, với nội dung justify: khoảng trắng giữa; bạn nói với flexbox để đẩy container cách xa nhau hết mức có thể (trong trường hợp này bị giới hạn bởi chiều cao của thùng chứa nội dung)
ConquerorsHaki

Đó không phải là kết quả thực sự, nó sẽ có khoảng cách giữa mỗi mục (do đó là tên)
Barbz_YHOOL

1
@Barbz_YHOOL Không, nó hoạt động nếu bạn tăng chiều cao vùng chứa (xem ví dụ cập nhật)
Timo

1
Sau khi tìm kiếm rất nhiều, điều này là hoàn hảo! Cảm ơn bạn.
Rudy

1
Với một chút sửa đổi, câu trả lời này đã làm việc hoàn hảo với tôi, cảm ơn bạn
RealMJDev

2

Không chắc chắn về flexbox nhưng bạn có thể sử dụng thuộc tính vị trí.

thiết lập div position: relative phần tử cha và con có thể là một <p>hoặc <h1>vv .. set position: absolutebottom: 0.

Thí dụ:

index.html

<div class="parent">
  <p>Child</p>
</div>

style.css

.parent {
  background: gray;
  width: 10%;
  height: 100px;    
  position: relative;
}
p {
  position: absolute;
  bottom: 0;
}

Bút mã ở đây.


1
position:fixedsẽ không hoạt động bởi vì sau đó nó sẽ không liên quan đến container. Nó có nghĩa là position:absolutegì?
Cảm biến

1
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
rollstuhlfahrer

1
Cập nhật câu trả lời.
Sanjay Shr

1

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

<section style="display:flex; flex-wrap:wrap;">
    <div style="display:flex; flex-direction:column; flex:1;">
        <button style="margin-top: auto;"/>
    </div>
    <div style="display:flex; flex-direction:column; flex:1;">
        <button style="margin-top: auto;"/>
    </div>
</section>

Bản trình diễn: https://codepen.io/ferittuncer/pen/YzygpWX


0

Khi đặt màn hình của bạn thành flex , bạn chỉ cần sử dụng thuộc flextính để đánh dấu nội dung nào có thể phát triển và nội dung nào không thể.

Tài sản linh hoạt

div.content {
 height: 300px;
 display: flex;
 flex-direction: column;
}

div.up {
  flex: 1;
}

div.down {
  flex: none;
}
<div class="content">
  <div class="up">
    <h1>heading 1</h1>
    <h2>heading 2</h2>
    <p>Some more or less text</p>
  </div>

  <div class="down">
    <a href="/" class="button">Click me</a>
  </div>
</div>


-1

Thử cái này

.content {
      display: flex;
      flex-direction: column;
      height: 250px;
      width: 200px;
      border: solid;
      word-wrap: break-word;
    }

   .content h1 , .content h2 {
     margin-bottom: 0px;
    }

   .content p {
     flex: 1;
    }
   <div class="content">
  <h1>heading 1</h1>
  <h2>heading 2</h2>
  <p>Some more or less text</p>
  <a href="/" class="button">Click me</a>
</div>


-1

Tôi chỉ tìm thấy một giải pháp cho việc này.

Đối với những người không hài lòng với câu trả lời đã cho, có thể thử phương pháp này với flexbox

CSS

    .myFlexContainer {
        display: flex;
        width: 100%;
    }

    .myFlexChild {
        width: 100%;
        display: flex;

        /* 
         * set this property if this is set to column by other css class 
         *  that is used by your target element 
         */
        flex-direction: row;

        /* 
         * necessary for our goal 
         */
        flex-wrap: wrap;
        height: 500px;
    }

    /* the element you want to put at the bottom */
    .myTargetElement {
        /*
         * will not work unless flex-wrap is set to wrap and 
         * flex-direction is set to row
         */
        align-self: flex-end;
    }

HTML

    <div class="myFlexContainer">
        <div class="myFlexChild">
            <p>this is just sample</p>
            <a class="myTargetElement" href="#">set this to bottom</a>
        </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.