Ortaya ve sağa hizala flexbox öğeleri


150

Ortada olmasını A Bve Chizalanmasını isterim .

Nasıl Dtamamen sağa gidebilirim?

ÖNCE:

görüntü açıklamasını buraya girin

SONRA:

görüntü açıklamasını buraya girin

ul {
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
li:last-child {
  background: #ddd;
  /* magic to throw to the right*/
}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>

https://jsfiddle.net/z44p7bsx/

Yanıtlar:


216

Bu düzeni elde etmek için aşağıda beş seçenek bulunmaktadır:

  • CSS Konumlandırma
  • Görünmez DOM Öğeli Flexbox
  • Görünmez Sözde Öğeli Flexbox
  • Flexbox ile flex: 1
  • CSS Izgara Düzeni

Yöntem 1: CSS Konumlandırma Özellikleri

Uygulamak position: relativeEsnek konteynere .

position: absoluteD öğesine uygulayın .

Şimdi bu ürün kesinlikle esnek kabın içine yerleştirildi.

Daha spesifik olarak, D öğesi belge akışından kaldırılır, ancak en yakın konumlandırılmış atanın sınırları içinde kalır .

CSS ofset özelliklerini kullanın topve rightpozisyona bu öğe taşımak.

Bu yöntemin bir uyarısı , bazı tarayıcıların mutlak şekilde konumlandırılmış esnek bir öğeyi normal akıştan tamamen kaldırmayabileceğidir. Bu, hizalamayı standart olmayan, beklenmedik bir şekilde değiştirir. Daha fazla ayrıntı: Kesinlikle konumlandırılmış esnek öğe, IE11'de normal akıştan çıkarılmaz


Yöntem 2: Esnek Otomatik Kenar Boşlukları ve Görünmez Esnek Öğe (DOM öğesi)

Kenar boşluklarının bir kombinasyonu ileauto ve yeni, görünmez bir esnek öğe düzen elde edilebilir.

Yeni esnek öğe, öğe D ile aynıdır ve karşı uca (sol kenar) yerleştirilir.

Daha spesifik olarak, esnek hizalama boş alanın dağıtımına dayandığından, yeni öğe, üç orta kutuyu yatay olarak ortalanmış tutmak için gerekli bir dengelemedir. Yeni öğe, mevcut D öğesi ile aynı genişlikte olmalıdır, aksi takdirde ortadaki kutular tam olarak ortalanmaz.

Yeni öğe ile görünümden kaldırılır visibility: hidden.

Kısacası:

  • DÖğenin bir kopyasını oluşturun .
  • Listenin başına yerleştirin.
  • Kullanım esnemesine autotutmak için kenar boşluklarını A, Bve Cher ikisi ile, merkezli Delemanları her iki uçtan eşit dengeyi oluşturarak.
  • Uygula visibility: hiddenkopya içinD


Yöntem 3: Esnek Otomatik Kenar Boşlukları ve Görünmez Esnek Öğe (sözde öğe)

Bu yöntem # 2'ye benzer, ancak anlamsal olarak daha temiz ve genişliği Dbilinmelidir.

  • İle aynı genişlikte bir sözde eleman oluşturun D.
  • İle kabın başlangıcına yerleştirin ::before.
  • Esnek kullanım autotutmaya marjları A, Bve Csözde ve birlikte mükemmel merkezli Delemanları her iki ucundan da eşit dengeyi oluşturarak.


Yöntem 4: flex: 1Sol ve sağ öğelere ekleyin

Yukarıdaki Yöntem # 2 veya # 3 ile başlayarak, eşit dengeyi korumak için sol ve sağ öğeler için eşit genişlik konusunda endişelenmek yerine, yalnızca her birini verin flex: 1 . Bu, ikisini de kullanılabilir alanı tüketmeye zorlar ve böylece ortadaki öğeyi ortalar.

Daha sonra display: flexiçeriklerini hizalamak için tek tek öğeler ekleyebilirsiniz .

Bu yöntemi şununla kullanmak hakkında min-heightNOT : Şu anda Chrome, Firefox, Edge ve muhtemelen diğer tarayıcılarda, kısaltma kuralı şunaflex: 1ayrılıyor:

  • flex-grow: 1
  • flex-shrink: 1
  • flex-basis: 0%

Bu yüzde birimi (%) ile flex-basiszaman nedenleri bu yöntem kırmak için min-heightkap üzerinde kullanılır. Bunun nedeni, genel bir kural olarak, çocuklar üzerindeki yüzde yüksekliklerinin, üst öğe üzerinde açık bir heightözellik ayarı gerektirmesidir .

Bu, 1998 yılına kadar uzanan eski bir CSS kuralıdır ( CSS Seviye 2 ) ve birçok tarayıcıda bir dereceye kadar hala yürürlüktedir. Tüm ayrıntılar için buraya ve buraya bakın .

İşte user2651804 tarafından yorumlarda yayınlanan sorunun bir örneği :

Çözüm, yüzde birimini kullanmamaktır. Deneyin pxya da hiç bir şey yapmayın ( bu, belli başlı tarayıcılardan en azından bazılarının herhangi bir nedenle bir yüzde birimi eklemesine rağmen , spesifikasyonun aslında önerdiği şeydir ).


Yöntem # 5: CSS Izgara Düzeni

Bu, en temiz ve en etkili yöntem olabilir. Mutlak konumlandırmaya, sahte öğelere veya diğer bilgisayar korsanlığına gerek yoktur.

Birden çok sütun içeren bir ızgara oluşturun. Ardından, öğelerinizi orta ve son sütunlara yerleştirin. Temel olarak, ilk sütunu boş bırakın.

ul {
  display: grid;
  grid-template-columns: 1fr repeat(3, auto) 1fr;
  grid-column-gap: 5px;
  justify-items: center;
}

li:nth-child(1) { grid-column-start: 2; }
li:nth-child(4) { margin-left: auto; }

/* for demo only */
ul { padding: 0; margin: 0; list-style: none; }
li { padding: 5px; background: #aaa; }
p  { text-align: center; }
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
<p><span>| true center |</span></p>


1
Çok güzel, açıklama için teşekkürler! Sanırım yeni eklenen kod parçacıkları, örnek metnin kısaltılmasından fayda sağlayacaktır çünkü çıktıdan içeriğin ortalandığı / küçük görüntü alanı nedeniyle ortalanmadığı açıkça belli değil. Sadece ben?
user2651804

"Yeni öğe, mevcut D öğesi ile aynı genişlikte olmalıdır, aksi takdirde ortadaki kutular tam olarak ortalanmaz." - aynı genişlikte olması berbat ama CSS ızgarası için şükürler olsun :)
Vucko

Grid tekniğini kullanarak, öğeler ölü merkezde değil, logo öğesinin merkezde ölmesini sağlamanın bir yolu var mı? imgur.com/a/SVg9xsj
J86

Bir cazibe gibi çalışmasına ve en temiz olanına rağmen ızgara çözümüne yeterince aşina değilsiniz. Bir sorum var, ortadaki sütuna üçüne eşit olmayan daha fazla alan nasıl verilir?
Saba Ahang

5

En kolay yol

.box{
  display:flex;
  justify-content:center;
}
.item1{
   flex:1;
   display: flex;
   justify-content: center;
   transform: translateX(10px);/*D element Width[if needed]*/
}
 <div class="box">
   <div class="item1">
      <div>A</div>
      <div>B</div>
      <div>C</div>
   </div>
   <div class="item2">D</div>
 </div>


2

Eğer hizalamak istiyorsanız, boş bir açıklık ekleyebilir ve üç çocuk açıklığını bunlara bölebilirsiniz.


2
ifadenizi desteklemek için kısa bir demo sağlayabilir misiniz?
klewis

2

En basit çözüm, içerik merkezini üst kapsayıcıya yaslamak ve ilk ve son alt öğeye kenar boşluğu-sol otomatik vermek olacaktır.

ul {
  display:flex;
  justify-content:center;
}


.a,.d {
  margin-left:auto;
}
<ul>
  <li class="a">A</li>
  <li>B</li>
  <li>C</li>
  <li class="d">D</li>
</ul>


1

display:gridYaklaşımı kullanarak, tüm ulçocukları aynı hücreye yerleştirebilir ve ardından justify-selfşunları ayarlayabilirsiniz :

ul {
  display: grid;
}

ul > * {
  grid-column-start: 1;
  grid-row-start: 1;
  justify-self:center;
}

ul > *:last-child {
  justify-self: right;
}

/* Make Fancy */
li {
  display:inline-block;
  margin: 1px;
  padding: 5px;
  background: #bbb;
}
<ul>
  <span>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  </span>
  <li>D</li>
</ul>


0

Çok net bir soru. Yardım edemedim ama cevabı birkaç saat kazdıktan sonra gönderdim. Bunu tablolar, masa-hücre, mutlak pozisyonlar, dönüşümler ile çözebilirdik ama bunu sadece flexbox ile yapmamız gerekiyordu :)

