Flexbox öğelere eşit genişlik vermiyor


368

En fazla 5 öğe ve en az 3 öğe içeren bir flexbox nav deneniyor, ancak genişliği tüm öğeler arasında eşit olarak bölmüyor.

Vaktini boşa harcamak

Bundan sonra modellediğim öğretici http://www.sitepoint.com/responsive-fluid-width-variable-item-navigation-css/

SUKDÖ

* {
  font-size: 16px;
}

.tabs {
  max-width: 1010px;
  width: 100%;
  height: 5rem;
  border-bottom: solid 1px grey;
  margin: 0 0 0 6.5rem;
  display: table;
  table-layout: fixed;
}
.tabs ul {
  margin: 0;
  display: flex;
  flex-direction: row;
}
.tabs ul li {
  flex-grow: 1;
  list-style: none;
  text-align: center;
  font-size: 1.313rem;
  background: blue;
  color: white;
  height: inherit;
  left: auto;
  vertical-align: top;
  text-align: left;
  padding: 20px 20px 20px 70px;
  border-top-left-radius: 20px;
  border: solid 1px blue;
  cursor: pointer;
}
.tabs ul li.active {
  background: white;
  color: blue;
}
.tabs ul li:before {
  content: "";
}
<div class="tabs">
  <ul>
    <li class="active" data-tab="1">Pizza</li>
    <li data-tab="2">Chicken Noodle Soup</li>
    <li data-tab="3">Peanut Butter</li>
    <li data-tab="4">Fish</li>
  </ul>
</div>


1
tablonuza min-genişlik vermek ve vw birimleri ile dolgu koymak yardımcı olabilir: jsfiddle.net/2nY9N/2 esnek büyümeyi bırakın ve sadece flex yapın: 1; diğer 2 özellik için
varsayılan

Yanıtlar:


907

Bağlantı verdiğiniz makalede belirtilmeyen önemli bir şey var flex-basis. Varsayılan flex-basisolarak auto.

Gönderen spec :

Belirtilen esnek temel otomatikse, kullanılan esnek temel esnek öğenin ana boyut özelliğinin değeridir. (Bu, flex öğesini içeriğine göre boyutlandıran otomatik anahtar kelimesi olabilir.)

Her esnek öğenin flex-basisbaşlangıç ​​boyutuna benzeyen bir öğesi vardır . Daha sonra oradan kalan boş alan, flex-growöğeler arasında orantılı olarak (dayalı olarak ) dağıtılır . Bu autotemelde içerik boyutu (veya ile tanımlanan boyut width, vb.). Sonuç olarak, içinde daha büyük metin bulunan öğelere, örneğinizde genel olarak daha fazla yer verilir.

Elemanlarınızın tamamen eşit olmasını istiyorsanız, ayarlayabilirsiniz flex-basis: 0. Bu, esnek temeli 0 olarak ayarlayacak ve daha sonra kalan tüm boşluklar (tüm temeller 0 olduğu için tüm alan olacaktır) orantılı olarak dağıtılacaktır flex-grow.

li {
    flex-grow: 1;
    flex-basis: 0;
    /* ... */
}

Spec bu diyagramı , noktayı göstermek için oldukça iyi bir iş çıkarır.

Ve işte kemanınızla çalışan bir örnek .


3
Bu benim için Safari'de sarılmayı mahvediyor.
Kardan

77
Bu cevapla ilgili harika olan şey, esnek temeli bu örnekle tam anlamıyla tüm internette başka bir yerden daha iyi açıklamanızdır. Size fahri profesörlük konusunda MIT ile iletişime geçeceğim.
dudewad

96
Sadece bu söz flex: 1;kombinasyonu için kısaltmadır flex-grow: 1, flex-basis: 0.
Vadim Ovchinnikov

1
Herkes derinlemesine bilmek isterse, web'deki bu harika makaleye rastladım: css-tricks.com/flex-grow-is-weird
Kumar

Ah adamım, CSS'yi yakaladığımı düşündüğümde her zaman kafama vuruyor.
ibic

15

Kullanarak eşit genişliğe sahip öğeler oluşturmak Flexiçin, çocuğunuza (esnek öğeler) ayarlamanız gerekir:

flex-basis: 25%;
flex-grow: 0;

Satırdaki tüm öğelere% 25 genişlik verecektir. Büyümeyecek ve tek tek gitmeyecekler.


77
Esnekliğin faydasını tamamen azalttığı için bu oldukça garip. Sütun boyutlarınızı sabit kodlayacaksanız, işleri çözmenin daha kolay yolları vardır.
Kloar

3
bu hiç de yanlış değil .. Eğer aynı uzunlukta kutulara sahip olmak ve sıra tamamen dolu olduğunda bozmak istiyorsanız .. bunu kolayca başarabilirsiniz. Min genişliğe ihtiyacınız varsa belki de min genişliğini ayarlayın
Ilario Engler

1
@Kloar Flexbox'ların tek faydası gibi diyorsunuz ... Eşit genişliklere ihtiyacınız olduğunda kesinlikle faydalı olabilirler, örneğin yanıt vermek için. Ayrıca, flexbox'ların kolay olmadığı gibi değil mi?
user2999349
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.