CSS bir öğeyi sağa flexbox ile hizala


212

https://jsfiddle.net/vhem8scs/

İki öğenin sola, bir öğenin sağa flexbox ile hizalanması mümkün müdür? Bağlantı daha net gösterir. Son örnek, elde etmek istediğim şey.

Flexbox'ta bir kod bloğum var. Şamandıra ile dört kod bloğum var. Flexbox'ı tercih etmemin bir nedeni bu.

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;
}

Yanıtlar:


524

Bir esnek çocuğu sağa hizalamak içinmargin-left: auto;

Flex spec itibaren :

Ana eksende otomatik kenar boşluklarının bir kullanımı, esnek öğeleri farklı "gruplara" ayırmaktır. Aşağıdaki örnekte, ortak bir kullanıcı arabirimi deseni oluşturmak için bunun nasıl kullanılacağı gösterilmektedir - bazıları solda hizalanmış, diğerleri sağda hizalanmış tek bir işlem çubuğu.

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

Güncellenmiş keman

Not:

Esnek büyümeyi ayarlayarak benzer bir etki elde edebilirsiniz: 1 orta esnek öğede (veya stenoda flex:1) son öğeyi sağa doğru iter. ( Demo )

Ancak bariz fark, orta öğenin olması gerekenden daha büyük hale gelmesidir. Farkı görmek için esnek öğelere bir kenarlık ekleyin.

gösteri


Teşekkürler! Bunu okumadan önce işe yarayan başka bir şey denedim. Flex-grow'ı ayarlamaktı: 1 diğerini itmesi gereken eleman üzerinde. O da işe yaradı. Hangisinin daha iyi ve neden olduğunu biliyor musunuz?
Jens Törnell

2
Mükemmel cevap. Böylece marj fazladan yer kaplamaz ve esneklik: 1 yapar. Güzel!
Jens Törnell

4
@ JensTörnell, automarj esnek öğeleri ayırmak için kaptaki boş alanı kullanır. flex-grow/ flexMülk, o boş alanı alır miktarı kadar genişler esnek öğeye için veriyor. Danield tarafından belirtildiği gibi, ikinci yöntem esnek öğeyi İKİ daha büyük yapar, istemeyebilirsiniz.
Michael Benjamin

12
Her kahraman pelerin giymez.
Tom

2
@ user1063287 birden çok öğeyi sağa hizalamak için sadece sol kenar boşluğu uygulayın: sağa hizalanması gereken ilk öğeye otomatik. Diyelim ki son 4 öğenin sağa hizalanmasını istiyorsunuz, bunu yaparsınız: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

Kısa, saf bir flexbox seçeneği için, sola hizalanmış öğeleri ve sağa hizalanmış öğeleri gruplandırın:

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

ve kullanın space-between:

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

Bu şekilde birden fazla öğeyi sağa (veya yalnızca bir tanesine) gruplayabilirsiniz.

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


Bu işe yarar, ancak her grup içindeki öğeleri değiştirmezseniz display: inline;ya da display: inline-block;, o zaman flexbox gibi bir satırda yığılmış olurlar, aksi takdirde onlara sahip olurlar.
DIMM Reaper

@TheDIMMReaper Sorunu gördüğümden emin değilim. Genişleyebilir misiniz?
17'de akış

Sadece etiketleri hemen sarma nasıl değiştiğini anlama Oneve Twogelen divs'ye spanhala olsaydı - s display: block;o zaman ayrı hatlara akacaktır. OP'nin başlangıçta sahip olduğu için div, sadece başka bir divetiketin içine yerleştirmenin orijinal etiketlerin görüntüsünü değiştirmeden işe yaramayacağını belirtmek istedim .
DIMM Reaper

1
Evet, öğeler artık bir seviyenin altına düştüğü için display: flexartık düzenlerini etkilemiyor. Div kullanmak istiyorsanız, evet, inlineya inline-blockda işe yarayacaktır. Ama aynı zamanda, tabii ki, üst div ile zaten flexvarsayılan için kullandığımız için flex-direction: row. ex. jsfiddle.net/ynbb5964/2
akış

Teşekkürler, align-self'i denedim: flex-end, ama neden çalışmıyor?
Anand

3

Ortadaki ve son öğedeki bazı öğeleri (headerElement) sağa (headerEnd) hizalamak için.

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