.parent {
  display: flex;
  justify-content: flex-end;
}

.center {
  margin: auto;
}

http://codepen.io/rgfx/pen/BLorgd


8
Bu, ortadaki öğeleri tam olarak ortalamıyor çünkü tüm alanı değil, yalnızca kalan alanı etkiliyor. codepen.io/anon/pen/QKGrRk
Michael Benjamin

@Michael_B, senin hakkın bunu fark etmedi, benim hatam. Mutlak pozisyonları kullanmaya geri dönelim :( Belki de yüksek temsilinle bir ödül ayarlamalısın, bu sorunu
tamamen çözmelisin

Hiçbir ödül flexbox modeline yeni bir davranış eklemeyecek, Michael_B tarafından verilen cevap bugün alabileceği kadar iyi ...
Ason

0

Ben genişletilmiş Michael_B 'ın cevabı

.center-flex__2-of-3 > :nth-child(1), .center-flex__2-of-3 > :nth-child(3) {
  flex: 1;
}
.center-flex__2-of-3 > :nth-child(1) {
  justify-content: flex-start;
}
.center-flex__2-of-3 > :nth-child(3) {
  justify-content: flex-end;
}
.center-flex__1-of-2 > :nth-child(1) {
  margin: auto;
}
.center-flex__1-of-2 > :nth-child(2) {
  flex: 1;
  justify-content: flex-end;
}
.center-flex__2-of-2 > :nth-child(1) {
  flex: 1;
  justify-content: flex-start;
}
.center-flex__2-of-2 > :nth-child(2) {
  margin: auto;
}
.center-flex__1-of-2:before, .center-flex__1-of-1:before {
  content: '';
  flex: 1;
}
.center-flex__1-of-1:after, .center-flex__2-of-2:after {
  content: '';
  flex: 1;
}

[class*=center-flex] {
  display: flex;
  list-style: none;
  margin: 0;
  padding: 0;
  border: 10px solid rgba(0, 0, 0, 0.1);
}
[class*=center-flex] > * {
  display: flex;
}
li {
  padding: 3px 5px;
}
2 of 3
<ul class="center-flex__2-of-3">
  <span>
    <li>Accusamus</li>
    <li>Porro</li>
  </span>
  <span>
    <li>Lorem</li>
    <li>Dolor</li>
  </span>
  <span>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
</ul>

<br><br>
1 of 2
<ul class="akex center-flex__1-of-2">
  <span>
    <li>Lorem</li>
    <li>Dolor</li>
  </span>
  <span>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
</ul>

<br><br>
2 of 2
<ul class="akex center-flex__2-of-2">
  <span>
    <li>Porro</li>
    <li>Culpa</li>
    <li>Sit</li>
  </span>
  <span>
    <li>Lorem</li>
    <li>Dolor</li>
  </span>
</ul>

<br><br>
1 of 1
<ul class="center-flex__1-of-1">
  <span>
    <li>Lorem</li>
    <li>Dolor</li>
  </span>
</ul>

Burada bir kodlayıcı olarak SASS'ın yardımıyla


0

Esinlenerek Yöntem # 5: CSS Izgara Düzeni ait @Michal Benjamin 'in çözüm ve ben Tailwind kullandığım için ve bugün itibariyle hala varsayılan olarak tüm ızgara seçeneklerine erişim yok. Bu işe yarıyor gibi görünüyor:

ul {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
}
li:nth-child(1) { justify-content: flex-start; } // OR: margin-right: auto
li:nth-child(3) { justify-content: flex-end; } // OR: margin-left:auto
li: {align-self: center;}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
</ul>

Not: Flex ve grid'i bu şekilde karıştırmanın iyi bir fikir olduğundan emin değilim!


1
grid ve flex'i karıştırmıyorsunuz, justifty-content bir CSS grid özelliği VE flexbox özelliğidir (align-self için aynı)
Temani Afif

-1

Kabul edilen cevap biraz değiştirilebilir çünkü ızgara şablon alanlarını kullanabilir ve bunu sahte unsurlar olmadan yapabilirsiniz.

grid-template-areas '. b c'
grid-template-columns: 1fr 1fr 1fr

-1
ul { 
  padding: 0; 
  margin: 0;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
}
li {
  display: flex;
  margin: 1px;
  padding: 5px;
  background: #aaa;
}
li:last-child {
  background: #ddd;
  position:absolute;
  right:10px;

}
<ul>
  <li>A</li>
  <li>B</li>
  <li>C</li>
  <li>D</li>
</ul>
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.