Як зробити елементи флексокса однакового розміру?


186

Я хочу використовувати flexbox, який містить деяку кількість елементів, що мають однакову ширину. Я помітив, що flexbox розподіляє простір навколо рівномірно, а не сам простір.

Наприклад:

.header {
  display: flex;
}

.item {
  flex-grow: 1;
  text-align: center;
  border: 1px solid black;
}
<div class="header">
  <div class="item">asdfasdfasdfasdfasdfasdf</div>
  <div class="item">z</div>
</div>

Перший пункт набагато більший, ніж другий. Якщо у мене є 3 елементи, 4 елементи або n елементів, я хочу, щоб вони відображалися в одному рядку з рівним простором на один елемент.

Будь-які ідеї?

http://codepen.io/anon/pen/gbJBqM

Відповіді:


287

Встановіть їх так , що їх flex-basisє 0(так що всі елементи мають однакову початкову точку), і дозволити їм рости:

flex: 1 1 0px

Ваш IDE або лінк може згадати про це the unit of measure 'px' is redundant. Якщо ви не залишите його (наприклад flex: 1 1 0:), IE не виведе це правильно. Отже px, потрібна підтримка Internet Explorer, про що йдеться у коментарях @fabb;


65
Слід зазначити , що flexвластивість є скороченим властивістю для flex-grow, flex-shrinkі flex-basisвластивостей. Рекомендується використовувати стенограму над окремими властивостями, оскільки стенограма правильно скидає будь-які не визначені компоненти для забезпечення загального використання. Початкове значення - 0 1 auto.
j08691

3
зауважте, що IE11 ігнорує безроздільні значення флекс
fabb

9
Мені довелося додати, min-width: 0щоб досягти використання дочірніх елементів із переповненим текстом. Дивіться css-tricks.com/flexbox-truncated-text
Івазару

77

Ви можете додати, flex-basis: 100%щоб досягти цього.

Оновлений приклад

.header {
  display: flex;
}

.item {
  flex-basis: 100%;
  text-align: center;
  border: 1px solid black;
}

Для чого це варто, ви також можете використовувати flex: 1для тих же результатів.

Скорочення файлу flex: 1те саме flex: 1 1 0, що еквівалентно:

.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
  text-align: center;
  border: 1px solid black;
}

1
Це неправильно. Значення flex за замовчуванням - flex: 0 1 auto. Що означає, що налаштування flex: 1призведе до flex: 1 1 auto. Це не вийде. Правильна відповідь, flex: 1 1 0як сказано вище, Адам
r.sendecky

17
@ r.sendecky Ні, ти невірний. Як я вже заявив у своїй відповіді, стенограма flex: 1результатів flex: 1 1 0 не flex: 1 1 auto така, як ви заявляєте. Погляньте на офіційну специфікацію W3 у розділі "flex shorthand" : коли flex-basis"пропущено з гнучкої стенограми, її вказане значення є 0", ні auto. Дякуємо за випадкову трансляцію.
Джош Крозьє

2
@ r.sendecky - Ознайомтесь і з цим прикладом, який я створив для візуалізації варіацій.
Джош Крозьє

1
Мате, я не роблю випадкового голосування. Я тестую, перш ніж писати. І я це протестував. Ваша відповідь не працює - просто так. У мене було саме таке питання не так давно з flex: 1і flex-direction: column. Висота дітей була не однаковою, коли інші елементи розміщуються всередині дітей. Єдине, що це зафіксувало - це налаштування flex: 1 1 0. Він досі стоїть з хромом 55.0.2883.87
r.sendecky

4
@JoshCrozier підтвердив, що flex: 1має таку саму поведінку flex: 1 1 0, що і flex: 0 1 autoінша.
Іван Дерст

66

Вам потрібно додати width: 0 щоб стовпці були рівними, якщо вміст елементів зростає.

.item {
  flex: 1 1 0;
  width: 0;
}

5
Це, мабуть, є необхідним, якщо його вміст .itemстає ширшим, ніж це .itemбуло б природно.
Розправи

1
Я думаю, ви маєте на увазі flex: 1 1 0;замість цьогоflex-grow: 1 1 0;
курячий суп

3
фій, посилання розірвано
Боббі Джек

встановлення параметра " flex-basisto" 0відповідає тій самій цілі, що і налаштування widthдо 0.
Стівен

У моєму випадку я використовував графіки, які динамічно регулювали розмір та ширину батьків, необхідних їм для роботи. Я не впевнений, як вони визначали належну ширину, але гнучка основа, безумовно, не працювала на chrome 72 (випущена січень 2019).
Енді Грофф

12

Прийнята відповідь Адама (flex: 1 1 0 ) ідеально підходить для контейнерів флексоксину, ширина яких або фіксована, або визначена предком. Ситуації, коли ви хочете, щоб діти вмістили контейнер.

Однак у вас може виникнути ситуація, коли ви хочете, щоб контейнер вміщав дітей, і діти мають однаковий розмір залежно від найбільшої дитини. Ви можете зробити контейнер flexbox для своїх дітей будь-яким:

  • установка position: absoluteі настройка widthабо right, або
  • помістіть його всередину обгортки з display: inline-block

Для таких контейнерів flexbox прийнята відповідь НЕ працює, діти не розмірів однаково. Я припускаю, що це обмеження flexbox, оскільки він поводиться так само в Chrome, Firefox та Safari.

Рішення - використовувати сітку замість флексбоксу.

Демонстрація: https://codepen.io/brettdonald/pen/oRpORG

<p>Normal scenario — flexbox where the children adjust to fit the container — and the children are made equal size by setting {flex: 1 1 0}</p>

<div id="div0">
  <div>
    Flexbox
  </div>
  <div>
    Width determined by viewport
  </div>
  <div>
    All child elements are equal size with {flex: 1 1 0}
  </div>
</div>

<p>Now we want to have the container fit the children, but still have the children all equally sized, based on the largest child. We can see that {flex: 1 1 0} has no effect.</p>

<div class="wrap-inline-block">
<div id="div1">
  <div>
    Flexbox
  </div>
  <div>
    Inside inline-block
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
</div>

<div id="div2">
  <div>
    Flexbox
  </div>
  <div>
    Absolutely positioned
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>

<br><br><br><br><br><br>
<p>So let's try a grid instead. Aha! That's what we want!</p>

<div class="wrap-inline-block">
<div id="div3">
  <div>
    Grid
  </div>
  <div>
    Inside inline-block
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
</div>

<div id="div4">
  <div>
    Grid
  </div>
  <div>
    Absolutely positioned
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
body {
  margin: 1em;
}

.wrap-inline-block {
  display: inline-block;
}

#div0, #div1, #div2, #div3, #div4 {
  border: 1px solid #888;
  padding: 0.5em;
  text-align: center;
  white-space: nowrap;
}

#div2, #div4 {
  position: absolute;
  left: 1em;
}

#div0>*, #div1>*, #div2>*, #div3>*, #div4>* {
  margin: 0.5em;
  color: white;
  background-color: navy;
  padding: 0.5em;
}

#div0, #div1, #div2 {
  display: flex;
}

#div0>*, #div1>*, #div2>* {
  flex: 1 1 0;
}

#div0 {
  margin-bottom: 1em;
}

#div2 {
  top: 15.5em;
}

#div3, #div4 {
  display: grid;
  grid-template-columns: repeat(3,1fr);
}

#div4 {
  top: 28.5em;
}

0

Я не експерт з флексу, але я потрапив туди, встановивши основу на 50% для двох предметів, з якими я мав справу. Виростіть до 1 і зменшіться до 0.

Вбудований стиль: flex: '1 0 50%',

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.