Esnek öğeyi sağa hizalama


681

Kullanmaktan daha fazla "İletişim" sağa hizalamanın daha esnek bir yolu var position: absolutemı?

.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c { position: absolute; right: 0; }
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <!--<div class="b"><a href="#">Some title centered</a></div>-->
    <div class="c"><a href="#">Contact</a></div>
</div>

http://jsfiddle.net/vqDK9/


2
şamandırayı doğru kullanabilirsiniz, ama aynı şekilde ...! En iyi yol, metin hizalamalı bir görüntü tablosu kullanmaktır.
Yohann Tilotti

Tabii, eğer daha iyiyse. Yine de "Kişi" yi sağa hizalamada sorun yaşıyorum: jsfiddle.net/vqDK9/1
Mark Boulder


İşte bunu yapmanın en az iki yolu: stackoverflow.com/a/33856609/3597276
Michael Benjamin

Yanıtlar:


454

Hadi bakalım. Set justify-content: space-betweenesnek ambalaj üzerinde.

.main { 
    display: flex; 
    justify-content: space-between;
  }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { text-align: center; }
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
<!--     <div class="b"><a href="#">Some title centered</a></div> -->
    <div class="c"><a href="#">Contact</a></div>
</div>


291
Veyajustify-content: flex-end
BT

1
.C genişliğini 300 piksele ayarlamayı deneyin. Başlık artık ortalanmıyor. Yani evet, bu soruya cevap veriyor, ancak bu tasarımı kırıyor.
Agamemnus

22
Bunun her zaman beklediğiniz şekilde çalışmadığını unutmayın, örneğin bir .c::aftersözde öğe olduğunda. Benim deneyimime göre, margin-left: auto;gitmenin yolu bu.
Will

13
Veyaflex-flow: row-reverse;
jchook

8
Esnek bir kapta yalnızca bir öğeyi hizalamak istemiyorsanız, bunun doğru bir yanıt olduğunu görmüyorum.
Foxhoundn

1097

Daha esnek bir yaklaşım, bir autosol kenar boşluğu kullanmak olacaktır (esnek öğeler otomatik kenar boşluklarını bir blok biçimlendirme bağlamında kullanıldığından biraz farklı şekilde ele alır).

.c {
    margin-left: auto;
}

Güncellenmiş keman:

.main { display: flex; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }
.b { flex: 1; text-align: center; }
.c {margin-left: auto;}
<h2>With title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>
<h2>Without title</h2>
<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <!--<div class="b"><a href="#">Some title centered</a></div>-->
    <div class="c"><a href="#">Contact</a></div>
</div>
<h1>Problem</h1>
<p>Is there a more flexbox-ish way to right align "Contact" than to use position absolute?</p>


2
Teşekkürler. Kişisel olarak yukarıdaki Yohann Tilotti'nin görüntü tablosu yöntemine tercih eder misiniz? Öyleyse neden?
Mark Boulder

4
@ MarkBoulder: Uyumluluk nedenlerinden dolayı yöntemi daha iyidir, ancak flexbox kullanıyorsanız cevabım daha mantıklı olacaktır.
adrift

4
@ MarkBoulder: Bu durumda ikisi de aynı şeyi başarıyor. Avantaj (tablo yaklaşımı yok esnek öğeleri ile ilişkili diğer özellikleri (ve davranış) sahip olacaktır flex, ordervs).
adrift

3
Elemanları satamıyorsanız ve son üç hakkı söylediğinizde yüzmeniz gerekiyorsa, bu margin-left: auto;stil ile sonuncudan 3. tanesini hedefleyin .
Daniel Sokolowski

2
@ Justin bunu anladı, sarmaya gerek yok - Benim durumumda yapamadım. Çözüm, sadece üç öğenin ilkini hedeflemekti margin-left: auto;.
Daniel Sokolowski

41

Bunun için flexbox kullanmak istiyorsanız, bunu yaparak ( display: flexkapta, flex: 1eşyalarda ve text-align: rightüzerinde .c) şunları yapabilmeniz gerekir :

.main { display: flex; }
.a, .b, .c {
    background: #efefef;
    border: 1px solid #999;
    flex: 1;
}
.b { text-align: center; }
.c { text-align: right; }

... veya alternatif olarak (daha basit), öğelerin karşılanması gerekmiyorsa justify-content: space-between, kapta kullanabilir ve text-alignkuralları tamamen kaldırabilirsiniz :

