Đặt mục linh hoạt cuối cùng ở cuối vùng chứa


97

Câu hỏi này liên quan đến một trình duyệt có hỗ trợ css3 đầy đủ bao gồm cả flexbox.

Tôi có một hộp đựng linh hoạt với một số mặt hàng trong đó. Tất cả chúng đều hợp lý để flex-start nhưng tôi muốn mục cuối cùng .end hợp lý để flex-end. Có cách nào tốt để thực hiện điều này mà không cần sửa đổi HTML và không cần đến định vị tuyệt đối không?

.container {
  display: flex;
  flex-direction: column;
  outline: 1px solid green;
  min-height: 400px;
  width: 100px;
  justify-content: flex-start;
}
p {
  height: 50px;
  background-color: blue;
  margin: 5px;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="end"></p>
</div>


2
Đúng. Xem các autohình minh họa về lề tại đây: stackoverflow.com/a/33856609/3597276
Michael Benjamin

Câu trả lời:


205

Mô-đun bố trí hộp linh hoạt - 8.1. Căn chỉnh với lề tự động

Lề tự động trên các mục linh hoạt có tác dụng rất giống với lề tự động trong luồng khối:

  • Trong quá trình tính toán cơ sở uốn và độ dài linh hoạt, lề tự động được coi là 0.

  • Trước khi căn chỉnh qua justify-contentalign-self, bất kỳ không gian trống tích cực nào sẽ được phân phối cho các lề tự động trong thứ nguyên đó.

Do đó, bạn có thể sử dụng margin-top: autođể phân phối không gian giữa các phần tử khác và phần tử cuối cùng.

Điều này sẽ đặt phần tử cuối cùng ở dưới cùng.

p:last-of-type {
  margin-top: auto;
}

ví dụ dọc


Tương tự như vậy, bạn cũng có thể sử dụng margin-left: autohoặc margin-right: autocho cùng một căn chỉnh theo chiều ngang.

p:last-of-type {
  margin-left: auto;
}

ví dụ ngang


1
ah hoàn hảo, không thể tin rằng tôi đã bỏ lỡ điều đó! Đặc biệt lúng túng vì tôi hoàn toàn biết về sử dụng-margin-auto-to-trung theo chiều dọc đánh lừa và sử dụng nó mọi lúc
George Mauer

1
@ j08691 Tôi không có lời giải thích chính thức về lý do tại sao nó hoạt động, nhưng nó tương tự như cách bạn có thể sử dụng margin: 0 autođể căn giữa theo chiều ngang. Các mục Flexbox tôn trọng lề và tôi tin rằng điều đó margin: autovề cơ bản sẽ định vị mục đó với càng nhiều khoảng trống giữa các mục càng tốt. Xem: w3.org/TR/css-flexbox-1/#auto-margins
Josh Crozier

2
@ jo8691 nếu tôi không nhầm thì margin: autotrên một mục flex bảo nó tạo càng nhiều không gian càng tốt theo hướng đó.
George Mauer

1
Thông số cho biết Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
George Mauer

Tôi đang cố gắng tìm hiểu thêm về flexbox vì vậy sẽ thật tuyệt khi xem tài liệu tham khảo mô tả hành vi này. Đặc biệt là nó cũng có mục đích và không phải là một điều kỳ quặc hay tác dụng phụ.
j08691

60

Nguyên tắc flexbox này cũng hoạt động theo chiều ngang

Trong quá trình tính toán cơ sở uốn và độ dài linh hoạt, lề tự động được coi là 0.
Trước khi căn chỉnh thông qua justify-content và align-self, mọi không gian trống tích cực sẽ được phân phối cho lề tự động trong thứ nguyên đó.

Đặt lề trái tự động cho Mục cuối cùng sẽ thực hiện công việc.

.last-item {
  margin-left: auto;
}

Ví dụ về mã:

.container {
  display: flex;
  width: 400px;
  outline: 1px solid black;
}

p {
  height: 50px;
  width: 50px;
  margin: 5px;
  background-color: blue;
}

.last-item {
  margin-left: auto;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="last-item"></p>
</div>

Đoạn mã Codepen

Điều này có thể rất hữu ích cho Chân trang trên màn hình.

Như Envato đã làm ở đây với logo của công ty.

Đoạn mã Codepen


3
Không chắc tại sao điều này thực sự hiệu quả, nhưng nó đã giúp tôi trong một dự án.
Louis345

4
Điều gì sẽ xảy ra nếu tôi cần tất cả các mục sẽ ở giữa và mục cuối cùng ở phía bên phải?
Illorian
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.