CSS căn chỉnh một mục đúng với flexbox


212

https://jsfiddle.net/vhem8scs/

Có thể có hai mục thẳng hàng trái và một mục thẳng hàng với flexbox? Các liên kết cho thấy nó rõ ràng hơn. Ví dụ cuối cùng là những gì tôi muốn đạt được.

Trong flexbox tôi có một khối mã. Với float tôi có bốn khối mã. Đó là một lý do tại sao tôi thích flexbox.

HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}

Câu trả lời:


523

Để căn chỉnh một đứa trẻ flex sang bên phải, đặt nó vớimargin-left: auto;

Từ thông số kỹ thuật flex :

Một cách sử dụng lề tự động trong trục chính là tách các mục flex thành các "nhóm" riêng biệt. Ví dụ sau đây cho thấy cách sử dụng điều này để tái tạo một mẫu UI chung - một thanh hành động duy nhất với một số căn chỉnh ở bên trái và những cái khác được căn chỉnh ở bên phải.

.wrap div:last-child {
  margin-left: auto;
}

Cập nhật fiddle

Ghi chú:

Bạn có thể đạt được hiệu ứng tương tự bằng cách đặt flex-grow: 1 trên mục flex giữa (hoặc tốc ký flex:1) sẽ đẩy mục cuối cùng sang bên phải. ( Bản trình diễn )

Tuy nhiên, sự khác biệt rõ ràng là vật phẩm ở giữa trở nên lớn hơn mức cần thiết. Thêm một đường viền cho các mục flex để thấy sự khác biệt.

Bản giới thiệu


Cảm ơn! Tôi đã thử một thứ khác hoạt động trước khi tôi đọc nó. Đó là đặt flex-grow: 1 trên phần tử sẽ đẩy phần tử kia. Nó làm việc như là tốt. Bạn có biết cái nào tốt hơn không và tại sao?
Jens Törnell 8/2/2016

2
Câu trả lời chính xác. Vì vậy, lề không chiếm thêm không gian và flex: 1 thì có. Mát mẻ!
Jens Törnell

4
@ JensTornell, autolề sử dụng khoảng trống trong thùng chứa để phân tách các mục flex. Các flex-grow/ flextài sản có không gian trống rỗng, mang lại cho nó vào mục flex, mở rộng bằng số tiền đó. Như Danield đã đề cập, phương pháp sau làm cho mục flex HAI lớn hơn, mà bạn có thể không muốn.
Michael Benjamin

12
Không phải tất cả các anh hùng mặc áo choàng.
Tom

2
@ user1063287 để căn chỉnh nhiều phần tử ở bên phải, chỉ cần áp dụng lề trái: tự động trên phần tử đầu tiên cần được căn phải. Vì vậy, giả sử bạn muốn 4 yếu tố cuối cùng được căn chỉnh sang phải, bạn sẽ làm điều này: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

Đối với tùy chọn flexbox thuần túy, ngắn gọn, hãy nhóm các mục được căn trái và các mục được căn phải:

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

và sử dụng space-between:

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

Bằng cách này, bạn có thể nhóm nhiều mục ở bên phải (hoặc chỉ một mục).

https://jsfiddle.net/c9mkewwv/3/


Điều này hoạt động, nhưng nếu bạn không thay đổi các thành phần trong mỗi nhóm thành display: inline;hoặc display: inline-block;, thì chúng sẽ được xếp chồng lên nhau thay vì tất cả trong một hàng như flexbox nếu không sẽ có chúng.
Máy cắt DIMM

@TheDIMMReaper Tôi không chắc là tôi thấy vấn đề. Bạn có thể mở rộng?
tràn vào

Tôi chỉ có nghĩa là làm thế nào bạn thay đổi các thẻ ngay lập tức OneTwotừ divs thành spans - nếu chúng vẫn còn display: block;thì chúng sẽ chảy thành các dòng riêng biệt. Vì OP ban đầu có divs, tôi chỉ muốn chỉ ra rằng chỉ cần đặt chúng vào trong một cái khác divsẽ không hoạt động mà không thay đổi hiển thị các thẻ gốc.
Máy cắt DIMM

1
Vâng, vì các yếu tố bây giờ đã xuống cấp, display: flexkhông còn ảnh hưởng đến bố cục của chúng. Nếu bạn muốn sử dụng div, có, inlinehoặc inline-blocksẽ hoạt động. Nhưng rõ ràng, flexvì chúng tôi đang sử dụng nó cho mặc định flex-direction: rowvới div cha. Ví dụ. jsfiddle.net/ynbb5964/2
tràn vào

Cảm ơn, tôi đã thử align-self: flex-end, nhưng tại sao nó không hoạt động?
Anand

3

Để căn chỉnh một số phần tử (headerEuity) ở giữa và phần tử cuối cùng bên phải (headerEnd).

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
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.