.main { display: flex; justify-content: space-between; }
.a, .b, .c { background: #efefef; border: 1px solid #999; }

Hızlı bir şekilde yukarıdakileri denemenize izin vermek için Codepen hakkında bir demo .


2
space-betweentam olarak aradığım şeydi, teşekkürler!
Eddie Fletcher

İkinci öneri, beklenen davranış kullanılırken sınırlar kayboluyor mu? codepen.io/oshihirii/pen/RygKRd
user1063287

38

Kalan alanı doldurmak için bir dolgu da kullanabilirsiniz.

<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="filler"></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

.filler{
    flex-grow: 1;
}

Çözümü 3 farklı sürümle güncelledim. Bu, ek bir dolgu elemanı kullanılmasının geçerliliğinin tartışılması nedeniyle. Snip kodunu çalıştırırsanız, tüm çözümlerin farklı şeyler yaptığını görürsünüz. Örneğin, dolgu sınıfının b maddesine ayarlanması, bu maddenin kalan alanı doldurmasını sağlayacaktır. Bunun, tıklanamayan 'ölü' alan olmaması avantajı vardır.

<div class="mainfiller">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="filler"></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<div class="mainfiller">
    <div class="a"><a href="#">Home</a></div>
    <div class="filler b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>



<div class="main">
    <div class="a"><a href="#">Home</a></div>
    <div class="b"><a href="#">Some title centered</a></div>
    <div class="c"><a href="#">Contact</a></div>
</div>

<style>
.main { display: flex; justify-content: space-between; }
.mainfiller{display: flex;}
.filler{flex-grow:1; text-align:center}
.a, .b, .c { background: yellow; border: 1px solid #999; }
</style>


3
Sonunda flexbox'ı anlayan biri
Kokodoko

9
@Kokodoko evet, başka bir öğeyi taşımak için bir anlamsal olmayan html öğesi kullanmak flexbox'ı anlamanın en tepesi ...
Zanshin13

@ Zanshin13 Diğer cevaplar o kadar çok ekstra css yazabilirsiniz ki, aynı zamanda esnek kabı dışarıda bırakabilir ve her şeyi kendiniz
kodlayabilirsiniz

2
@Kokodoko cidden justify-content: space-between"çok" css mi? Daha fazla yoruma gerek yok (ama isterseniz - sohbete hoş geldiniz). Çünkü bu cevap, burada olma hakkına sahiptir olduğu bir çözüm. Ama kesinlikle uygun değil . Idk, belki fark etmedin ama başka cevaplardan gelen css çoğu OP'ler ve cevaplar aslında yazarın css miktarını (biraz) azaltır. Bu cevabın diğerlerinden daha az css'si yoktur (OP's css olmadan çalışmaz - jsfiddle.net/63ma3b56 ). Ancak bir tane daha html öğesi var.
Zanshin13


19

Kadar kolay

.main {
    display: flex;
    flex-direction:row-reverse;
}

12

Stil sayfanıza aşağıdaki CSS sınıfını ekleyin:

.my-spacer {
    flex: 1 1 auto;
}

Soldaki öğe ile sağa hizalamak istediğiniz öğe arasına boş bir öğe yerleştirin:

<span class="my-spacer"></span>


Yalnızca tek bir öğeyi sağa hizalamak istemeyen, ancak bir öğeyi sola hizalamak ve başka bir öğeyi (aynı esnek düzen içinde) sağa hizalamak isteyenler için bu yol!
Sensei James

8

Bir öğenin sola hizalanması (başlık gibi), ancak birden çok öğenin sağa hizalanması (3 resim gibi) gerekiyorsa, şöyle bir şey yaparsınız:

h1 {
   flex-basis: 100%; // forces this element to take up any remaining space
}

img {
   margin: 0 5px; // small margin between images
   height: 50px; // image width will be in relation to height, in case images are large - optional if images are already the proper size
}

İşte neye benzeyecek (yukarıdaki kod parçasına yalnızca ilgili CSS dahil edildi)

resim açıklamasını buraya girin


6

'justify-content: flex-end' fiyat kutusu kabı içinde çalıştı.

.price-box {
    justify-content: flex-end;
}

4

'Justify-content: space-between' hiçbir şey yapmazken flex konteynere 'justify-content: flex-end' eklemenin sorunu çözdüğünü fark ettim.


2

Açısal ve Esnek Düzen kullananlar için, esnek öğe kabında aşağıdakileri kullanın:

<div fxLayout="row" fxLayoutAlign="flex-end">

FxLayoutAlign dokümanlar bakın burada ve tam fxLayout dokümanlar burada .


0

Dayalı Örnek kod cevapTetraDev'in

Sağdaki resimler:

* {
  outline: .4px dashed red;
}

.main {
  display: flex;
  flex-direction: row;
  align-items: center;
}

h1 {
  flex-basis: 100%;
}

img {
  margin: 0 5px;
  height: 30px;
}
<div class="main">
  <h1>Secure Payment</h1>
  <img src="https://i.stack.imgur.com/i65gn.png">
  <img src="https://i.stack.imgur.com/i65gn.png">
</div>

Soldaki resimler:

* {
  outline: .4px dashed red;
}

.main {
  display: flex;
  flex-direction: row;
  align-items: center;
}

h1 {
  flex-basis: 100%;
  text-align: right;
}

img {
  margin: 0 5px;
  height: 30px;
}
<div class="main">
  <img src="https://i.stack.imgur.com/i65gn.png">
  <img src="https://i.stack.imgur.com/i65gn.png">
  <h1>Secure Payment</h1>
</div>

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.