Son esnek öğeyi kabın sonuna yerleştirin


97

Bu soru, flexbox dahil tam css3 desteğine sahip bir tarayıcıyla ilgilidir.

İçinde bazı öğeler bulunan esnek bir kabım var. Hepsi flex-start için haklı ancak son .end öğenin flex-end'e haklı gösterilmesini istiyorum . Bunu HTML'yi değiştirmeden ve mutlak konumlandırmaya başvurmadan yapmanın iyi bir yolu var mı?

.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
Evet. autoKenar boşluğu resimlerine buradan bakın : stackoverflow.com/a/33856609/3597276
Michael Benjamin

Yanıtlar:


205

Esnek Kutu Yerleşim Modülü - 8.1. Otomatik kenar boşluklarıyla hizalama

Esnek öğelerdeki otomatik kenar boşlukları, blok akışındaki otomatik kenar boşluklarına çok benzer bir etkiye sahiptir:

  • Esnek tabanların ve esnek uzunlukların hesaplamaları sırasında, otomatik kenar boşlukları 0 olarak kabul edilir.

  • İle hizalanabilmektedir önce justify-contentve align-selfherhangi bir pozitif serbest alanının boyutunun otomatik kenar dağıtılır.

Bu nedenle margin-top: auto, diğer öğeler ve son öğe arasındaki boşluğu dağıtmak için kullanabilirsiniz .

Bu, en alttaki son öğeyi konumlandıracaktır.

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

dikey örnek


Aynı şekilde yatay olarak da aynı hizalama için margin-left: autoveya kullanabilirsiniz margin-right: auto.

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

yatay örnek


1
ah mükemmel, bunu kaçırdığıma inanamıyorum! Özellikle margin-auto-to-center-verticalically özelliğini tamamen bildiğim ve her zaman kullandığım için utanç verici
George Mauer

1
@ j08691 Neden çalıştığına dair resmi bir açıklamam yok , ancak margin: 0 autoyatay merkezleme için nasıl kullanabileceğinize benziyor . Flexbox öğeleri marjlara saygı duyar ve bence bu margin: autotemelde öğeyi kardeşler arasında olabildiğince fazla boşluk bırakacak şekilde konumlandıracaktır. Bkz: w3.org/TR/css-flexbox-1/#auto-margins
Josh Crozier

2
@ jo8691 eğer yanılmıyorsam, margin: autoesnek bir öğede ona bu yönde olabildiğince fazla alan yaratmasını söyler.
George Mauer

1
Spesifikasyon diyor ki Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
George Mauer

Flexbox hakkında daha fazla şey öğrenmeye çalışıyorum, bu yüzden bu davranışı tanımlayan bir referans görmek harika olurdu. Özellikle de kasıtlı olduğunu ve bir tuhaflık ya da yan etki olmadığını.
j08691

60

Bu flexbox prensibi aynı zamanda yatay olarak da çalışır

Esnek tabanların ve esnek uzunlukların hesaplamaları sırasında, otomatik kenar boşlukları 0 olarak kabul edilir. Yaslama
içeriği ve kendini hizalama yoluyla hizalamadan önce, herhangi bir pozitif boş alan bu boyuttaki otomatik kenar boşluklarına dağıtılır.

Son Öğe için otomatik bir sol kenar boşluğu ayarlamak işi yapacaktır.

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

Kod Örneği:

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

Codepen Snippet

Bu, Masaüstü Altbilgileri için çok yararlı olabilir.

As Envato şirket logosu ile burada yaptı.

Codepen Snippet


3
Bunun neden işe yaradığından emin değilim, ancak bir projede bana yardımcı oldu.
Louis345

4
Ya tüm öğelerin ortada ve sonuncunun sağ tarafta olmasına ihtiyacım olursa?
Illorian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.